kameleon-builder 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.editorconfig +0 -0
- data/CHANGELOG.rst +87 -0
- data/docs/Makefile +1 -1
- data/docs/source/context.rst +3 -1
- data/docs/source/debian7.yaml +128 -0
- data/docs/source/debian_customized.yaml +28 -0
- data/docs/source/debian_customized_g5k.yaml +21 -0
- data/docs/source/grid5000_tutorial.rst +435 -32
- data/docs/source/installation.rst +8 -0
- data/docs/source/tau_install_g5k.yaml +24 -0
- data/ext/mkrf_conf.rb +58 -0
- data/kameleon-builder.gemspec +7 -6
- data/lib/kameleon.rb +6 -2
- data/lib/kameleon/compat.rb +23 -1
- data/lib/kameleon/context.rb +8 -2
- data/lib/kameleon/engine.rb +19 -17
- data/lib/kameleon/persistent_cache.rb +11 -6
- data/lib/kameleon/recipe.rb +15 -4
- data/lib/kameleon/shell.rb +12 -13
- data/lib/kameleon/step.rb +19 -6
- data/lib/kameleon/utils.rb +5 -2
- data/templates/debian7-g5k.yaml +2 -2
- data/templates/debian7-kameleon.yaml +43 -0
- data/templates/debian7.yaml +1 -1
- data/templates/docker-debian7.yaml +107 -0
- data/templates/steps/bootstrap/initialize_disk_chroot.yaml +1 -1
- data/templates/steps/bootstrap/initialize_disk_qemu.yaml +1 -1
- data/templates/steps/bootstrap/prepare_docker.yaml +37 -35
- data/templates/steps/bootstrap/prepare_qemu.yaml +1 -1
- data/templates/steps/bootstrap/start_docker.yaml +6 -2
- data/templates/steps/bootstrap/start_qemu.yaml +2 -2
- data/templates/steps/checkpoints/qemu.yaml +1 -1
- data/templates/steps/export/save_appliance_from_g5k.yaml +1 -1
- data/version.txt +1 -1
- metadata +15 -7
- data/templates/debian7-docker.yaml +0 -111
@@ -1,6 +1,14 @@
|
|
1
|
+
.. _`installation`:
|
2
|
+
|
1
3
|
------------
|
2
4
|
Installation
|
3
5
|
------------
|
6
|
+
|
7
|
+
The easiest way to install and test Kameleon if you
|
8
|
+
are using a Debian based linux distribution is by using the deb package available at `kameleon_deb`_.
|
9
|
+
|
10
|
+
.. _kameleon_deb: http://kameleon.imag.fr/pkg/kameleon_2.1.0+20140612204940-1_amd64.deb
|
11
|
+
|
4
12
|
.. note::
|
5
13
|
On debian based distribution be sure to install the ``ruby-dev`` package first
|
6
14
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
- get_tau:
|
2
|
+
- exec_local: cd /tmp/
|
3
|
+
- exec_local: wget -q http://www.cs.uoregon.edu/research/tau/tau_releases/tau-2.22.2.tar.gz
|
4
|
+
- exec_local: wget -q http://www.cs.uoregon.edu/research/tau/pdt_releases/pdt-3.19.tar.gz
|
5
|
+
- local2in:
|
6
|
+
- /tmp/tau-2.22.2.tar.gz
|
7
|
+
- /tmp/tau-2.22.2.tar.gz
|
8
|
+
- local2in:
|
9
|
+
- /tmp/pdt-3.19.tar.gz
|
10
|
+
- /tmp/pdt-3.19.tar.gz
|
11
|
+
- pdt_install:
|
12
|
+
- exec_in: cd /tmp/
|
13
|
+
- exec_in: tar -xzf pdt-3.19.tar.gz
|
14
|
+
- exec_in: cd /tmp/pdtoolkit-3.19
|
15
|
+
- exec_in: ./configure -prefix=/usr/local/pdt-install
|
16
|
+
- exec_in: make clean install
|
17
|
+
|
18
|
+
- tau_install:
|
19
|
+
- exec_in: cd /tmp/
|
20
|
+
- exec_in: tar -xzf tau-2.22.2.tar.gz
|
21
|
+
- exec_in: cd /tmp/tau-2.22.2
|
22
|
+
# - exec_in: ./configure -prefix=/usr/local/tau-install -pdt=/usr/local/pdt-install/ -mpiinc=/usr/local/openmpi-install/include -mpilib=/usr/local/openmpi-install/lib
|
23
|
+
- exec_in: ./configure -prefix=/usr/local/tau-install -pdt=/usr/local/pdt-install/ -mpiinc=/usr/include/openmpi/ -mpilib=/usr/lib/openmpi/
|
24
|
+
- exec_in: make install
|
data/ext/mkrf_conf.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# Based on: http://www.programmersparadox.com/2012/05/21/gemspec-loading-dependent-gems-based-on-the-users-system/
|
2
|
+
|
3
|
+
# This file needs to be named mkrf_conf.rb
|
4
|
+
# so that rubygems will recognize it as a ruby extension
|
5
|
+
# file and not think it is a C extension file
|
6
|
+
|
7
|
+
jruby = defined?(JRUBY_VERSION) || (defined?(RUBY_ENGINE) && 'jruby' == RUBY_ENGINE)
|
8
|
+
rbx = defined?(RUBY_ENGINE) && 'rbx' == RUBY_ENGINE
|
9
|
+
|
10
|
+
def already_installed(dep)
|
11
|
+
!Gem::DependencyInstaller.new(:domain => :local).find_gems_with_sources(dep).empty? ||
|
12
|
+
!Gem::DependencyInstaller.new(:domain => :local,:prerelease => true).find_gems_with_sources(dep).empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Load up the rubygem's dependency installer to
|
16
|
+
# installer the gems we want based on the version
|
17
|
+
# of Ruby the user has installed
|
18
|
+
|
19
|
+
unless jruby || rbx
|
20
|
+
require 'rubygems'
|
21
|
+
require 'rubygems/command.rb'
|
22
|
+
require 'rubygems/dependency.rb'
|
23
|
+
require 'rubygems/dependency_installer.rb'
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
begin
|
28
|
+
Gem::Command.build_args = ARGV
|
29
|
+
rescue NoMethodError
|
30
|
+
end
|
31
|
+
|
32
|
+
if RUBY_VERSION > "2.0"
|
33
|
+
dep = Gem::Dependency.new("syck", '> 0')
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
puts "Installing base gem"
|
38
|
+
inst = Gem::DependencyInstaller.new
|
39
|
+
inst.install dep
|
40
|
+
rescue
|
41
|
+
inst = Gem::DependencyInstaller.new(:prerelease => true)
|
42
|
+
begin
|
43
|
+
inst.install dep
|
44
|
+
rescue Exception => e
|
45
|
+
puts e
|
46
|
+
puts e.backtrace.join "\n "
|
47
|
+
exit(1)
|
48
|
+
end
|
49
|
+
end unless dep.nil? || already_installed(dep)
|
50
|
+
end
|
51
|
+
|
52
|
+
# If this was C, rubygems would attempt to run make
|
53
|
+
# Since this is Ruby, rubygems will attempt to run rake
|
54
|
+
# If it doesn't find and successfully run a rakefile, it errors out
|
55
|
+
f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w")
|
56
|
+
f.write("task :default\n")
|
57
|
+
f.close
|
58
|
+
|
data/kameleon-builder.gemspec
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
RUBYONEX = RUBY_VERSION < "2.0"
|
3
|
-
|
4
2
|
lib = File.expand_path('../lib', __FILE__)
|
5
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
4
|
require 'kameleon/version'
|
@@ -26,18 +24,21 @@ Gem::Specification.new do |s|
|
|
26
24
|
s.test_files = s.files.grep(%r{^(tests|s|features)/})
|
27
25
|
s.require_paths = ["lib"]
|
28
26
|
|
29
|
-
s.required_ruby_version = RUBYONEX ? '>= 1.9.3' : '>= 2.0.0'
|
30
|
-
|
31
27
|
s.add_dependency 'childprocess', '~> 0.5'
|
32
28
|
s.add_dependency 'thor', '~> 0.15'
|
33
29
|
s.add_dependency 'table_print', '~> 1.5'
|
34
30
|
s.add_dependency 'log4r-color', '~> 1.2'
|
35
|
-
s.add_dependency '
|
36
|
-
|
31
|
+
s.add_dependency 'diffy', '~> 3.0'
|
32
|
+
# Syck is also a dependency for Ruby 2 environments.
|
33
|
+
# It is installed at install-time if necessary,
|
34
|
+
# via ext/mkrf_conf.rb
|
37
35
|
|
38
36
|
s.add_development_dependency 'pry', '~> 0.9'
|
39
37
|
s.add_development_dependency 'pry-debugger', '~> 0.2'
|
40
38
|
s.add_development_dependency 'rake', '~> 10.1'
|
41
39
|
s.add_development_dependency 'minitest', '~> 4.7'
|
42
40
|
s.add_development_dependency 'coveralls', '~> 0.7'
|
41
|
+
|
42
|
+
# To allow installing the Syck gem when Ruby version is >2.0.0
|
43
|
+
s.extensions = ["ext/mkrf_conf.rb"]
|
43
44
|
end
|
data/lib/kameleon.rb
CHANGED
@@ -19,8 +19,12 @@ module Kameleon
|
|
19
19
|
:FATAL)
|
20
20
|
|
21
21
|
class << self
|
22
|
-
attr_writer :logger
|
23
|
-
|
22
|
+
attr_writer :logger
|
23
|
+
attr_writer :env
|
24
|
+
attr_writer :source_root
|
25
|
+
attr_writer :templates_path
|
26
|
+
attr_writer :templates_names
|
27
|
+
attr_writer :templates_files
|
24
28
|
|
25
29
|
# The source root is the path to the root directory of the kameleon gem.
|
26
30
|
def source_root
|
data/lib/kameleon/compat.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'yaml'
|
3
|
+
require 'syck'
|
3
4
|
|
4
|
-
YAML::ENGINE.yamler = 'syck' if
|
5
|
+
YAML::ENGINE.yamler = 'syck' if defined?(YAML::ENGINE)
|
5
6
|
|
6
7
|
if RUBY_VERSION < "1.9.3"
|
7
8
|
# Backport of missing SecureRandom methods from 1.9
|
@@ -37,3 +38,24 @@ if RUBY_VERSION < "1.9.3"
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
41
|
+
|
42
|
+
|
43
|
+
class Object
|
44
|
+
##
|
45
|
+
# @person ? @person.name :nil
|
46
|
+
# vs
|
47
|
+
# @person.try(:name)
|
48
|
+
def try(method)
|
49
|
+
send method if respond_to? method
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Hash
|
54
|
+
def self.try_convert(obj)
|
55
|
+
obj.try(:to_hash)
|
56
|
+
end
|
57
|
+
|
58
|
+
def flatten
|
59
|
+
to_a.flatten!
|
60
|
+
end
|
61
|
+
end
|
data/lib/kameleon/context.rb
CHANGED
@@ -3,7 +3,8 @@ require 'kameleon/shell'
|
|
3
3
|
module Kameleon
|
4
4
|
class Context
|
5
5
|
|
6
|
-
attr_accessor :shell
|
6
|
+
attr_accessor :shell
|
7
|
+
attr_accessor :name
|
7
8
|
|
8
9
|
def initialize(name, cmd, workdir, exec_prefix, local_workdir)
|
9
10
|
@name = name.downcase
|
@@ -80,10 +81,13 @@ module Kameleon
|
|
80
81
|
|
81
82
|
def lazyload_shell()
|
82
83
|
unless @shell.started?
|
84
|
+
@shell.restart
|
83
85
|
# Start the shell process
|
84
|
-
@shell.start
|
85
86
|
execute("echo The '#{name}_context' has been initialized", :log_level => "info")
|
86
87
|
end
|
88
|
+
rescue
|
89
|
+
@shell.stop
|
90
|
+
raise
|
87
91
|
end
|
88
92
|
|
89
93
|
def start_shell
|
@@ -91,6 +95,8 @@ module Kameleon
|
|
91
95
|
lazyload_shell
|
92
96
|
@logger.info("Starting interactive shell")
|
93
97
|
@shell.fork_and_wait
|
98
|
+
rescue ShellError => e
|
99
|
+
e.message.split( /\r?\n/ ).each {|m| @logger.error m }
|
94
100
|
end
|
95
101
|
|
96
102
|
def closed?
|
data/lib/kameleon/engine.rb
CHANGED
@@ -5,7 +5,10 @@ require 'kameleon/persistent_cache'
|
|
5
5
|
module Kameleon
|
6
6
|
|
7
7
|
class Engine
|
8
|
-
attr_accessor :recipe
|
8
|
+
attr_accessor :recipe
|
9
|
+
attr_accessor :cwd
|
10
|
+
attr_accessor :build_recipe_path
|
11
|
+
attr_accessor :pretty_list_checkpoints
|
9
12
|
|
10
13
|
def initialize(recipe, options)
|
11
14
|
@options = options
|
@@ -250,9 +253,9 @@ module Kameleon
|
|
250
253
|
raise AbortError, "Execution aborted..."
|
251
254
|
elsif answer.eql? "c"
|
252
255
|
## resetting the exit status
|
253
|
-
@in_context.execute("true")
|
254
|
-
@out_context.execute("true")
|
255
|
-
@local_context.execute("true")
|
256
|
+
@in_context.execute("true") unless @in_context.closed?
|
257
|
+
@out_context.execute("true") unless @out_context.closed?
|
258
|
+
@local_context.execute("true") unless @local_context.closed?
|
256
259
|
return true
|
257
260
|
elsif answer.eql? "r"
|
258
261
|
@logger.notice("Retrying the previous command...")
|
@@ -331,24 +334,23 @@ module Kameleon
|
|
331
334
|
do_steps(section)
|
332
335
|
end
|
333
336
|
clean
|
334
|
-
rescue
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
337
|
+
rescue Exception => e
|
338
|
+
if e.is_a?(AbortError)
|
339
|
+
@logger.error("Aborted...")
|
340
|
+
elsif e.is_a?(SystemExit) || e.is_a?(Interrupt)
|
341
|
+
@logger.error("Interrupted...")
|
342
|
+
@out_context.reopen
|
343
|
+
@in_context.reopen
|
344
|
+
@local_context.reopen
|
345
|
+
else
|
346
|
+
@logger.fatal("fatal error...")
|
347
|
+
end
|
344
348
|
@logger.warn("Waiting for cleanup before exiting...")
|
345
349
|
clean
|
346
|
-
raise e
|
347
|
-
rescue Exception => e
|
348
350
|
@out_context.close!
|
349
351
|
@in_context.close!
|
350
352
|
@local_context.close!
|
351
|
-
raise
|
353
|
+
raise
|
352
354
|
end
|
353
355
|
end
|
354
356
|
|
@@ -7,8 +7,14 @@ module Kameleon
|
|
7
7
|
class Persistent_cache
|
8
8
|
|
9
9
|
include Singleton
|
10
|
-
attr_reader :polipo_env
|
11
|
-
|
10
|
+
attr_reader :polipo_env
|
11
|
+
attr_reader :cache_dir
|
12
|
+
attr_reader :polipo_port
|
13
|
+
attr_writer :activated
|
14
|
+
attr_reader :cwd
|
15
|
+
attr_reader :polipo_path
|
16
|
+
attr_reader :name
|
17
|
+
|
12
18
|
def initialize()
|
13
19
|
@logger = Log4r::Logger.new("kameleon::[kameleon]")
|
14
20
|
## we must configure Polipo to be execute for the in and out context
|
@@ -25,7 +31,6 @@ module Kameleon
|
|
25
31
|
:idleTime => "5",
|
26
32
|
:chunkHighMark => "425165824",
|
27
33
|
:proxyPort => @polipo_port,
|
28
|
-
#:proxyOffline => "true"
|
29
34
|
:relaxTransparency =>"true"
|
30
35
|
}
|
31
36
|
|
@@ -61,7 +66,7 @@ module Kameleon
|
|
61
66
|
|
62
67
|
if @polipo_path.nil? then
|
63
68
|
@logger.error("Polipo binary not found, make sure it is in your current PATH")
|
64
|
-
@logger.error("or use the option --
|
69
|
+
@logger.error("or use the option --proxy-path")
|
65
70
|
raise BuildError, "Failed to use persistent cache"
|
66
71
|
end
|
67
72
|
end
|
@@ -77,7 +82,7 @@ module Kameleon
|
|
77
82
|
end
|
78
83
|
|
79
84
|
def create_cache_directory(step_name)
|
80
|
-
@logger.notice("Creating
|
85
|
+
@logger.notice("Creating cache directory #{step_name} for Polipo")
|
81
86
|
directory_name = @cache_dir + "/#{step_name}"
|
82
87
|
FileUtils.mkdir_p directory_name
|
83
88
|
directory_name
|
@@ -87,7 +92,7 @@ module Kameleon
|
|
87
92
|
## This function assumes that the cache directory has already been created by the engine
|
88
93
|
## Stopping first the previous proxy
|
89
94
|
## have to check if polipo is running
|
90
|
-
@logger.
|
95
|
+
@logger.debug("Starting web proxy Polipo in directory #{directory} using port: #{@polipo_port}")
|
91
96
|
@polipo_process.stop unless @polipo_process.nil?
|
92
97
|
command = ["#{@polipo_path}/polipo"]
|
93
98
|
@polipo_cmd_options[:diskCacheRoot] = directory
|
data/lib/kameleon/recipe.rb
CHANGED
@@ -4,8 +4,15 @@ require 'kameleon/step'
|
|
4
4
|
module Kameleon
|
5
5
|
|
6
6
|
class Recipe
|
7
|
-
attr_accessor :path
|
8
|
-
|
7
|
+
attr_accessor :path
|
8
|
+
attr_accessor :name
|
9
|
+
attr_accessor :global
|
10
|
+
attr_accessor :sections
|
11
|
+
attr_accessor :aliases
|
12
|
+
attr_accessor :aliases_path
|
13
|
+
attr_accessor :checkpoint
|
14
|
+
attr_accessor :checkpoint_path
|
15
|
+
attr_accessor :metainfo
|
9
16
|
|
10
17
|
def initialize(path)
|
11
18
|
@logger = Log4r::Logger.new("kameleon::[kameleon]")
|
@@ -51,7 +58,7 @@ module Kameleon
|
|
51
58
|
# Load Global variables
|
52
59
|
@global.merge!(yaml_recipe.fetch("global", {}))
|
53
60
|
# Resolve dynamically-defined variables !!
|
54
|
-
resolved_global = Utils.resolve_vars(@global.to_yaml, @path, @global)
|
61
|
+
resolved_global = Utils.resolve_vars(@global.to_yaml, @path, @global, :strict => false)
|
55
62
|
@global.merge! YAML.load(resolved_global)
|
56
63
|
|
57
64
|
# Loads aliases
|
@@ -91,7 +98,7 @@ module Kameleon
|
|
91
98
|
if not args.nil?
|
92
99
|
args.each do |arg|
|
93
100
|
if arg.kind_of? Hash
|
94
|
-
if arg.
|
101
|
+
if arg[arg.keys[0]].kind_of? Array
|
95
102
|
embedded_step = true
|
96
103
|
end
|
97
104
|
end
|
@@ -298,6 +305,10 @@ module Kameleon
|
|
298
305
|
end
|
299
306
|
|
300
307
|
def resolve!
|
308
|
+
# Resolve dynamically-defined variables !!
|
309
|
+
resolved_global = Utils.resolve_vars(@global.to_yaml, @path, @global)
|
310
|
+
@global.merge! YAML.load(resolved_global)
|
311
|
+
|
301
312
|
consistency_check
|
302
313
|
resolve_checkpoint unless @checkpoint.nil?
|
303
314
|
|
data/lib/kameleon/shell.rb
CHANGED
@@ -8,7 +8,9 @@ module Kameleon
|
|
8
8
|
READ_CHUNK_SIZE = 1048576
|
9
9
|
EXIT_TIMEOUT = 60
|
10
10
|
|
11
|
-
attr :exit_status
|
11
|
+
attr :exit_status
|
12
|
+
attr :process
|
13
|
+
attr :shell_cmd
|
12
14
|
|
13
15
|
def initialize(context_name, cmd, shell_workdir, local_workdir, kwargs = {})
|
14
16
|
@logger = Log4r::Logger.new("kameleon::[kameleon]")
|
@@ -30,16 +32,6 @@ module Kameleon
|
|
30
32
|
|
31
33
|
## Changing the default bashrc if the cache is activated
|
32
34
|
@cache = Kameleon::Persistent_cache.instance
|
33
|
-
if @cache.activated? then
|
34
|
-
new_kameleon_bashrc = Tempfile.new('kameleon_bashrc').path
|
35
|
-
FileUtils.cp @default_bashrc_file, new_kameleon_bashrc
|
36
|
-
tpl = ERB.new(File.read(@cache.polipo_env))
|
37
|
-
polipo_env_content = tpl.result(binding)
|
38
|
-
File.open(new_kameleon_bashrc,'a') do |f|
|
39
|
-
f.puts(polipo_env_content)
|
40
|
-
end
|
41
|
-
@default_bashrc_file = new_kameleon_bashrc
|
42
|
-
end
|
43
35
|
|
44
36
|
@shell_cmd = "source #{@default_bashrc_file} 2> /dev/null; "\
|
45
37
|
"#{@cmd} --rcfile #{@bashrc_file}"
|
@@ -56,7 +48,10 @@ module Kameleon
|
|
56
48
|
end
|
57
49
|
|
58
50
|
def stop
|
59
|
-
|
51
|
+
unless @process.nil?
|
52
|
+
@process.stop(0)
|
53
|
+
@process = nil
|
54
|
+
end
|
60
55
|
end
|
61
56
|
|
62
57
|
def started?
|
@@ -64,7 +59,7 @@ module Kameleon
|
|
64
59
|
end
|
65
60
|
|
66
61
|
def exited?
|
67
|
-
@process.exited?
|
62
|
+
return !@process.nil? && @process.exited?
|
68
63
|
end
|
69
64
|
|
70
65
|
def restart
|
@@ -98,6 +93,10 @@ module Kameleon
|
|
98
93
|
if File.file?(@default_bashrc_file)
|
99
94
|
tpl = ERB.new(File.read(@default_bashrc_file))
|
100
95
|
bashrc_content = tpl.result(binding)
|
96
|
+
if @cache.activated? then
|
97
|
+
tpl = ERB.new(File.read(@cache.polipo_env))
|
98
|
+
bashrc_content << "\n" + ERB.new(File.read(@cache.polipo_env)).result(binding)
|
99
|
+
end
|
101
100
|
end
|
102
101
|
bashrc = Shellwords.escape(bashrc_content)
|
103
102
|
if @shell_workdir
|
data/lib/kameleon/step.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Kameleon
|
2
2
|
|
3
3
|
class Command
|
4
|
-
attr_accessor :string_cmd
|
4
|
+
attr_accessor :string_cmd
|
5
|
+
attr_accessor :microstep_name
|
5
6
|
|
6
7
|
def initialize(yaml_cmd, microstep_name)
|
7
8
|
@string_cmd = YAML.dump(yaml_cmd).gsub("---", "").strip
|
@@ -72,8 +73,13 @@ module Kameleon
|
|
72
73
|
end
|
73
74
|
|
74
75
|
class Microstep
|
75
|
-
attr_accessor :commands
|
76
|
-
|
76
|
+
attr_accessor :commands
|
77
|
+
attr_accessor :name
|
78
|
+
attr_accessor :identifier
|
79
|
+
attr_accessor :slug
|
80
|
+
attr_accessor :in_cache
|
81
|
+
attr_accessor :on_checkpoint
|
82
|
+
attr_accessor :order
|
77
83
|
|
78
84
|
def initialize(string_or_hash)
|
79
85
|
@identifier = nil
|
@@ -128,8 +134,12 @@ module Kameleon
|
|
128
134
|
end
|
129
135
|
|
130
136
|
class Macrostep
|
131
|
-
attr_accessor :name
|
132
|
-
|
137
|
+
attr_accessor :name
|
138
|
+
attr_accessor :clean_microsteps
|
139
|
+
attr_accessor :init_microsteps
|
140
|
+
attr_accessor :microsteps
|
141
|
+
attr_accessor :path
|
142
|
+
attr_accessor :variables
|
133
143
|
|
134
144
|
def initialize(name, microsteps, variables, path)
|
135
145
|
@name = name
|
@@ -180,7 +190,10 @@ module Kameleon
|
|
180
190
|
end
|
181
191
|
|
182
192
|
class Section
|
183
|
-
attr_accessor :name
|
193
|
+
attr_accessor :name
|
194
|
+
attr_accessor :clean_macrostep
|
195
|
+
attr_accessor :init_macrostep
|
196
|
+
attr_accessor :macrosteps
|
184
197
|
|
185
198
|
def initialize(name)
|
186
199
|
@name = name
|