11
11
import inspect
12
12
import copy
13
13
14
+
14
15
def _invoke_other_environment_hooks (* args ):
15
16
# we need a copy of current frame becase it will change
16
17
frame_globals = copy .copy (inspect .currentframe ().f_globals )
@@ -47,89 +48,109 @@ def open_file(path):
47
48
ret_file = open (value ['dest' ])
48
49
return ret_file
49
50
except KeyError :
50
- print ("ansible output: {0}" .format (ret ))
51
+ print ("ansible output: {0}" .format (ret ))
51
52
raise Exception (value ['msg' ])
52
53
context .open_file = open_file
53
54
54
55
def run (command ):
55
- logging .debug ("Running '%s'" % command )
56
+ if '{{' in command :
57
+ command = command .replace ("{{" , "{{ '{{" ).replace ("}}" , "}}' }}" )
58
+ logging .info ("Running '%s'" % command )
56
59
context .result = ansible .runner .Runner (
57
- module_name = ' shell' ,
60
+ module_name = " shell" ,
58
61
inventory = inventory ,
59
62
module_args = "{0} chdir={1}" .format (command , remote_dir )
60
63
).run ()
61
- passed = True
62
64
# dark means not responding
63
65
if context .result ['dark' ]:
64
- passed = False
65
- print ("dark" )
66
66
print (context .result )
67
67
if not context .result ['contacted' ]:
68
- passed = False
69
- print ("no contacted hosts" )
68
+ print ("no contacted hosts" )
70
69
for host , values in context .result ['contacted' ].iteritems ():
71
70
if values ['rc' ] != 0 :
72
71
print ("On {0} returned {1}" .format (host , values ['rc' ]))
73
72
print ("stderr: {0}" .format (values ['stderr' ]))
74
73
print ("cmd: {0}" .format (values ['cmd' ]))
75
74
assert False
75
+ logging .info ('stdout:\\ n%s' % values ['stdout' ])
76
+ if values ['stderr' ]:
77
+ logging .info ('stderr\\ n:%s' % values ['stderr' ])
76
78
return values ['stdout' ]
77
79
context .run = run
78
80
79
- # copy dockerfile
80
- dockerfile = context .config .userdata ['DOCKERFILE' ]
81
- dockerfile_dir = os .path .dirname (dockerfile )
82
- # create remote directory
83
- ansible .runner .Runner (
84
- module_name = 'file' ,
85
- inventory = inventory ,
86
- module_args = 'dest={0} state=directory' .format (remote_dir )
87
- ).run ()
88
- # copy dockerfile
89
- ansible .runner .Runner (
90
- module_name = 'copy' ,
91
- inventory = inventory ,
92
- module_args = 'src={0} dest={1}' .format (dockerfile , remote_dir )
93
- ).run ()
94
- # copy files from dockerfile
95
- f_in = open (dockerfile )
96
- for path in re .findall ('(?:ADD|COPY) ([^ ]+) ' , f_in .read ()):
97
- for glob_path in glob .glob (os .path .join (dockerfile_dir ,path )):
98
- # TODO Is there a nicer way to keep permissions?
81
+ def copy_dockerfile ():
82
+
83
+ try :
84
+ # copy dockerfile
85
+ dockerfile = context .config .userdata ['DOCKERFILE' ]
86
+ dockerfile_dir = os .path .dirname (dockerfile )
87
+ # create remote directory
88
+ ansible .runner .Runner (
89
+ module_name = 'file' ,
90
+ inventory = inventory ,
91
+ module_args = 'dest={0} state=directory' .format (remote_dir )
92
+ ).run ()
93
+ # copy dockerfile
99
94
ansible .runner .Runner (
100
95
module_name = 'copy' ,
101
96
inventory = inventory ,
102
- module_args = 'src={0} dest={1} directory_mode mode={2}' .format (glob_path , remote_dir ,
103
- oct (stat .S_IMODE (os .stat (glob_path ).st_mode )))
104
- ).run ()
97
+ module_args = 'src={0} dest={1}' .format (dockerfile , remote_dir )
98
+ ).run ()
99
+ # copy files from dockerfile
100
+ f_in = open (dockerfile )
101
+ for path in re .findall ('(?:ADD|COPY) ([^ ]+) ' , f_in .read ()):
102
+ for glob_path in glob .glob (os .path .join (dockerfile_dir , path )):
103
+ # TODO Is there a nicer way to keep permissions?
104
+ ansible .runner .Runner (
105
+ module_name = 'copy' ,
106
+ inventory = inventory ,
107
+ module_args = 'src={0} dest={1} directory_mode mode={2}' .format (
108
+ glob_path , remote_dir ,
109
+ oct (stat .S_IMODE (os .stat (glob_path ).st_mode )))
110
+ ).run ()
111
+ except Exception as e :
112
+ logging .warning ("copy_dockerfile:%s" % e )
113
+
114
+ copy_dockerfile ()
105
115
106
116
# build image if not exist
107
117
try :
108
118
context .image = context .config .userdata ['IMAGE' ]
119
+ run ('docker pull {0}' .format (context .image ))
120
+ except AssertionError :
121
+ pass
109
122
except KeyError :
110
123
context .image = 'ctf'
111
- run ('docker build -t {0} .' .format (context .image ))
124
+ try :
125
+ run ('docker build -t {0} .' .format (context .image ))
126
+ except AssertionError :
127
+ pass
112
128
113
129
cid_file_name = re .sub (r'\W+' , '' , context .image )
114
130
context .cid_file = "/tmp/%s.cid" % cid_file_name
115
131
132
+
116
133
def after_scenario (context , scenario ):
117
- _invoke_other_environment_hooks (context , scenario )
134
+ _invoke_other_environment_hooks (context , scenario )
118
135
try :
119
136
if context .config .userdata ['KEEP_CONTAINER_AFTER_TEST' ]:
120
137
return
121
- except KeyError , e :
138
+ except KeyError as e :
122
139
pass
123
140
124
141
try :
125
142
cid = context .run ('cat %s' % context .cid_file )
126
- except AssertionError , e :
127
- logging .debug ("before_scenario: {0}" .format (e ))
143
+ except AssertionError as e :
144
+ logging .info ("before_scenario: {0}" .format (e ))
128
145
return
129
146
if cid :
130
- context .run ("docker stop %s" % cid )
131
- context .run ("docker kill %s" % cid )
132
- context .run ("docker rm %s" % cid )
147
+ context .run ("docker logs %s" % cid )
148
+ try :
149
+ context .run ("docker stop %s" % cid )
150
+ context .run ("docker kill %s" % cid )
151
+ context .run ("docker rm -v %s" % cid )
152
+ except AssertionError :
153
+ pass
133
154
if hasattr (context , 'cid' ):
134
155
del context .cid
135
156
context .run ('rm {0}' .format (context .cid_file ))
@@ -138,4 +159,4 @@ def after_scenario(context, scenario):
138
159
def after_all (context ):
139
160
_invoke_other_environment_hooks (context )
140
161
if hasattr (context , 'temp_dir' ):
141
- shutil .rmtree (context .temp_dir ) # FIXME catch exception
162
+ shutil .rmtree (context .temp_dir ) # FIXME catch exception
0 commit comments