kameleon-builder 2.7.2 → 2.7.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|