kameleon-builder 2.7.2 → 2.7.3
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 +7 -0
- data/.bumpversion.cfg +1 -1
- data/CHANGES +10 -0
- data/RELEASING.rst +21 -0
- data/kameleon-builder.gemspec +5 -3
- data/lib/kameleon/cli.rb +52 -8
- data/lib/kameleon/engine.rb +102 -8
- data/lib/kameleon/recipe.rb +31 -17
- data/lib/kameleon/step.rb +4 -4
- data/lib/kameleon/utils.rb +17 -0
- data/tests/issue76/fail.stdout +3 -0
- data/tests/issue76/fail.yaml +10 -0
- data/tests/issue76/ok.stdout +26 -0
- data/tests/issue76/ok.yaml +11 -0
- data/tests/issue76/steps/testbootstrap.yaml +3 -0
- data/tests/recipes/steps/data/mydata.txt +1 -0
- data/tests/recipes/steps/local_variables.yaml +3 -0
- data/tests/recipes/test_recipe.yaml +16 -1
- data/tests/recipes/test_recipe_child.yaml +13 -0
- data/tests/test2/steps/data/mydata.txt +1 -0
- data/tests/test2/test_data.yaml +7 -0
- data/version.txt +1 -1
- metadata +74 -33
- data/RELEASING +0 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a2c9644b602c1fe67b1fcab541b004d3695392bb
|
4
|
+
data.tar.gz: e1df98ecaf104f722a5dfd2cad453b353b83ae40
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 28137867258f3f264da34dec74181369976a54cdfd9cf4c92e1fa0ea3cce55af0f90bfb6f07045944ee65ee4702948f4f570a38279087fb19b57c04b9b0c4821
|
7
|
+
data.tar.gz: db96df44109150bfb4f4eabecfa5d44c6655c3a0149f65338c585d03f401e40583d5e34d563718ef6072fbdf209b5900aee3f464f513b985c028ec8fa469d872
|
data/.bumpversion.cfg
CHANGED
data/CHANGES
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
Kameleon CHANGELOG
|
2
2
|
==================
|
3
3
|
|
4
|
+
Version 2.7.3
|
5
|
+
-------------
|
6
|
+
|
7
|
+
Released on June 20th 2016
|
8
|
+
|
9
|
+
- The info command can now handle multiple recipes
|
10
|
+
- Colorized the output of the info command
|
11
|
+
- Added the dryrun option to the info command
|
12
|
+
- Added the dag option to the info command: draw a GraphViz dag for recipes
|
13
|
+
|
4
14
|
Version 2.7.2
|
5
15
|
-------------
|
6
16
|
|
data/RELEASING.rst
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
You can use the script ``./scripts/bumpversion.py`` which will handle
|
2
|
+
everything (incrementation, git tag creation, changelog update).
|
3
|
+
First you need to install bumpversion using pip::
|
4
|
+
|
5
|
+
sudo pip2 install bumpversion
|
6
|
+
|
7
|
+
Then for the actual releasing:
|
8
|
+
|
9
|
+
1) After each release, a new version has to be created (in this example, the 2.7.0 dev)::
|
10
|
+
|
11
|
+
python2 ./scripts/bumpversion.py newversion minor # 2.6.7 -> 2.7.0.dev
|
12
|
+
|
13
|
+
2) [work/commit]
|
14
|
+
|
15
|
+
3) Releasing a new version::
|
16
|
+
|
17
|
+
python2 ./scripts/bumpversion.py release # 2.7.0.dev -> 2.7.0 + git tag + changelog
|
18
|
+
gem build kameleon-builder.gemspec
|
19
|
+
gem push kameleon-builder-2.7.0.gem
|
20
|
+
|
21
|
+
You need a rubygem account and I have to give you permissions so that you can push.
|
data/kameleon-builder.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.description = %q{The mindful appliance builder}
|
21
21
|
s.summary = %q{Kameleon is a tool to build virtual machines from scratch}
|
22
22
|
s.homepage = 'http://kameleon.imag.fr/'
|
23
|
-
s.license = 'GPL-2'
|
23
|
+
s.license = 'GPL-2.0'
|
24
24
|
|
25
25
|
s.files = `git ls-files`.split($/)
|
26
26
|
s.files.reject! { |file| file.start_with?('docs/') }
|
@@ -30,7 +30,9 @@ Gem::Specification.new do |s|
|
|
30
30
|
|
31
31
|
s.add_dependency 'childprocess', '~> 0.5.3', '>= 0.3.0'
|
32
32
|
s.add_dependency 'thor', '~> 0.19', '>= 0.15.0'
|
33
|
-
s.add_dependency 'table_print', '~> 1.5
|
33
|
+
s.add_dependency 'table_print', '~> 1.5'
|
34
|
+
s.add_dependency 'psych', '~> 2.0'
|
35
|
+
s.add_dependency 'ruby-graphviz', '~> 1.2'
|
34
36
|
|
35
|
-
s.requirements = ['polipo 1.0.3, or greater']
|
37
|
+
s.requirements = ['polipo 1.0.3, or greater', 'graphviz 2.38.0 or greater']
|
36
38
|
end
|
data/lib/kameleon/cli.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'kameleon/engine'
|
2
2
|
require 'kameleon/recipe'
|
3
3
|
require 'kameleon/utils'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'graphviz'
|
4
6
|
|
5
7
|
module Kameleon
|
6
8
|
|
@@ -82,7 +84,7 @@ module Kameleon
|
|
82
84
|
end
|
83
85
|
tpl = RecipeTemplate.new(template_path)
|
84
86
|
tpl.resolve! :strict => false
|
85
|
-
tpl.display_info
|
87
|
+
tpl.display_info(false)
|
86
88
|
end
|
87
89
|
map %w(-h --help) => :help
|
88
90
|
map %w(ls) => :list
|
@@ -170,16 +172,30 @@ module Kameleon
|
|
170
172
|
end
|
171
173
|
end
|
172
174
|
|
173
|
-
desc "info [
|
175
|
+
desc "info [RECIPE_PATH]", "Display detailed information about a recipe"
|
174
176
|
method_option :global, :type => :hash ,
|
175
177
|
:default => {}, :aliases => "-g",
|
176
178
|
:desc => "Set custom global variables."
|
177
179
|
method_option :from_cache, :type => :string ,
|
178
180
|
:default => nil,
|
179
181
|
:desc => "Get info from a persistent cache tar file (ignore recipe path)"
|
182
|
+
method_option :dryrun, :type => :boolean ,
|
183
|
+
:default => false,
|
184
|
+
:desc => "Show the build sequence but do not actually build"
|
185
|
+
method_option :dag, :type => :boolean ,
|
186
|
+
:default => false,
|
187
|
+
:desc => "Show a DAG of the build sequence"
|
188
|
+
method_option :file, :type => :string ,
|
189
|
+
:default => "/tmp/kameleon.dag",
|
190
|
+
:desc => "DAG output filename"
|
191
|
+
method_option :format, :type => :string ,
|
192
|
+
:desc => "DAG GraphViz format"
|
193
|
+
method_option :relative, :type => :boolean ,
|
194
|
+
:default => false,
|
195
|
+
:desc => "Make pathnames relative to the current working directory"
|
180
196
|
|
181
|
-
def info(
|
182
|
-
if
|
197
|
+
def info(*recipe_paths)
|
198
|
+
if recipe_paths.length == 0 && !options[:from_cache].nil?
|
183
199
|
unless File.file?(options[:from_cache])
|
184
200
|
raise CacheError, "The specified cache file "\
|
185
201
|
"\"#{options[:from_cache]}\" do not exists"
|
@@ -189,12 +205,40 @@ module Kameleon
|
|
189
205
|
@cache.cache_path = options[:from_cache]
|
190
206
|
recipe_path = @cache.get_recipe
|
191
207
|
end
|
192
|
-
|
193
|
-
|
194
|
-
|
208
|
+
dag = nil
|
209
|
+
color = 0
|
210
|
+
recipe_paths.each do |path|
|
211
|
+
recipe = Kameleon::Recipe.new(path)
|
212
|
+
if options[:dryrun]
|
213
|
+
Kameleon::Engine.new(recipe, options).dryrun
|
214
|
+
elsif options[:dag]
|
215
|
+
dag = Kameleon::Engine.new(recipe, options).dag(dag, color)
|
216
|
+
color += 1
|
217
|
+
else
|
218
|
+
recipe.display_info(options[:relative])
|
219
|
+
end
|
220
|
+
end
|
221
|
+
if options[:dag]
|
222
|
+
format = "canon"
|
223
|
+
if options[:format]
|
224
|
+
if GraphViz::Constants::FORMATS.include?(options[:format])
|
225
|
+
format = options[:format]
|
226
|
+
else
|
227
|
+
Kameleon.ui.warn("Unknown GraphViz format #{options[:format]}, fall back to #{format}")
|
228
|
+
end
|
229
|
+
else
|
230
|
+
options[:file].match(/^.+\.([^\.]+)$/) do |f|
|
231
|
+
if GraphViz::Constants::FORMATS.include?(f[1])
|
232
|
+
format = f[1]
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
dag.output( :"#{format}" => options[:file] )
|
237
|
+
Kameleon.ui.info("Generated GraphViz #{format} file: #{options[:file]}")
|
238
|
+
end
|
195
239
|
end
|
196
240
|
|
197
|
-
desc "build [
|
241
|
+
desc "build [RECIPE_PATH]", "Builds the appliance from the given recipe"
|
198
242
|
method_option :build_path, :type => :string ,
|
199
243
|
:default => nil, :aliases => "-b",
|
200
244
|
:desc => "Sets the build directory path"
|
data/lib/kameleon/engine.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'kameleon/recipe'
|
2
2
|
require 'kameleon/context'
|
3
3
|
require 'kameleon/persistent_cache'
|
4
|
+
require 'graphviz'
|
4
5
|
|
5
6
|
|
6
7
|
module Kameleon
|
@@ -74,15 +75,16 @@ module Kameleon
|
|
74
75
|
if @options[:enable_cache] || @options[:from_cache] then
|
75
76
|
@cache.recipe_files = @recipe.all_files
|
76
77
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
unless @options[:dryrun] or @options[:dag]
|
79
|
+
begin
|
80
|
+
Kameleon.ui.info("Creating kameleon build directory : #{@cwd}")
|
81
|
+
FileUtils.mkdir_p @cwd
|
82
|
+
rescue
|
83
|
+
raise BuildError, "Failed to create build directory #{@cwd}"
|
84
|
+
end
|
85
|
+
@cache.start if @cache
|
86
|
+
build_contexts
|
83
87
|
end
|
84
|
-
@cache.start if @cache
|
85
|
-
build_contexts
|
86
88
|
end
|
87
89
|
|
88
90
|
def build_contexts
|
@@ -403,6 +405,98 @@ module Kameleon
|
|
403
405
|
@cache.stop_web_proxy if @options[:enable_cache] ## stopping polipo
|
404
406
|
end
|
405
407
|
|
408
|
+
def dryrun
|
409
|
+
def relative_or_absolute_path(path)
|
410
|
+
if @options[:relative]
|
411
|
+
return path.relative_path_from(Pathname(Dir.pwd))
|
412
|
+
else
|
413
|
+
return path
|
414
|
+
end
|
415
|
+
end
|
416
|
+
Kameleon.ui.shell.say ""
|
417
|
+
Kameleon.ui.shell.say "#{ @recipe.name } ", :bold
|
418
|
+
Kameleon.ui.shell.say "(#{ relative_or_absolute_path(@recipe.path) })", :cyan
|
419
|
+
["bootstrap", "setup", "export"].each do |section_name|
|
420
|
+
section = @recipe.sections.fetch(section_name)
|
421
|
+
Kameleon.ui.shell.say "[" << section.name.capitalize << "]", :red
|
422
|
+
section.sequence do |macrostep|
|
423
|
+
Kameleon.ui.shell.say " "
|
424
|
+
Kameleon.ui.shell.say "#{macrostep.name} ", :bold
|
425
|
+
if macrostep.path
|
426
|
+
Kameleon.ui.shell.say "(#{ relative_or_absolute_path(macrostep.path) })", :cyan
|
427
|
+
else
|
428
|
+
Kameleon.ui.shell.say "(internal)", :cyan
|
429
|
+
end
|
430
|
+
macrostep.sequence do |microstep|
|
431
|
+
Kameleon.ui.shell.say " --> ", :magenta
|
432
|
+
Kameleon.ui.shell.say "#{ microstep.order } ", :green
|
433
|
+
Kameleon.ui.shell.say "#{ microstep.name }", :yellow
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
Kameleon.ui.shell.say ""
|
438
|
+
end
|
439
|
+
|
440
|
+
def dag(graph, color)
|
441
|
+
if graph.nil?
|
442
|
+
graph = GraphViz::new( "G" )
|
443
|
+
end
|
444
|
+
recipe_path = @recipe.path.relative_path_from(Pathname(Dir.pwd)).to_s
|
445
|
+
colorscheme = "set18"
|
446
|
+
color = (color % 8 + 1).to_s
|
447
|
+
g_recipes = graph.add_graph( "cluster R:recipes" )
|
448
|
+
g_recipes['label'] = 'Recipes'
|
449
|
+
g_recipes['style'] = 'dashed'
|
450
|
+
n_recipe = g_recipes.add_nodes(recipe_path)
|
451
|
+
n_recipe['label'] = recipe_path
|
452
|
+
n_recipe['shape'] = 'Mdiamond'
|
453
|
+
n_recipe['colorscheme'] = colorscheme
|
454
|
+
n_recipe['color'] = color
|
455
|
+
(@recipe.base_recipes_files - [@recipe.path]).uniq.each do |base_recipe_path|
|
456
|
+
n_base_recipe = g_recipes.add_nodes(base_recipe_path.relative_path_from(Pathname(Dir.pwd)).to_s)
|
457
|
+
n_base_recipe['shape'] = 'Mdiamond'
|
458
|
+
edge = graph.add_edges(n_base_recipe, n_recipe)
|
459
|
+
edge['style'] = 'dashed'
|
460
|
+
end
|
461
|
+
n_prev = n_recipe
|
462
|
+
["bootstrap", "setup", "export"].each do |section_name|
|
463
|
+
section = @recipe.sections.fetch(section_name)
|
464
|
+
g_section = graph.add_graph( "cluster S:#{ section_name }" )
|
465
|
+
g_section['label'] = section_name.capitalize
|
466
|
+
section.sequence do |macrostep|
|
467
|
+
if macrostep.path.nil?
|
468
|
+
macrostep_name = macrostep.name
|
469
|
+
else
|
470
|
+
macrostep_name = macrostep.path.relative_path_from(Pathname(Dir.pwd)).to_s
|
471
|
+
macrostep_name.chomp!(".yaml")
|
472
|
+
macrostep_name.sub!(/^steps\//, "")
|
473
|
+
end
|
474
|
+
g_macrostep = g_section.add_graph( "cluster M:#{ macrostep_name }")
|
475
|
+
g_macrostep['label'] = macrostep_name
|
476
|
+
g_macrostep['style'] = 'filled'
|
477
|
+
g_macrostep['color'] = 'gray'
|
478
|
+
macrostep.sequence do |microstep|
|
479
|
+
n_microstep = g_macrostep.add_nodes("m:#{macrostep_name}/#{microstep.name}")
|
480
|
+
n_microstep['label'] = microstep.name
|
481
|
+
n_microstep['style'] = 'filled'
|
482
|
+
n_microstep['color'] = 'white'
|
483
|
+
edge = graph.add_edges(n_prev, n_microstep)
|
484
|
+
edge['colorscheme'] = colorscheme
|
485
|
+
edge['color'] = color
|
486
|
+
n_prev = n_microstep
|
487
|
+
end
|
488
|
+
end
|
489
|
+
end
|
490
|
+
n_end = graph.add_nodes('end')
|
491
|
+
n_end['label'] = 'END'
|
492
|
+
n_end['shape'] = 'Msquare'
|
493
|
+
edge = graph.add_edges(n_prev, n_end)
|
494
|
+
edge['colorscheme'] = colorscheme
|
495
|
+
edge['color'] = color
|
496
|
+
Kameleon.ui.info "-> Drawn DAG for #{recipe_path}"
|
497
|
+
return graph
|
498
|
+
end
|
499
|
+
|
406
500
|
def build
|
407
501
|
if @enable_checkpoint
|
408
502
|
@from_checkpoint = @options[:from_checkpoint]
|
data/lib/kameleon/recipe.rb
CHANGED
@@ -21,6 +21,9 @@ module Kameleon
|
|
21
21
|
|
22
22
|
def initialize(path, kwargs = {})
|
23
23
|
@path = Pathname.new(File.expand_path(path))
|
24
|
+
if not @path.exist? and @path.extname != ".yaml"
|
25
|
+
@path = Pathname.new(File.expand_path(path + ".yaml"))
|
26
|
+
end
|
24
27
|
@name = (@path.basename ".yaml").to_s
|
25
28
|
@recipe_content = File.open(@path, 'r') { |f| f.read }
|
26
29
|
@sections = {
|
@@ -90,7 +93,7 @@ module Kameleon
|
|
90
93
|
|
91
94
|
update_steps_dirs()
|
92
95
|
|
93
|
-
# Load
|
96
|
+
# Load extended recipe variables
|
94
97
|
yaml_recipe = load_base_recipe(yaml_recipe, @path)
|
95
98
|
yaml_recipe.delete("extend")
|
96
99
|
|
@@ -775,34 +778,45 @@ module Kameleon
|
|
775
778
|
return recipe_hash
|
776
779
|
end
|
777
780
|
|
778
|
-
def display_info
|
781
|
+
def display_info(do_relative_path)
|
779
782
|
def prefix
|
780
|
-
Kameleon.ui.shell.say " -> ", :
|
783
|
+
Kameleon.ui.shell.say " -> ", :magenta
|
784
|
+
end
|
785
|
+
def relative_or_absolute_path(do_relative_path, path)
|
786
|
+
if do_relative_path
|
787
|
+
return path.relative_path_from(Pathname(Dir.pwd))
|
788
|
+
else
|
789
|
+
return path
|
790
|
+
end
|
781
791
|
end
|
782
|
-
Kameleon.ui.
|
783
|
-
|
784
|
-
Kameleon.ui.
|
785
|
-
|
786
|
-
Kameleon.ui.
|
792
|
+
Kameleon.ui.shell.say
|
793
|
+
Kameleon.ui.shell.say "[Name]", :red
|
794
|
+
prefix ; Kameleon.ui.shell.say "#{@name}"
|
795
|
+
Kameleon.ui.shell.say "[Path]", :red
|
796
|
+
prefix ; Kameleon.ui.shell.say relative_or_absolute_path(do_relative_path, @path), :cyan
|
797
|
+
Kameleon.ui.shell.say "[Description]", :red
|
798
|
+
prefix ; Kameleon.ui.shell.say "#{@metainfo['description']}"
|
799
|
+
Kameleon.ui.shell.say "[Parent recipes]", :red
|
787
800
|
(@base_recipes_files - [@path]).each do |base_recipe_file|
|
788
|
-
prefix ; Kameleon.ui.
|
801
|
+
prefix ; Kameleon.ui.shell.say relative_or_absolute_path(do_relative_path, base_recipe_file), :cyan
|
789
802
|
end
|
790
|
-
Kameleon.ui.
|
803
|
+
Kameleon.ui.shell.say "[Steps]", :red
|
791
804
|
@step_files.each do |step|
|
792
|
-
prefix ; Kameleon.ui.
|
805
|
+
prefix ; Kameleon.ui.shell.say relative_or_absolute_path(do_relative_path, step), :cyan
|
793
806
|
end
|
794
|
-
Kameleon.ui.
|
807
|
+
Kameleon.ui.shell.say "[Data]", :red
|
795
808
|
@data_files.each do |d|
|
796
|
-
prefix ; Kameleon.ui.
|
809
|
+
prefix ; Kameleon.ui.shell.say relative_or_absolute_path(do_relative_path, d), :cyan
|
797
810
|
end
|
798
|
-
Kameleon.ui.
|
811
|
+
Kameleon.ui.shell.say "[Environment scripts]", :red
|
799
812
|
@env_files.each do |d|
|
800
|
-
prefix ; Kameleon.ui.
|
813
|
+
prefix ; Kameleon.ui.shell.say relative_or_absolute_path(do_relative_path, d), :cyan
|
801
814
|
end
|
802
|
-
Kameleon.ui.
|
815
|
+
Kameleon.ui.shell.say "[Variables]", :red
|
803
816
|
@global.sort.map do |key, value|
|
804
817
|
value = "\n" if value.to_s.empty?
|
805
|
-
prefix ; Kameleon.ui.
|
818
|
+
prefix ; Kameleon.ui.shell.say "#{key}: ", :yellow
|
819
|
+
Kameleon.ui.shell.say "#{value}"
|
806
820
|
end
|
807
821
|
end
|
808
822
|
|
data/lib/kameleon/step.rb
CHANGED
@@ -37,6 +37,7 @@ module Kameleon
|
|
37
37
|
|
38
38
|
def value
|
39
39
|
if @value.nil?
|
40
|
+
Kameleon.ui.debug("Parsed string = #{@string_cmd}")
|
40
41
|
object = YAML.load(@string_cmd)
|
41
42
|
if object.kind_of? Command
|
42
43
|
@value = object
|
@@ -58,10 +59,9 @@ module Kameleon
|
|
58
59
|
end
|
59
60
|
@value
|
60
61
|
rescue
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
"#{ lines.join "\n"}"
|
62
|
+
fail RecipeError, "Syntax error after variable resolution for microstep #{@microstep_name}, parsed string =\n"\
|
63
|
+
"#{@string_cmd}\n"\
|
64
|
+
"Maybe you should remove trailing newline from variable using '>-' or '|-'"
|
65
65
|
end
|
66
66
|
|
67
67
|
def to_array
|
data/lib/kameleon/utils.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module Kameleon
|
2
2
|
module Utils
|
3
3
|
|
4
|
+
@@warned_vars = Array.new
|
5
|
+
def self.warn_var(var)
|
6
|
+
if ! @@warned_vars.include?(var)
|
7
|
+
Kameleon.ui.warn("Warning : variable $$#{var[0]} is not enclosed with braces, which may cause errors. Please prefer using $${#{var[0]}}.")
|
8
|
+
@@warned_vars.push(var)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
|
5
13
|
def self.resolve_vars(raw, yaml_path, initial_variables, recipe, kwargs = {})
|
6
14
|
raw = resolve_data_dir_vars(raw, yaml_path, initial_variables, recipe, kwargs)
|
@@ -8,6 +16,9 @@ module Kameleon
|
|
8
16
|
end
|
9
17
|
|
10
18
|
def self.resolve_data_dir_vars(raw, yaml_path, initial_variables, recipe, kwargs)
|
19
|
+
raw.to_s.scan(/\$\$kameleon\_data\_dir\/(.*)/) do |var|
|
20
|
+
warn_var(var)
|
21
|
+
end
|
11
22
|
reg = %r/\$\$kameleon\_data\_dir\/(.*)|\$\${kameleon\_data\_dir}\/(.*)/
|
12
23
|
matches = raw.to_enum(:scan, reg).map { Regexp.last_match }
|
13
24
|
matches.each do |m|
|
@@ -21,6 +32,9 @@ module Kameleon
|
|
21
32
|
end
|
22
33
|
|
23
34
|
def self.resolve_simple_vars_once(raw, initial_variables)
|
35
|
+
raw.to_s.scan(/\$\$([a-zA-Z0-9\-_]+)/) do |var|
|
36
|
+
warn_var(var)
|
37
|
+
end
|
24
38
|
raw.to_s.gsub(/\$\$\{[a-zA-Z0-9\-_]+\}|\$\$[a-zA-Z0-9\-_]+/) do |var|
|
25
39
|
# remove the dollars
|
26
40
|
if var.include? "{"
|
@@ -55,6 +69,9 @@ module Kameleon
|
|
55
69
|
|
56
70
|
|
57
71
|
def self.resolve_simple_vars(raw, yaml_path, initial_variables, kwargs)
|
72
|
+
raw.to_s.scan(/\$\$([a-zA-Z0-9\-_]+)/) do |var|
|
73
|
+
warn_var(var)
|
74
|
+
end
|
58
75
|
raw.to_s.gsub(/\$\$\{[a-zA-Z0-9\-_]+\}|\$\$[a-zA-Z0-9\-_]+/) do |var|
|
59
76
|
# remove the dollars
|
60
77
|
if var.include? "{"
|
@@ -0,0 +1,3 @@
|
|
1
|
+
Warning : variable $$arch is not enclosed with braces, which may cause errors. Please prefer using $${arch}.
|
2
|
+
Warning : variable $$arch-live is not enclosed with braces, which may cause errors. Please prefer using $${arch-live}.
|
3
|
+
Error : /home/neyron/scm/OAR/kameleon/tests/issue76/fail.yaml: variable $$arch-live not found in local or global
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Starting recipe consistency check
|
2
|
+
Resolving variables
|
3
|
+
Warning : variable $$iso_filename is not enclosed with braces, which may cause errors. Please prefer using $${iso_filename}.
|
4
|
+
Warning : variable $$toto is not enclosed with braces, which may cause errors. Please prefer using $${toto}.
|
5
|
+
Warning : variable $$titi is not enclosed with braces, which may cause errors. Please prefer using $${titi}.
|
6
|
+
Creating kameleon build directory : /home/neyron/scm/OAR/kameleon/tests/issue76/build/ok
|
7
|
+
Starting build recipe 'ok.yaml'
|
8
|
+
Step _init_bootstrap took: 0 secs
|
9
|
+
Step 1 : bootstrap/testbootstrap/step
|
10
|
+
--> Running the step...
|
11
|
+
Starting command: "bash"
|
12
|
+
[local] The local_context has been initialized
|
13
|
+
[local] debian-jessie-x86_64-live.iso x86_64-toto
|
14
|
+
Step testbootstrap took: 1 secs
|
15
|
+
Step 2 : bootstrap/testbootstrapinline/step
|
16
|
+
--> Running the step...
|
17
|
+
[local] debian-jessie-x86_64-live.iso
|
18
|
+
Step testbootstrapinline took: 0 secs
|
19
|
+
Step _clean_bootstrap took: 0 secs
|
20
|
+
Step _init_setup took: 0 secs
|
21
|
+
Step _clean_setup took: 0 secs
|
22
|
+
Step _init_export took: 0 secs
|
23
|
+
Step _clean_export took: 0 secs
|
24
|
+
|
25
|
+
Successfully built 'ok.yaml'
|
26
|
+
Total duration : 1 secs
|
@@ -0,0 +1 @@
|
|
1
|
+
This is DATA!!!
|
@@ -13,7 +13,7 @@ checkpoint: test.yaml
|
|
13
13
|
#== Global variables use by Kameleon engine and the steps
|
14
14
|
global:
|
15
15
|
## User varibales : used by the recipe
|
16
|
-
user_name:
|
16
|
+
user_name: kameleon_user
|
17
17
|
user_password: $$user_name
|
18
18
|
|
19
19
|
# test overload
|
@@ -29,7 +29,10 @@ global:
|
|
29
29
|
|
30
30
|
bootstrap_packages: >
|
31
31
|
less vim python
|
32
|
+
sl sudo
|
32
33
|
|
34
|
+
version: 12.2
|
35
|
+
variant: toto-tata
|
33
36
|
#== Bootstrap the new system and create the 'in_context'
|
34
37
|
bootstrap:
|
35
38
|
- enable_something
|
@@ -38,6 +41,18 @@ bootstrap:
|
|
38
41
|
|
39
42
|
setup:
|
40
43
|
- software_install
|
44
|
+
- inline_step:
|
45
|
+
- do_something:
|
46
|
+
- exec_local: >
|
47
|
+
echo $${toto} ;\
|
48
|
+
echo titi
|
49
|
+
- do_something_else:
|
50
|
+
- exec_local: |
|
51
|
+
echo $$toto $$user_name
|
52
|
+
- test_data:
|
53
|
+
- exec_local: cat $$kameleon_data_dir/mydata.txt
|
54
|
+
- local_variables
|
55
|
+
|
41
56
|
|
42
57
|
export:
|
43
58
|
- save_appliance:
|
@@ -0,0 +1 @@
|
|
1
|
+
This is OVERRIDED DATA!!!
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.7.
|
1
|
+
2.7.3
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kameleon-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.7.
|
5
|
-
prerelease:
|
4
|
+
version: 2.7.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Salem Harrache
|
@@ -13,68 +12,90 @@ authors:
|
|
13
12
|
autorequire:
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
|
-
date: 2016-
|
15
|
+
date: 2016-06-20 00:00:00.000000000 Z
|
17
16
|
dependencies:
|
18
17
|
- !ruby/object:Gem::Dependency
|
19
18
|
name: childprocess
|
20
19
|
requirement: !ruby/object:Gem::Requirement
|
21
|
-
none: false
|
22
20
|
requirements:
|
23
|
-
- - ~>
|
21
|
+
- - "~>"
|
24
22
|
- !ruby/object:Gem::Version
|
25
23
|
version: 0.5.3
|
26
|
-
- -
|
24
|
+
- - ">="
|
27
25
|
- !ruby/object:Gem::Version
|
28
26
|
version: 0.3.0
|
29
27
|
type: :runtime
|
30
28
|
prerelease: false
|
31
29
|
version_requirements: !ruby/object:Gem::Requirement
|
32
|
-
none: false
|
33
30
|
requirements:
|
34
|
-
- - ~>
|
31
|
+
- - "~>"
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: 0.5.3
|
37
|
-
- -
|
34
|
+
- - ">="
|
38
35
|
- !ruby/object:Gem::Version
|
39
36
|
version: 0.3.0
|
40
37
|
- !ruby/object:Gem::Dependency
|
41
38
|
name: thor
|
42
39
|
requirement: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
40
|
requirements:
|
45
|
-
- - ~>
|
41
|
+
- - "~>"
|
46
42
|
- !ruby/object:Gem::Version
|
47
43
|
version: '0.19'
|
48
|
-
- -
|
44
|
+
- - ">="
|
49
45
|
- !ruby/object:Gem::Version
|
50
46
|
version: 0.15.0
|
51
47
|
type: :runtime
|
52
48
|
prerelease: false
|
53
49
|
version_requirements: !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
50
|
requirements:
|
56
|
-
- - ~>
|
51
|
+
- - "~>"
|
57
52
|
- !ruby/object:Gem::Version
|
58
53
|
version: '0.19'
|
59
|
-
- -
|
54
|
+
- - ">="
|
60
55
|
- !ruby/object:Gem::Version
|
61
56
|
version: 0.15.0
|
62
57
|
- !ruby/object:Gem::Dependency
|
63
58
|
name: table_print
|
64
59
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
60
|
requirements:
|
67
|
-
- - ~>
|
61
|
+
- - "~>"
|
68
62
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.5
|
63
|
+
version: '1.5'
|
70
64
|
type: :runtime
|
71
65
|
prerelease: false
|
72
66
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
67
|
requirements:
|
75
|
-
- - ~>
|
68
|
+
- - "~>"
|
76
69
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.5
|
70
|
+
version: '1.5'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: psych
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.0'
|
78
|
+
type: :runtime
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '2.0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: ruby-graphviz
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '1.2'
|
92
|
+
type: :runtime
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '1.2'
|
78
99
|
description: The mindful appliance builder
|
79
100
|
email:
|
80
101
|
- salem.harrache@inria.fr
|
@@ -87,16 +108,16 @@ executables:
|
|
87
108
|
extensions: []
|
88
109
|
extra_rdoc_files: []
|
89
110
|
files:
|
90
|
-
- .bumpversion.cfg
|
91
|
-
- .editorconfig
|
92
|
-
- .env
|
93
|
-
- .gitignore
|
111
|
+
- ".bumpversion.cfg"
|
112
|
+
- ".editorconfig"
|
113
|
+
- ".env"
|
114
|
+
- ".gitignore"
|
94
115
|
- AUTHORS
|
95
116
|
- CHANGES
|
96
117
|
- COPYING
|
97
118
|
- Gemfile
|
98
119
|
- README.rst
|
99
|
-
- RELEASING
|
120
|
+
- RELEASING.rst
|
100
121
|
- Vagrantfile
|
101
122
|
- bin/kameleon
|
102
123
|
- completion/_kameleon
|
@@ -156,56 +177,76 @@ files:
|
|
156
177
|
- lib/kameleon/version.rb
|
157
178
|
- scripts/bumpversion.py
|
158
179
|
- tests/helper.rb
|
180
|
+
- tests/issue76/fail.stdout
|
181
|
+
- tests/issue76/fail.yaml
|
182
|
+
- tests/issue76/ok.stdout
|
183
|
+
- tests/issue76/ok.yaml
|
184
|
+
- tests/issue76/steps/testbootstrap.yaml
|
159
185
|
- tests/recipes/steps/aliases/defaults.yaml
|
160
186
|
- tests/recipes/steps/bootstrap/linux/bootstrap.yaml
|
161
187
|
- tests/recipes/steps/checkpoints/test.yaml
|
188
|
+
- tests/recipes/steps/data/mydata.txt
|
162
189
|
- tests/recipes/steps/enable_something.yaml
|
163
190
|
- tests/recipes/steps/export/save_appliance.yaml
|
191
|
+
- tests/recipes/steps/local_variables.yaml
|
164
192
|
- tests/recipes/steps/setup/linux/software_install.yaml
|
165
193
|
- tests/recipes/test_recipe.yaml
|
194
|
+
- tests/recipes/test_recipe_child.yaml
|
195
|
+
- tests/test2/steps/data/mydata.txt
|
166
196
|
- tests/test2/test2.yaml
|
167
197
|
- tests/test2/test3.yaml
|
198
|
+
- tests/test2/test_data.yaml
|
168
199
|
- tests/test_context.rb
|
169
200
|
- tests/test_recipe.rb
|
170
201
|
- tests/test_version.rb
|
171
202
|
- version.txt
|
172
203
|
homepage: http://kameleon.imag.fr/
|
173
204
|
licenses:
|
174
|
-
- GPL-2
|
205
|
+
- GPL-2.0
|
206
|
+
metadata: {}
|
175
207
|
post_install_message:
|
176
208
|
rdoc_options: []
|
177
209
|
require_paths:
|
178
210
|
- lib
|
179
211
|
required_ruby_version: !ruby/object:Gem::Requirement
|
180
|
-
none: false
|
181
212
|
requirements:
|
182
|
-
- -
|
213
|
+
- - ">="
|
183
214
|
- !ruby/object:Gem::Version
|
184
215
|
version: '0'
|
185
216
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
217
|
requirements:
|
188
|
-
- -
|
218
|
+
- - ">="
|
189
219
|
- !ruby/object:Gem::Version
|
190
220
|
version: '0'
|
191
221
|
requirements:
|
192
222
|
- polipo 1.0.3, or greater
|
223
|
+
- graphviz 2.38.0 or greater
|
193
224
|
rubyforge_project:
|
194
|
-
rubygems_version:
|
225
|
+
rubygems_version: 2.5.1
|
195
226
|
signing_key:
|
196
|
-
specification_version:
|
227
|
+
specification_version: 4
|
197
228
|
summary: Kameleon is a tool to build virtual machines from scratch
|
198
229
|
test_files:
|
199
230
|
- tests/helper.rb
|
231
|
+
- tests/issue76/fail.stdout
|
232
|
+
- tests/issue76/fail.yaml
|
233
|
+
- tests/issue76/ok.stdout
|
234
|
+
- tests/issue76/ok.yaml
|
235
|
+
- tests/issue76/steps/testbootstrap.yaml
|
200
236
|
- tests/recipes/steps/aliases/defaults.yaml
|
201
237
|
- tests/recipes/steps/bootstrap/linux/bootstrap.yaml
|
202
238
|
- tests/recipes/steps/checkpoints/test.yaml
|
239
|
+
- tests/recipes/steps/data/mydata.txt
|
203
240
|
- tests/recipes/steps/enable_something.yaml
|
204
241
|
- tests/recipes/steps/export/save_appliance.yaml
|
242
|
+
- tests/recipes/steps/local_variables.yaml
|
205
243
|
- tests/recipes/steps/setup/linux/software_install.yaml
|
206
244
|
- tests/recipes/test_recipe.yaml
|
245
|
+
- tests/recipes/test_recipe_child.yaml
|
246
|
+
- tests/test2/steps/data/mydata.txt
|
207
247
|
- tests/test2/test2.yaml
|
208
248
|
- tests/test2/test3.yaml
|
249
|
+
- tests/test2/test_data.yaml
|
209
250
|
- tests/test_context.rb
|
210
251
|
- tests/test_recipe.rb
|
211
252
|
- tests/test_version.rb
|
data/RELEASING
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
You can use the script ``./scripts/bumpversion.py`` which will handle
|
2
|
-
everything (incrementation, git tag creation, changelog update).
|
3
|
-
|
4
|
-
1) After each release, a new version has to be created (in this example, the 2.7.0 dev)
|
5
|
-
|
6
|
-
$ python2 ./scripts/bumpversion.py newversion minor # 2.6.7 -> 2.7.0.dev
|
7
|
-
|
8
|
-
[work/commit]
|
9
|
-
|
10
|
-
2) Releasing a new version
|
11
|
-
|
12
|
-
$ python2 ./scripts/bumpversion.py release # 2.7.0.dev -> 2.7.0 + git tag + changelog
|
13
|
-
$ gem build kameleon-builder.gemspec
|
14
|
-
$ gem push kameleon-builder-2.7.0.gem
|
15
|
-
|
16
|
-
You need a rubygem account and I have to give you permissions so that you can push
|