org-converge 0.0.15 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.org +236 -156
- data/TODO +5 -0
- data/examples/parallel/run.org +18 -0
- data/examples/sequential/run.org +22 -0
- data/lib/org-converge/engine.rb +9 -8
- data/lib/org-converge/version.rb +1 -1
- data/spec/converge_examples/block_modifiers/run.org +11 -2
- metadata +3 -2
- data/.gitmodules +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f820b2bd05b18d9597ca859f80704b1375b8e78b
|
4
|
+
data.tar.gz: 150113c16bad5a6aa993e2dd6ab20aad39e78620
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9d49510cbafe950e8e846ef3bc4113c5cacc647ed26e0c2dff5f1d8183b79ebe1eef613a79cb7906230d276a91db15e9d6d5b5a50803b49b5a727106800d9b2
|
7
|
+
data.tar.gz: df152bb016b5438a2fc8cd919fc4b7cbb9647c9f5791b0ff060caa0dce9728103df833db07825ea143b16ecc2b9fd01be400dca825c719c7229fe9177db16bbf
|
data/README.org
CHANGED
@@ -3,229 +3,306 @@
|
|
3
3
|
|
4
4
|
* Org Converge
|
5
5
|
|
6
|
-
[[https://secure.travis-ci.org/wallyqs/org-converge.png?branch=master]]
|
6
|
+
[[https://secure.travis-ci.org/wallyqs/org-converge.png?branch=master]]
|
7
7
|
|
8
8
|
** Description
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
=rake=, =foreman=, etc...
|
10
|
+
A framework to create documented reproducible runs using [[http://orgmode.org/worg/org-contrib/babel/Org Babel][Org Mode]],
|
11
|
+
borrowing several ideas of what is possible to do with tools
|
12
|
+
like =chef-solo=, =rake=, =foreman= and =capistrano=.
|
14
13
|
|
15
|
-
**
|
14
|
+
** Install
|
16
15
|
|
17
|
-
: gem install org-converge
|
16
|
+
: gem install org-converge
|
18
17
|
|
19
18
|
** Motivation
|
20
19
|
|
21
|
-
[[http://orgmode.org/worg/org-contrib/babel/Org Babel][Org Mode]] has proven to be flexible enough to write
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
is a kind of run that one ought to be able to reproduce.
|
20
|
+
[[http://orgmode.org/worg/org-contrib/babel/Org Babel][Org Mode]] has proven to be flexible enough to write [[http://www.jstatsoft.org/v46/i03][reproducible research papers]],
|
21
|
+
then I believe that configuring and setting up a server for
|
22
|
+
example, is something that could also be done using
|
23
|
+
the same approach, given that /converging/ the configuration
|
24
|
+
is a kind of run that one ought to be able to reproduce.
|
27
25
|
|
28
|
-
|
26
|
+
Taking the original Emacs implementation as reference,
|
27
|
+
Org Converge uses the [[https://github.com/wallyqs/org-ruby][Ruby implementation of the Org mode parser]]
|
28
|
+
to implement and enhance the functionality from Org Babel
|
29
|
+
by adding helpers to define the properties of a run while taking advantage
|
30
|
+
of what is already there in the Ruby ecosystem.
|
29
31
|
|
30
|
-
|
32
|
+
** Usage examples
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
34
|
+
Org Converge supports the following kind of runs below:
|
35
|
+
|
36
|
+
*** Parallel runs
|
37
|
+
|
38
|
+
Each one of the code blocks is run on an independent process.
|
39
|
+
This is akin to having a =Procfile= based application, where
|
40
|
+
one of the runner command would be to start a web application
|
41
|
+
and the other one to start the a worker processes.
|
35
42
|
|
36
|
-
|
43
|
+
In the following example, we are defining 2 code blocks, one
|
44
|
+
that would be run using Ruby and one more that would be run in Python.
|
45
|
+
Notice that the Python block has =:procs= set to 2, meaning that
|
46
|
+
it would spawn 2 processes for this.
|
37
47
|
|
38
48
|
#+begin_src sh
|
39
|
-
|
49
|
+
,#+TITLE: Sample parallel run
|
50
|
+
|
51
|
+
,#+name: infinite-worker-in-ruby
|
52
|
+
,#+begin_src ruby
|
53
|
+
$stdout.sync = true
|
54
|
+
loop { puts "working!"; sleep 1; }
|
55
|
+
,#+end_src
|
56
|
+
|
57
|
+
,#+name: infinite-worker-in-python
|
58
|
+
,#+begin_src python :procs 2
|
59
|
+
import sys
|
60
|
+
import time
|
61
|
+
|
62
|
+
while True:
|
63
|
+
print "working too"
|
64
|
+
sys.stdout.flush()
|
65
|
+
time.sleep(1)
|
66
|
+
,#+end_src
|
40
67
|
#+end_src
|
41
68
|
|
42
|
-
|
43
|
-
|
69
|
+
The above example can be run with the following:
|
70
|
+
|
71
|
+
: org-run procfile-example.org
|
72
|
+
|
73
|
+
Sample output of the run:
|
44
74
|
|
45
75
|
#+begin_src sh
|
46
|
-
|
76
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-ruby -- started with pid 19648
|
77
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-python:1 -- started with pid 19649
|
78
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-python:2 -- started with pid 19650
|
79
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-python:1 -- working too
|
80
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-python:2 -- working too
|
81
|
+
[2014-06-07T18:05:48 +0900] infinite-worker-in-ruby -- working!
|
82
|
+
[2014-06-07T18:05:49 +0900] infinite-worker-in-python:1 -- working too
|
83
|
+
[2014-06-07T18:05:49 +0900] infinite-worker-in-python:2 -- working too
|
47
84
|
#+end_src
|
48
85
|
|
49
|
-
|
50
|
-
|
86
|
+
*** Sequential runs
|
87
|
+
|
88
|
+
In case the code blocks form part of a runlist that should be
|
89
|
+
ran sequentially, it is possible to do this by specifying the
|
90
|
+
~runmode=sequential~ option.
|
51
91
|
|
52
92
|
#+begin_src sh
|
53
|
-
|
93
|
+
,#+TITLE: Sample sequential run
|
94
|
+
,#+runmode: sequential
|
95
|
+
|
96
|
+
,#+name: first
|
97
|
+
,#+begin_src sh
|
98
|
+
echo "first"
|
99
|
+
,#+end_src
|
100
|
+
|
101
|
+
,#+name: second
|
102
|
+
,#+begin_src sh
|
103
|
+
echo "second"
|
104
|
+
,#+end_src
|
105
|
+
|
106
|
+
,#+name: third
|
107
|
+
,#+begin_src sh
|
108
|
+
echo "third"
|
109
|
+
,#+end_src
|
110
|
+
|
111
|
+
,#+name: fourth
|
112
|
+
,#+begin_src sh
|
113
|
+
echo "fourth"
|
114
|
+
,#+end_src
|
54
115
|
#+end_src
|
55
116
|
|
56
|
-
|
117
|
+
In order to specify that this is to be run sequentially,
|
118
|
+
we set the runmode option in the command line:
|
57
119
|
|
58
|
-
: org-run
|
59
|
-
: org-tangle # just tangles the contents without running the blocks
|
120
|
+
: org-run runlist-example.org --runmode=sequential
|
60
121
|
|
61
|
-
|
122
|
+
Another way of specifying this is via the Org mode file itself:
|
62
123
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
124
|
+
#+begin_src org
|
125
|
+
,#+TITLE: Defining the runmode as an in buffer setting
|
126
|
+
,#+runmode: sequential
|
127
|
+
#+end_src
|
67
128
|
|
68
|
-
|
69
|
-
files on a server by writing the following on a ~server.org~ file.
|
129
|
+
Sample output:
|
70
130
|
|
71
131
|
#+begin_src sh
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
132
|
+
[2014-06-07T18:10:33 +0900] first -- started with pid 19845
|
133
|
+
[2014-06-07T18:10:33 +0900] first -- first
|
134
|
+
[2014-06-07T18:10:33 +0900] first -- exited with code 0
|
135
|
+
[2014-06-07T18:10:33 +0900] second -- started with pid 19846
|
136
|
+
[2014-06-07T18:10:33 +0900] second -- second
|
137
|
+
[2014-06-07T18:10:33 +0900] second -- exited with code 0
|
138
|
+
[2014-06-07T18:10:33 +0900] third -- started with pid 19847
|
139
|
+
[2014-06-07T18:10:33 +0900] third -- third
|
140
|
+
[2014-06-07T18:10:33 +0900] third -- exited with code 0
|
141
|
+
[2014-06-07T18:10:33 +0900] fourth -- started with pid 19848
|
142
|
+
[2014-06-07T18:10:33 +0900] fourth -- fourth
|
143
|
+
[2014-06-07T18:10:33 +0900] fourth -- exited with code 0
|
76
144
|
#+end_src
|
77
145
|
|
78
|
-
|
79
|
-
|
146
|
+
*** Configuration management runs
|
147
|
+
|
148
|
+
For example, using Org Babel tangling functionality we can spread
|
149
|
+
config files on a server by writing the following on a ~server.org~ file...
|
80
150
|
|
81
151
|
#+begin_src sh
|
82
|
-
sudo org-converge server.org
|
83
|
-
#+end_src
|
84
152
|
|
85
|
-
|
86
|
-
but that we also want to install some packages. In that case, we
|
87
|
-
should be able to do the following:
|
88
|
-
(Note: Currently, only named blocks would be run)
|
153
|
+
Configuration for a component that shoul be run in multitenant mode:
|
89
154
|
|
90
|
-
#+begin_src sh
|
91
|
-
,** Configuring the component
|
92
|
-
|
93
155
|
,#+begin_src yaml :tangle /etc/component.yml
|
94
156
|
multitenant: false
|
95
157
|
status_port: 10004
|
96
|
-
,#+end_src
|
97
|
-
|
98
|
-
,** Installing the dependencies
|
99
|
-
|
100
|
-
Need the following so that ~bundle install~ can compile
|
101
|
-
the native extensions correctly.
|
102
|
-
|
103
|
-
# Giving the block a name would make it run
|
104
|
-
|
105
|
-
,#+name: build_essentials
|
106
|
-
,#+begin_src sh
|
107
|
-
apt-get install build-essentials -y
|
108
|
-
,#+end_src
|
109
|
-
|
110
|
-
Then the following should work:
|
111
|
-
|
112
|
-
,#+name: bundle_install
|
113
|
-
,#+begin_src sh
|
114
|
-
cd project_path
|
115
|
-
bundle install
|
116
158
|
,#+end_src
|
117
159
|
#+end_src
|
118
160
|
|
119
|
-
|
161
|
+
Then run:
|
120
162
|
|
121
|
-
|
122
|
-
,#+TITLE: Another setup
|
163
|
+
: sudo org-tangle server.org
|
123
164
|
|
124
|
-
|
125
|
-
,#+include: "server.org"
|
165
|
+
*** Idempotent runs
|
126
166
|
|
127
|
-
|
128
|
-
,#+begin_src sh
|
129
|
-
apt-get install org-mode -y
|
130
|
-
,#+end_src
|
131
|
-
#+end_src
|
167
|
+
A run can have idempotency checks (similar to how the execute resource from [[http://docs.opscode.com/resource_execute.html][Chef]] works).
|
132
168
|
|
133
|
-
|
169
|
+
An example of this, would be when installing packages. In this example,
|
170
|
+
we want to install the =build-essential= package once, and skip it in following runs:
|
134
171
|
|
135
|
-
|
172
|
+
#+begin_src sh
|
173
|
+
,** Installing the dependencies
|
174
|
+
|
175
|
+
Need the following so that ~bundle install~ can compile
|
176
|
+
the native extensions correctly.
|
177
|
+
|
178
|
+
,#+name: build-essential-installed
|
179
|
+
,#+begin_src sh
|
180
|
+
dpkg -l | grep build-essential
|
181
|
+
,#+end_src
|
182
|
+
|
183
|
+
,#+name: build_essentials
|
184
|
+
,#+begin_src sh :unless build-essential-installed
|
185
|
+
apt-get install build-essential -y
|
186
|
+
,#+end_src
|
136
187
|
|
137
|
-
|
188
|
+
,#+name: bundle_install
|
189
|
+
,#+begin_src sh
|
190
|
+
cd project_path
|
191
|
+
bundle install
|
192
|
+
,#+end_src
|
193
|
+
#+end_src
|
138
194
|
|
139
|
-
|
140
|
-
|
141
|
-
Each code block is part of a step to be ran
|
142
|
-
|
143
|
-
- runs where the blocks need to be run in parallel (~--runmode=parallel~) ::
|
144
|
-
|
145
|
-
One example of this is having what is supposed to be a distributed system running locally for development (where ~foreman~ would be used).
|
146
|
-
|
147
|
-
- runs where the blocks need to be run in sequence according to defined dependencies (~--runmode=chained~) ::
|
148
|
-
|
149
|
-
Set of runs that are usually covered by using something like rake, make, etc...
|
195
|
+
Furthermore,since we are using Org mode syntax, it is possible
|
196
|
+
to reuse this setup file by including it into another Org file:
|
150
197
|
|
151
|
-
|
198
|
+
#+begin_src sh
|
199
|
+
,#+TITLE: Another setup
|
152
200
|
|
153
|
-
|
201
|
+
Include the code blocks from the server into this:
|
202
|
+
|
203
|
+
,#+include: "server.org"
|
154
204
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
,#+runmode: sequential
|
205
|
+
,#+name: install_org_mode
|
206
|
+
,#+begin_src sh
|
207
|
+
apt-get install org-mode -y
|
208
|
+
,#+end_src
|
209
|
+
#+end_src
|
161
210
|
#+end_src
|
162
211
|
|
163
|
-
|
212
|
+
Since this a run that involves converging into a state,
|
213
|
+
it would be run sequentially with idempotency checks applied:
|
214
|
+
|
215
|
+
: sudo org-converge setup.org
|
164
216
|
|
165
|
-
|
166
|
-
|
167
|
-
|
217
|
+
*** Dependencies based runs
|
218
|
+
|
219
|
+
In this type of runs we use the =:after= and =:before=
|
220
|
+
header arguments to specify the prerequisites for a code block to run,
|
221
|
+
similar to some of the functioality provided by tools like =rake=
|
222
|
+
(Behind the scenes, these arguments create =Rake= tasks)
|
223
|
+
|
224
|
+
In order for this kind of run to work, it has to be specified
|
225
|
+
what is the task that we are converging to by using
|
226
|
+
the =#+final_task:= in buffer setting:
|
168
227
|
|
169
228
|
#+begin_src sh
|
170
|
-
,#+TITLE:
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
,#+name:
|
175
|
-
,#+begin_src sh :
|
176
|
-
|
229
|
+
,#+TITLE: Linked tasks example
|
230
|
+
,#+runmode: tasks
|
231
|
+
,#+final_task: final
|
232
|
+
|
233
|
+
,#+name: second
|
234
|
+
,#+begin_src sh :after first
|
235
|
+
for i in `seq 5 10`; do
|
236
|
+
echo $i >> out.log
|
237
|
+
done
|
177
238
|
,#+end_src
|
178
|
-
|
179
|
-
,#+name:
|
180
|
-
,#+begin_src ruby
|
181
|
-
|
182
|
-
|
239
|
+
|
240
|
+
,#+name: first
|
241
|
+
,#+begin_src ruby
|
242
|
+
5.times { |n| File.open("out.log", "a") {|f| f.puts n } }
|
243
|
+
,#+end_src
|
244
|
+
|
245
|
+
,#+name: final
|
246
|
+
,#+begin_src python :after second :results output
|
247
|
+
print "Wrapping up with Python in the end"
|
248
|
+
f = open('out.log', 'a')
|
249
|
+
f.write('11')
|
250
|
+
f.close()
|
251
|
+
,#+end_src
|
252
|
+
|
253
|
+
,#+name: prologue
|
254
|
+
,#+begin_src sh :before first :results output
|
255
|
+
echo "init" > out.log
|
183
256
|
,#+end_src
|
184
|
-
|
185
|
-
,#+name: hello_from_python
|
186
|
-
,#+begin_src python :shebang #!/usr/bin/python
|
187
|
-
import time
|
188
|
-
import sys
|
189
|
-
for i in range(0,100):
|
190
|
-
print "hello world from python"
|
191
|
-
sys.stdout.flush()
|
192
|
-
time.sleep(1)
|
193
|
-
,#+end_src
|
194
257
|
#+end_src
|
195
258
|
|
196
|
-
|
259
|
+
: org-spec chained-example.org --runmode=chained
|
197
260
|
|
198
|
-
|
199
|
-
|
200
|
-
#+end_src
|
261
|
+
Instead of using =--runmode= options, it is also possible to just declare in buffer
|
262
|
+
that the Org file should be run chained mode.
|
201
263
|
|
202
|
-
|
264
|
+
#+begin_src org
|
265
|
+
,#+TITLE: Defining the runmode as an in buffer setting
|
266
|
+
,#+runmode: chained
|
267
|
+
#+end_src
|
268
|
+
|
269
|
+
Sample output:
|
203
270
|
|
204
271
|
#+begin_src sh
|
205
|
-
[2014-
|
206
|
-
[2014-
|
207
|
-
[2014-
|
208
|
-
[2014-
|
209
|
-
[2014-
|
210
|
-
[2014-
|
211
|
-
[2014-
|
212
|
-
[2014-
|
213
|
-
[2014-
|
214
|
-
[2014-
|
215
|
-
[2014-05-04T19:23:42 +0900] hello_from_ruby (4665) -- hello world from ruby
|
272
|
+
[2014-06-07T18:14:25 +0900] Running final task: final
|
273
|
+
[2014-06-07T18:14:25 +0900] prologue -- started with pid 20035
|
274
|
+
[2014-06-07T18:14:25 +0900] prologue -- exited with code 0
|
275
|
+
[2014-06-07T18:14:25 +0900] first -- started with pid 20036
|
276
|
+
[2014-06-07T18:14:26 +0900] first -- exited with code 0
|
277
|
+
[2014-06-07T18:14:26 +0900] second -- started with pid 20038
|
278
|
+
[2014-06-07T18:14:26 +0900] second -- exited with code 0
|
279
|
+
[2014-06-07T18:14:26 +0900] final -- started with pid 20040
|
280
|
+
[2014-06-07T18:14:26 +0900] final -- Wrapping up with Python in the end
|
281
|
+
[2014-06-07T18:14:26 +0900] final -- exited with code 0
|
216
282
|
#+end_src
|
217
283
|
|
218
|
-
|
284
|
+
*** Remote runs
|
285
|
+
|
286
|
+
For any of the cases above, it is also possible to specify
|
287
|
+
whether the code blocks should be run remotely on another node.
|
288
|
+
This is done by using =:dir= in the code block header argument.
|
219
289
|
|
220
290
|
#+begin_src sh
|
221
|
-
|
291
|
+
,#+sshidentifyfile: vagrant/keys/vagrant
|
292
|
+
,#+name: remote-bash-code-block
|
293
|
+
,#+begin_src sh :results output :dir /vagrant@127.0.0.1#2222:/tmp
|
294
|
+
random_number=$RANDOM
|
295
|
+
for i in `seq 1 10`; do echo "[$random_number] Running script is $0 being run from `pwd`"; done
|
296
|
+
,#+end_src
|
222
297
|
#+end_src
|
223
298
|
|
224
|
-
|
299
|
+
Note that in order for the above to work, it is also needed to set identity to be used by ssh.
|
225
300
|
|
226
|
-
|
227
|
-
|
228
|
-
|
301
|
+
*** Asserted runs
|
302
|
+
|
303
|
+
In case the Org mode file has a results block which represents the expected result,
|
304
|
+
there is an ~org-spec~ command which can be useful to check whether there was a change
|
305
|
+
that no longer makes the results from the Org file valid. Example:
|
229
306
|
|
230
307
|
#+begin_src sh
|
231
308
|
,#+TITLE: Expected results example
|
@@ -252,14 +329,17 @@ For example, given the following file stored in ~test.org~:
|
|
252
329
|
,#+end_example
|
253
330
|
#+end_src
|
254
331
|
|
255
|
-
We can be able to verify whether this is still correct by running
|
332
|
+
We can be able to verify whether this is still correct by running:
|
333
|
+
|
334
|
+
: org-spec test.org
|
256
335
|
|
257
336
|
#+begin_src sh
|
258
337
|
Checking results from 'hello' code block: OK
|
259
338
|
#+end_src
|
260
339
|
|
261
|
-
As an example, let's say that the behavior of the original code block changed,
|
262
|
-
|
340
|
+
As an example, let's say that the behavior of the original code block changed,
|
341
|
+
and now says hello 5 times instead.
|
342
|
+
In that case the output would be as follows:
|
263
343
|
|
264
344
|
#+begin_src diff
|
265
345
|
Checking results from 'hello' code block: DIFF
|
@@ -283,6 +363,6 @@ Checking results from 'hello' code block: DIFF
|
|
283
363
|
|
284
364
|
** Contributing
|
285
365
|
|
286
|
-
The project is in very early development at this moment
|
287
|
-
feel that it is interesting enough, please create a ticket to start
|
366
|
+
The project is still in very early development and a proof of concept at this moment.
|
367
|
+
But if you feel that it is interesting enough, please create a ticket to start
|
288
368
|
the discussion.
|
data/TODO
CHANGED
@@ -17,6 +17,7 @@ Some of these need further work on the Org Ruby parser.
|
|
17
17
|
: org-converge setupfile.org --dry-run
|
18
18
|
- [ ] Bugfix for when results blocks have only inline examples or images
|
19
19
|
- [ ] Bugfix for when the result from a ~org-spec~ run has non-zero exit status
|
20
|
+
- [ ] Tangling should be idempotent as well...
|
20
21
|
- [ ] =:eval=
|
21
22
|
For evaling blocks (off by default)
|
22
23
|
- [ ] =:onerror=
|
@@ -35,6 +36,10 @@ Some of these need further work on the Org Ruby parser.
|
|
35
36
|
Also part of the idempotency checks.
|
36
37
|
- [ ] =:env= and =#+envfile:=
|
37
38
|
|
39
|
+
* [1/1] 0.0.16
|
40
|
+
|
41
|
+
- [X] Remove timeout feature.
|
42
|
+
|
38
43
|
* [1/1] 0.0.15
|
39
44
|
|
40
45
|
- [X] Can use =:dir= for running a process remotely via ssh.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#+TITLE: Sample parallel run
|
2
|
+
|
3
|
+
#+name: infinite-worker-in-ruby
|
4
|
+
#+begin_src ruby
|
5
|
+
$stdout.sync = true
|
6
|
+
loop { puts "working!"; sleep 1; }
|
7
|
+
#+end_src
|
8
|
+
|
9
|
+
#+name: infinite-worker-in-python
|
10
|
+
#+begin_src python :procs 2
|
11
|
+
import sys
|
12
|
+
import time
|
13
|
+
|
14
|
+
while True:
|
15
|
+
print "working too"
|
16
|
+
sys.stdout.flush()
|
17
|
+
time.sleep(1)
|
18
|
+
#+end_src
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#+TITLE: Sample sequential run
|
2
|
+
#+runmode: sequential
|
3
|
+
|
4
|
+
#+name: first
|
5
|
+
#+begin_src sh
|
6
|
+
echo "first"
|
7
|
+
#+end_src
|
8
|
+
|
9
|
+
#+name: second
|
10
|
+
#+begin_src sh
|
11
|
+
echo "second"
|
12
|
+
#+end_src
|
13
|
+
|
14
|
+
#+name: third
|
15
|
+
#+begin_src sh
|
16
|
+
echo "third"
|
17
|
+
#+end_src
|
18
|
+
|
19
|
+
#+name: fourth
|
20
|
+
#+begin_src sh
|
21
|
+
echo "fourth"
|
22
|
+
#+end_src
|
data/lib/org-converge/engine.rb
CHANGED
@@ -277,14 +277,15 @@ module OrgConverge
|
|
277
277
|
else
|
278
278
|
pid = process.call
|
279
279
|
end
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
280
|
+
# TODO: This doesn't work
|
281
|
+
# if timeout > 0
|
282
|
+
# sleep timeout
|
283
|
+
# # FIXME: Kill children properly
|
284
|
+
# o = `ps -ef | awk '$3 == #{pid} { print $2 }'`
|
285
|
+
# o.each_line { |cpid| Process.kill(:TERM, cpid.to_i) }
|
286
|
+
# Process.kill(:TERM, pid)
|
287
|
+
# Thread.current.kill
|
288
|
+
# end
|
288
289
|
end
|
289
290
|
else
|
290
291
|
pid = process.call
|
data/lib/org-converge/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
We have the following process, but it will take 5 seconds to start...
|
4
4
|
|
5
5
|
#+name: waits-5-seconds
|
6
|
-
#+begin_src sh :sleep
|
6
|
+
#+begin_src sh :sleep 1
|
7
7
|
echo "Wait..."
|
8
8
|
for i in `seq 1 4`;
|
9
9
|
do
|
@@ -21,7 +21,16 @@ This one on the other hand starts as soon as possible:
|
|
21
21
|
echo "whoosh" > out.log
|
22
22
|
#+end_src
|
23
23
|
|
24
|
-
|
24
|
+
*** TODO The following should not be necessary
|
25
|
+
|
26
|
+
Need to fix this:
|
27
|
+
|
28
|
+
#+name: just-sleeps
|
29
|
+
#+begin_src sh
|
30
|
+
sleep 5
|
31
|
+
#+end_src
|
32
|
+
|
33
|
+
** COMMENT Fails sometimes....
|
25
34
|
|
26
35
|
#+name: timeout-in-3-seconds
|
27
36
|
#+begin_src sh :timeout 5
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: org-converge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Waldemar Quevedo
|
@@ -133,7 +133,6 @@ executables:
|
|
133
133
|
extensions: []
|
134
134
|
extra_rdoc_files: []
|
135
135
|
files:
|
136
|
-
- .gitmodules
|
137
136
|
- .travis.yml
|
138
137
|
- Gemfile
|
139
138
|
- LICENSE
|
@@ -147,6 +146,8 @@ files:
|
|
147
146
|
- examples/apt-get-install/setup.org
|
148
147
|
- examples/fluentd/setup.org
|
149
148
|
- examples/macro-config/setup.org
|
149
|
+
- examples/parallel/run.org
|
150
|
+
- examples/sequential/run.org
|
150
151
|
- examples/simple/setup.org
|
151
152
|
- lib/org-converge.rb
|
152
153
|
- lib/org-converge/babel.rb
|
data/.gitmodules
DELETED