nuri 0.5.4 → 0.5.5
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.md +12 -3
- data/VERSION +1 -1
- data/bin/nuri +10 -7
- data/nuri.gemspec +17 -17
- metadata +19 -94
- data/examples/.gitignore +0 -4
- data/examples/bonfire.sfp +0 -87
- data/examples/bonfire/epcc.sfp +0 -43
- data/examples/bonfire/epcc0.sfp +0 -49
- data/examples/bonfire/epcc2.sfp +0 -52
- data/examples/bonfire/epcc2a.sfp +0 -25
- data/examples/bonfire/inria.sfp +0 -72
- data/examples/bonfire/inria0.sfp +0 -49
- data/examples/bonfire/inria2.sfp +0 -71
- data/examples/bonfire/inria2a.sfp +0 -44
- data/examples/bonfire/inria2b.sfp +0 -54
- data/examples/bonfire/inria2c.sfp +0 -62
- data/examples/bonfire/inria2d.sfp +0 -71
- data/examples/bonfire/inria2e.sfp +0 -80
- data/examples/bonfire/main.sfp +0 -33
- data/examples/bonfire/old/bonfire-1-1-1.sfp +0 -76
- data/examples/bonfire/old/bonfire-1-10-1.sfp +0 -77
- data/examples/bonfire/old/bonfire-1-2-1.sfp +0 -58
- data/examples/bonfire/old/bonfire-1-3-1.sfp +0 -61
- data/examples/bonfire/old/bonfire-1-4-1.sfp +0 -64
- data/examples/bonfire/old/bonfire-1-5-1.sfp +0 -67
- data/examples/bonfire/old/bonfire-1-6-1.sfp +0 -82
- data/examples/bonfire/old/bonfire-1-7-1.sfp +0 -82
- data/examples/bonfire/old/bonfire-1-8-1.sfp +0 -79
- data/examples/bonfire/old/bonfire-1-9-1.sfp +0 -83
- data/examples/bonfire/old/wp-test1a.sfp +0 -38
- data/examples/bonfire/old/wp-test1b.sfp +0 -18
- data/examples/bonfire/old/wp-test1c.sfp +0 -7
- data/examples/bonfire/old/wp-test2.sfp +0 -47
- data/examples/bonfire/old3/bonfire-epcc.sfp +0 -57
- data/examples/bonfire/old3/bonfire-inria.sfp +0 -72
- data/examples/bonfire/old3/bonfire-master.sfp +0 -18
- data/examples/bonfire/old3/bonfire.sfp +0 -23
- data/examples/bonfire/old3/bonfire2.sfp +0 -49
- data/examples/bonfire/old3/bonfire3.sfp +0 -76
- data/examples/bonfire/old3/bonfire4.sfp +0 -78
- data/examples/bonfire/old3/bonfire5.sfp +0 -34
- data/examples/bonfire/old3/bonfire5b.sfp +0 -84
- data/examples/bonfire/old3/hpvm6.sfp +0 -22
- data/examples/bonfire/old3/model.json +0 -1
- data/examples/bonfire/old3/test0.sfp +0 -16
- data/examples/bonfire/old3/test1.sfp +0 -5
- data/examples/bonfire/old3/test10.sfp +0 -5
- data/examples/bonfire/old3/test2.sfp +0 -18
- data/examples/bonfire/old3/test3.sfp +0 -10
- data/examples/bonfire/old3/test4.sfp +0 -11
- data/examples/bonfire/old3/test5.sfp +0 -18
- data/examples/bonfire/old3/test6.sfp +0 -19
- data/examples/bonfire/old3/test7.sfp +0 -34
- data/examples/bonfire/old3/test8.sfp +0 -5
- data/examples/bonfire/old3/test9.sfp +0 -16
- data/examples/bonfire/old3/wordpress-test-cluster.sfp +0 -38
- data/examples/bonfire/old3/wordpress-test.sfp +0 -22
- data/examples/bonfire/old3/wp-test-2.sfp +0 -49
- data/examples/bonfire/test.sfp +0 -13
- data/examples/hadoop1.sfp +0 -21
- data/examples/hadoop2.sfp +0 -21
- data/examples/hpcloud.sfp +0 -18
- data/examples/mockcloud/apache2.sfp +0 -14
- data/examples/mockcloud/generator.rb +0 -22
- data/examples/mockcloud/generator.rb.bak +0 -66
- data/examples/mockcloud/hadoop2.sfp.template +0 -25
- data/examples/mockcloud/ping.rb +0 -38
- data/examples/mockcloud/run.rb +0 -17
- data/examples/openstack/openstack-hadoop1-cluster.sfp +0 -37
- data/examples/openstack/openstack-hadoop2-cluster.sfp +0 -39
- data/examples/test.inc +0 -0
- data/examples/test.sfp +0 -11
- data/examples/v2/apache.sfp +0 -30
- data/examples/v2/aptpackage.sfp +0 -6
- data/examples/v2/mock1.sfp +0 -12
- data/examples/v2/package.sfp +0 -22
- data/examples/v2/service.sfp +0 -94
- data/examples/v2/tarpackage.sfp +0 -5
- data/examples/wordpress.sfp +0 -41
data/examples/hadoop1.sfp
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "modules/hadoop1/hadoop1.sfp"
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
hpcloud isa HPCloud {
|
7
|
-
vm_ssh_key_name = "nurikey"
|
8
|
-
}
|
9
|
-
}
|
10
|
-
master isa VM {
|
11
|
-
in_cloud is proxy.hpcloud
|
12
|
-
hadoop isa Hadoop1Master
|
13
|
-
}
|
14
|
-
slave1 isa VM {
|
15
|
-
in_cloud is proxy.hpcloud
|
16
|
-
hadoop isa Hadoop1Slave {
|
17
|
-
master is master.hadoop
|
18
|
-
}
|
19
|
-
}
|
20
|
-
slave2 extends slave1
|
21
|
-
slave3 extends slave1
|
data/examples/hadoop2.sfp
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "modules/hadoop2/hadoop2.sfp"
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
hpcloud isa HPCloud {
|
7
|
-
vm_ssh_key_name = "nurikey"
|
8
|
-
}
|
9
|
-
}
|
10
|
-
master isa VM {
|
11
|
-
in_cloud is proxy.hpcloud
|
12
|
-
hadoop isa Hadoop2Master
|
13
|
-
}
|
14
|
-
slave1 isa VM {
|
15
|
-
in_cloud is proxy.hpcloud
|
16
|
-
hadoop isa Hadoop2Slave {
|
17
|
-
master is master.hadoop
|
18
|
-
}
|
19
|
-
}
|
20
|
-
slave2 extends slave1
|
21
|
-
slave3 extends slave1
|
data/examples/hpcloud.sfp
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
include "../modules/node/node.sfp"
|
2
|
-
include "../modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "../modules/vm/vm.sfp"
|
4
|
-
include "../modules/apache/apache.sfp"
|
5
|
-
|
6
|
-
proxy isa Node {
|
7
|
-
sfpAddress is "localhost"
|
8
|
-
hpcloud isa HPCloud {
|
9
|
-
key_name is "herry_key"
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
vm1 isa VM {
|
14
|
-
created = true
|
15
|
-
apache isa Apache {
|
16
|
-
running is true
|
17
|
-
}
|
18
|
-
}
|
@@ -1,14 +0,0 @@
|
|
1
|
-
include "modules/node/node.sfp"
|
2
|
-
include "modules/apache2/apache2.sfp"
|
3
|
-
include "modules/vm/vm.sfp"
|
4
|
-
include "modules/mockcloud/mockcloud.sfp"
|
5
|
-
|
6
|
-
local isa Node {
|
7
|
-
sfpAddress is "localhost"
|
8
|
-
hpcloud isa MockCloud
|
9
|
-
}
|
10
|
-
vm1 isa VM {
|
11
|
-
apache isa Apache2 {
|
12
|
-
running is true
|
13
|
-
}
|
14
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'erb'
|
4
|
-
require 'ostruct'
|
5
|
-
|
6
|
-
class ErbBinding < OpenStruct
|
7
|
-
def render(template)
|
8
|
-
ERB.new(template).result(binding)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
if ARGV.length <= 0
|
13
|
-
puts "Usage: generator.rb <template-file> [key=value]*"
|
14
|
-
else
|
15
|
-
template = File.read(ARGV.shift)
|
16
|
-
data = {}
|
17
|
-
ARGV.each do |arg|
|
18
|
-
key, value = arg.split('=')
|
19
|
-
data[key] = value
|
20
|
-
end
|
21
|
-
puts ErbBinding.new(data).render(template)
|
22
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
def generate(number_apps)
|
4
|
-
header = 'include "../modules/node/node.sfp"
|
5
|
-
include "../modules/mockcloud/mockcloud.sfp"
|
6
|
-
include "../modules/vm/vm.sfp"
|
7
|
-
include "../modules/apache/apache.sfp"
|
8
|
-
include "../modules/mysql/mysql.sfp"
|
9
|
-
include "../modules/wordpresscluster/wordpresscluster.sfp"
|
10
|
-
|
11
|
-
proxy isa Node {
|
12
|
-
sfpAddress is "localhost"
|
13
|
-
cloud isa MockCloud
|
14
|
-
}
|
15
|
-
'
|
16
|
-
vmlb = 'vmlb isa VM {
|
17
|
-
apache isa Apache {
|
18
|
-
running is true
|
19
|
-
is_load_balancer is true
|
20
|
-
lb_members is (%members%)
|
21
|
-
}
|
22
|
-
}'
|
23
|
-
vmapp = '%vmapp% isa VM {
|
24
|
-
apache isa Apache {
|
25
|
-
running is true
|
26
|
-
}
|
27
|
-
wp_web isa WordpressWeb {
|
28
|
-
installed is true
|
29
|
-
http is %vmapp%.apache
|
30
|
-
database is vmdb.wp_db
|
31
|
-
}
|
32
|
-
}'
|
33
|
-
vmdb = 'vmdb isa VM {
|
34
|
-
mysql isa Mysql {
|
35
|
-
running is true
|
36
|
-
}
|
37
|
-
wp_db isa WordpressDB {
|
38
|
-
installed is true
|
39
|
-
mysql is vmdb.mysql
|
40
|
-
}
|
41
|
-
}'
|
42
|
-
output = ''
|
43
|
-
members = ''
|
44
|
-
global = "global {\n"
|
45
|
-
1.upto(number_apps) do |i|
|
46
|
-
name = "vmapp#{i}"
|
47
|
-
output += vmapp.gsub(/%vmapp%/, name) + "\n"
|
48
|
-
members += "#{name},"
|
49
|
-
global += "\tif vmlb.apache.running is true then #{name}.apache.running is true\n"
|
50
|
-
global += "\tif #{name}.apache.running is true then vmdb.mysql.running is true\n"
|
51
|
-
end
|
52
|
-
global += "}\n"
|
53
|
-
output = header +
|
54
|
-
vmlb.sub(/%members%/, members.chop) + "\n" +
|
55
|
-
output + vmdb + "\n" + global
|
56
|
-
output
|
57
|
-
end
|
58
|
-
|
59
|
-
if $0 == __FILE__
|
60
|
-
if ARGV[0] == 'help'
|
61
|
-
puts "Usage: generator.rb [total-app-layer]"
|
62
|
-
else
|
63
|
-
number_apps = (ARGV.length > 0 ? ARGV[0].to_i : 3)
|
64
|
-
puts generate(number_apps)
|
65
|
-
end
|
66
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
/***
|
2
|
-
*
|
3
|
-
* Required parameters:
|
4
|
-
* - total : number of slaves
|
5
|
-
*
|
6
|
-
*/
|
7
|
-
|
8
|
-
include "modules/vm/vm.sfp"
|
9
|
-
include "modules/mockcloud/mockcloud.sfp"
|
10
|
-
include "modules/hadoop2/hadoop2.sfp"
|
11
|
-
proxy isa Node {
|
12
|
-
sfpAddress is "localhost"
|
13
|
-
cloud isa MockCloud
|
14
|
-
}
|
15
|
-
master isa VM {
|
16
|
-
hadoop isa Hadoop2Master
|
17
|
-
}
|
18
|
-
slave1 isa VM {
|
19
|
-
hadoop isa Hadoop2Slave {
|
20
|
-
master is master.hadoop
|
21
|
-
}
|
22
|
-
}
|
23
|
-
<% (2..total.to_i).each do |i| %>
|
24
|
-
slave<%= i %> extends slave1
|
25
|
-
<% end %>
|
data/examples/mockcloud/ping.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'net/http'
|
4
|
-
require 'thread'
|
5
|
-
|
6
|
-
len = 120
|
7
|
-
|
8
|
-
def ping(address, port=1314)
|
9
|
-
print "print #{address} "
|
10
|
-
url = "http://#{address}:#{port}/sfpstate"
|
11
|
-
uri = URI.parse(url)
|
12
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
13
|
-
http.open_timeout = 2
|
14
|
-
http.read_timeout = 5
|
15
|
-
begin
|
16
|
-
req = Net::HTTP::Get.new(uri.path)
|
17
|
-
http.start
|
18
|
-
http.request(req) { |res|
|
19
|
-
puts "[#{res.code}] [OK]"
|
20
|
-
}
|
21
|
-
rescue Exception => e
|
22
|
-
puts "[Failed] #{e}" #\n#{e.backtrace.join("\n")}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
ping('hadoopmaster')
|
27
|
-
finished = []
|
28
|
-
(1..len).each do |i|
|
29
|
-
# Thread.new {
|
30
|
-
host = "hadoopslave#{i}"
|
31
|
-
ping(host)
|
32
|
-
finished << host
|
33
|
-
# }
|
34
|
-
end
|
35
|
-
|
36
|
-
until finished.length >= len do
|
37
|
-
sleep 1
|
38
|
-
end
|
data/examples/mockcloud/run.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
gen = "./generator.rb"
|
4
|
-
nuri = "../bin/nuri -u -h -n -p -l -m"
|
5
|
-
logdir = "mocktest"
|
6
|
-
|
7
|
-
Dir.mkdir(logdir) if not File.exist?(logdir)
|
8
|
-
|
9
|
-
1.upto(6) do |i|
|
10
|
-
logfile = "#{logdir}/mocktest.log.#{i}"
|
11
|
-
sfpfile = "mocktest-#{i}.sfp"
|
12
|
-
system("#{gen} #{i} > #{sfpfile}")
|
13
|
-
print "Processing #{sfpfile}..."
|
14
|
-
system("#{nuri} #{sfpfile} 1>#{logfile} 2>#{logfile}")
|
15
|
-
system("mv #{sfpfile} #{logdir}")
|
16
|
-
puts "[OK]"
|
17
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/openstack/openstack.sfp"
|
3
|
-
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
herry isa OpenStack {
|
7
|
-
// replace the value of OpenStack Identity's URL plus "/tokens/"
|
8
|
-
auth_uri is "http://16.25.166.21:5000/v2.0/tokens/"
|
9
|
-
|
10
|
-
// replace the value with your SSH key name, and then put
|
11
|
-
// the private key (with name <key-name>.pem) in module's directory.
|
12
|
-
vm_ssh_key_name is "nurikey"
|
13
|
-
|
14
|
-
// an image that already has nuri agent
|
15
|
-
vm_image is "8fe14786-5388-4787-8aaf-96feebfa8aae"
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
include "modules/hadoop1/hadoop1.sfp"
|
20
|
-
|
21
|
-
vm1 isa VM {
|
22
|
-
hadoop isa Hadoop1Master {
|
23
|
-
// replace this with the URL of hadoop1 tar package file
|
24
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
25
|
-
}
|
26
|
-
}
|
27
|
-
vm2 isa VM {
|
28
|
-
hadoop isa Hadoop1Slave {
|
29
|
-
master is vm1.hadoop
|
30
|
-
// replace this with the URL of hadoop1 tar package file
|
31
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
32
|
-
}
|
33
|
-
}
|
34
|
-
vm3 extends vm2
|
35
|
-
vm4 extends vm2
|
36
|
-
vm5 extends vm2
|
37
|
-
vm6 extends vm2
|
@@ -1,39 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/openstack/openstack.sfp"
|
3
|
-
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
herry isa OpenStack {
|
7
|
-
auth_uri is "http://16.25.166.21:5000/v2.0/tokens/"
|
8
|
-
|
9
|
-
// use m1.medium (id="2") flavor because Hadoop2 requires minimum 4GB of memory
|
10
|
-
vm_flavor is "3"
|
11
|
-
|
12
|
-
// - replace the value with your key name
|
13
|
-
// - put the key file <key-name>.pem in module's directory
|
14
|
-
vm_ssh_key_name is "nurikey"
|
15
|
-
|
16
|
-
// a VM image that already has Nuri agent
|
17
|
-
vm_image is "8fe14786-5388-4787-8aaf-96feebfa8aae"
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
include "modules/hadoop2/hadoop2.sfp"
|
22
|
-
|
23
|
-
vm1 isa VM {
|
24
|
-
hadoop isa Hadoop2Master {
|
25
|
-
// replace this with the URL of hadoop2 tar package file
|
26
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
27
|
-
}
|
28
|
-
}
|
29
|
-
vm2 isa VM {
|
30
|
-
hadoop isa Hadoop2Slave {
|
31
|
-
master is vm1.hadoop
|
32
|
-
// replace this with the URL of hadoop2 tar package file
|
33
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
34
|
-
}
|
35
|
-
}
|
36
|
-
vm3 extends vm2
|
37
|
-
vm4 extends vm2
|
38
|
-
vm5 extends vm2
|
39
|
-
vm6 extends vm2
|
data/examples/test.inc
DELETED
File without changes
|
data/examples/test.sfp
DELETED
data/examples/v2/apache.sfp
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
include "service.sfp"
|
2
|
-
|
3
|
-
schema Apache extends Service {
|
4
|
-
package_name = "apache2"
|
5
|
-
service_name = "apache2"
|
6
|
-
installed = true
|
7
|
-
running = true
|
8
|
-
configured = true
|
9
|
-
|
10
|
-
final port = 80
|
11
|
-
final document_root = "/var/www"
|
12
|
-
final modules isset String
|
13
|
-
final server_name = ""
|
14
|
-
|
15
|
-
// load balancer config
|
16
|
-
final load_balancer = false
|
17
|
-
final lb_members isset Node
|
18
|
-
final lb_method = "byrequests" // byrequests, bytraffic, bybusyness
|
19
|
-
|
20
|
-
sub configure {
|
21
|
-
condition {
|
22
|
-
this.installed = true
|
23
|
-
this.running = false
|
24
|
-
this.configured = false
|
25
|
-
}
|
26
|
-
effect {
|
27
|
-
this.configured = true
|
28
|
-
}
|
29
|
-
}
|
30
|
-
}
|
data/examples/v2/aptpackage.sfp
DELETED
data/examples/v2/mock1.sfp
DELETED
data/examples/v2/package.sfp
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
schema Package {
|
2
|
-
installed = true
|
3
|
-
|
4
|
-
final package_name = ""
|
5
|
-
final version = ""
|
6
|
-
final source = ""
|
7
|
-
|
8
|
-
synchronized sub install {
|
9
|
-
effect {
|
10
|
-
this.installed = true
|
11
|
-
}
|
12
|
-
}
|
13
|
-
|
14
|
-
synchronized sub uninstall {
|
15
|
-
condition {
|
16
|
-
this.installed = true
|
17
|
-
}
|
18
|
-
effect {
|
19
|
-
this.installed = false
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}
|
data/examples/v2/service.sfp
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
include "aptpackage.sfp"
|
2
|
-
|
3
|
-
schema Service {
|
4
|
-
running = true
|
5
|
-
configured = true
|
6
|
-
|
7
|
-
final service_name = ""
|
8
|
-
|
9
|
-
sub start {
|
10
|
-
condition {
|
11
|
-
this.running != true
|
12
|
-
this.configured = true
|
13
|
-
}
|
14
|
-
effect {
|
15
|
-
this.running = true
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
sub stop {
|
20
|
-
condition {
|
21
|
-
this.running = true
|
22
|
-
}
|
23
|
-
effect {
|
24
|
-
this.running = false
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
sub configure {
|
29
|
-
condition {
|
30
|
-
this.running = false
|
31
|
-
}
|
32
|
-
effect {
|
33
|
-
this.configured = true
|
34
|
-
}
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
schema SysVService extends Service {
|
39
|
-
final runlevel isset String
|
40
|
-
}
|
41
|
-
|
42
|
-
schema AptService extends AptPackage {
|
43
|
-
synchronized sub install {
|
44
|
-
condition {
|
45
|
-
this.installed != true
|
46
|
-
}
|
47
|
-
effect {
|
48
|
-
this.installed = true
|
49
|
-
this.running = false
|
50
|
-
this.configured = false
|
51
|
-
}
|
52
|
-
}
|
53
|
-
|
54
|
-
synchronized sub uninstall {
|
55
|
-
condition {
|
56
|
-
this.running = false
|
57
|
-
this.installed = true
|
58
|
-
}
|
59
|
-
effect {
|
60
|
-
this.installed = false
|
61
|
-
this.configured = true
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
sub start {
|
66
|
-
condition {
|
67
|
-
this.running != true
|
68
|
-
this.installed = true
|
69
|
-
this.configured = true
|
70
|
-
}
|
71
|
-
effect {
|
72
|
-
this.running = true
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
sub stop {
|
77
|
-
condition {
|
78
|
-
this.running = true
|
79
|
-
}
|
80
|
-
effect {
|
81
|
-
this.running = false
|
82
|
-
}
|
83
|
-
}
|
84
|
-
|
85
|
-
sub configure {
|
86
|
-
condition {
|
87
|
-
this.installed = true
|
88
|
-
this.running = false
|
89
|
-
}
|
90
|
-
effect {
|
91
|
-
this.configured = true
|
92
|
-
}
|
93
|
-
}
|
94
|
-
}
|