Skip to content

Commit 1c0f594

Browse files
authored
Merge pull request #230 from phracek/issue_222
Fix issue with VOLUME and add VOLUME dockerlint tests
2 parents d85eebf + 5dd47fa commit 1c0f594

File tree

4 files changed

+108
-8
lines changed

4 files changed

+108
-8
lines changed

examples/mtf-linters/Makefile

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
.PHONY: check-linters
1+
.PHONY: check-linters check-from check-volume
2+
3+
check-linters: check-from check-volume
4+
5+
check-from:
6+
pytest test_from.py
7+
8+
check-volume:
9+
pytest test_volume.py
210

3-
check-linters:
4-
pytest test_linters.py

examples/mtf-linters/test_linters.py renamed to examples/mtf-linters/test_from.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515
#
1616
from __future__ import print_function
17-
from moduleframework.dockerlinter import DockerfileLinter
18-
import pytest
17+
1918
import os
2019
import tempfile
20+
21+
from moduleframework.dockerlinter import DockerfileLinter
22+
23+
2124
def save_docker_file(content):
2225
temp = tempfile.NamedTemporaryFile(delete=False)
2326
try:
@@ -34,30 +37,35 @@ def prepare_linter(content):
3437
dfl = DockerfileLinter()
3538
return dfl
3639

40+
3741
def test_docker_from_etcd():
3842
Dockerfile_FROM = """FROM registry.fedoraproject.org/f26/etcd"""
3943
dfl = prepare_linter(Dockerfile_FROM)
4044
assert dfl.check_from_directive_is_valid()
4145
os.unlink(os.environ.get('DOCKERFILE'))
4246

47+
4348
def test_docker_from_nginx():
4449
Dockerfile_FROM = """FROM registry.access.redhat.com/rhscl/nginx-18-rhel7"""
4550
dfl = prepare_linter(Dockerfile_FROM)
4651
assert dfl.check_from_directive_is_valid()
4752
os.unlink(os.environ.get('DOCKERFILE'))
4853

54+
4955
def test_docker_from_dash():
5056
Dockerfile_FROM = """FROM rhel7:7.5-175"""
5157
dfl = prepare_linter(Dockerfile_FROM)
5258
assert dfl.check_from_directive_is_valid()
5359
os.unlink(os.environ.get('DOCKERFILE'))
5460

61+
5562
def test_docker_from_first():
5663
Dockerfile_FROM = """FROM rhel7:7.5-175"""
5764
dfl = prepare_linter(Dockerfile_FROM)
5865
assert dfl.check_from_is_first()
5966
os.unlink(os.environ.get('DOCKERFILE'))
6067

68+
6169
def test_docker_from_is_not_first():
6270
Dockerfile_FROM = """LABEL name=test\nFROM rhel7:7.5-175"""
6371
dfl = prepare_linter(Dockerfile_FROM)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# This program is free software: you can redistribute it and/or modify
4+
# it under the terms of the GNU General Public License as published by
5+
# the Free Software Foundation, either version 3 of the License, or
6+
# (at your option) any later version.
7+
#
8+
# This program is distributed in the hope that it will be useful,
9+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
# GNU General Public License for more details.
12+
#
13+
# You should have received a copy of the GNU General Public License
14+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
#
16+
from __future__ import print_function
17+
18+
import os
19+
import tempfile
20+
21+
from moduleframework.dockerlinter import DockerfileLinter
22+
23+
24+
def save_docker_file(content):
25+
temp = tempfile.NamedTemporaryFile(delete=False)
26+
try:
27+
temp.write(content)
28+
temp.seek(0)
29+
finally:
30+
temp.close()
31+
return temp.name
32+
33+
34+
def prepare_linter(content):
35+
filename = save_docker_file(content)
36+
os.environ['DOCKERFILE'] = filename
37+
dfl = DockerfileLinter()
38+
return dfl
39+
40+
41+
def test_docker_volume_more():
42+
volume = """VOLUME ["/etc", "/bin", "/var"]"""
43+
dfl = prepare_linter(volume)
44+
assert ["/etc", "/bin", "/var"] == dfl.get_docker_volume()
45+
os.unlink(os.environ.get('DOCKERFILE'))
46+
47+
48+
def test_docker_volume_one_field():
49+
volume = """VOLUME ["/etc"]"""
50+
dfl = prepare_linter(volume)
51+
assert ["/etc"] == dfl.get_docker_volume()
52+
os.unlink(os.environ.get('DOCKERFILE'))
53+
54+
55+
def test_docker_volume_one_string():
56+
volume = """VOLUME /etc"""
57+
dfl = prepare_linter(volume)
58+
assert ["/etc"] == dfl.get_docker_volume()
59+
os.unlink(os.environ.get('DOCKERFILE'))
60+
61+
62+
def test_docker_volume_one_string_quote():
63+
volume = """VOLUME \"/etc\""""
64+
dfl = prepare_linter(volume)
65+
assert ["/etc"] == dfl.get_docker_volume()
66+
os.unlink(os.environ.get('DOCKERFILE'))
67+
68+
69+
def test_docker_volume_one_string_single_quote():
70+
volume = """VOLUME '/etc'"""
71+
dfl = prepare_linter(volume)
72+
assert ["/etc"] == dfl.get_docker_volume()
73+
os.unlink(os.environ.get('DOCKERFILE'))

moduleframework/dockerlinter.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ class DockerfileLinter(object):
3333

3434
dockerfile = None
3535
oc_template = None
36-
dfp_structure = {}
37-
docker_dict = {}
3836

3937
def __init__(self):
38+
self.dfp_structure = {}
39+
self.docker_dict = {}
4040
dockerfile = common.get_docker_file()
4141
if dockerfile:
4242
self.dockerfile = dockerfile
@@ -60,7 +60,13 @@ def _get_env(self, value):
6060

6161
def _get_volume(self, value):
6262
"""Function evaluates a value and returns as string."""
63-
return get_string(value)
63+
try:
64+
value = ast.literal_eval(value)
65+
if isinstance(value, str):
66+
return [value]
67+
except SyntaxError:
68+
return [value]
69+
return value
6470

6571
def _get_label(self, val):
6672
"""
@@ -150,6 +156,13 @@ def get_docker_expose(self):
150156
ports_list.append(int(p))
151157
return ports_list
152158

159+
def get_docker_volume(self):
160+
"""
161+
Function return docker EXPOSE directives
162+
:return: list of PORTS
163+
"""
164+
return self.docker_dict.get(VOLUME, [])
165+
153166
def get_docker_labels(self):
154167
"""
155168
Function returns docker labels

0 commit comments

Comments
 (0)