nuri 0.5.1 → 0.5.2
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 +42 -11
- data/VERSION +1 -1
- data/bin/delete_modules +35 -11
- data/bin/install_module +54 -65
- data/bin/nuri +48 -38
- data/bin/sfw2graph +178 -0
- data/examples/bonfire.sfp +6 -14
- data/examples/hadoop1.sfp +21 -0
- data/examples/hadoop2.sfp +2 -1
- data/examples/{generator.rb → mockcloud/generator.rb} +0 -0
- data/examples/{run.rb → mockcloud/run.rb} +0 -0
- data/examples/wordpress.sfp +41 -0
- data/lib/nuri.rb +1 -1
- data/lib/nuri/choreographer.rb +1 -1
- data/lib/nuri/{net_helper.rb → helper.rb} +32 -2
- data/lib/nuri/master.rb +13 -27
- data/lib/nuri/orchestrator.rb +1 -1
- data/lib/nuri/targz.rb +97 -0
- data/modules/aptpackage/aptpackage.rb +22 -14
- data/modules/hadoop1/hadoop1.rb +84 -215
- data/modules/hadoop1/hadoop1.sfp +19 -8
- data/modules/hadoop2/hadoop2.rb +10 -3
- data/modules/hadoop2/hadoop2.sfp +1 -1
- data/modules/hadoop2/yarn-site.xml +13 -48
- data/modules/install_module +54 -65
- data/modules/package/package.sfp +1 -1
- data/modules/tarpackage/tarpackage.rb +54 -18
- metadata +9 -6
- data/bin/push_model +0 -16
data/modules/hadoop1/hadoop1.sfp
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
include "../service/service.sfp"
|
2
|
+
include "../aptpackage/aptpackage.sfp"
|
2
3
|
|
3
4
|
/**
|
4
5
|
* Module for managing Hadoop version 1
|
@@ -17,24 +18,28 @@ schema Hadoop1 {
|
|
17
18
|
final password = "!"
|
18
19
|
final source = "http://www.mirrorservice.org/sites/ftp.apache.org/hadoop/common"
|
19
20
|
final version = "1.2.1"
|
20
|
-
final java_home = ""
|
21
|
-
final data_dir = "/
|
21
|
+
final java_home = ""
|
22
|
+
final data_dir = "/opt/hadoop/data"
|
22
23
|
final replication = 2
|
23
24
|
|
25
|
+
java isa AptPackage {
|
26
|
+
package_name = "default-jre"
|
27
|
+
}
|
28
|
+
|
24
29
|
sub install {
|
25
30
|
condition {
|
26
31
|
this.installed != true
|
32
|
+
this.java.installed = true
|
27
33
|
}
|
28
34
|
effect {
|
29
35
|
this.installed = true
|
30
|
-
this.running = false
|
31
36
|
}
|
32
37
|
}
|
33
38
|
|
34
39
|
sub uninstall {
|
35
40
|
condition {
|
36
|
-
this.running = false
|
37
41
|
this.installed = true
|
42
|
+
this.running = false
|
38
43
|
}
|
39
44
|
effect {
|
40
45
|
this.installed = false
|
@@ -43,8 +48,8 @@ schema Hadoop1 {
|
|
43
48
|
|
44
49
|
sub start {
|
45
50
|
condition {
|
46
|
-
this.running != true
|
47
51
|
this.installed = true
|
52
|
+
this.running != true
|
48
53
|
}
|
49
54
|
effect {
|
50
55
|
this.running = true
|
@@ -53,6 +58,7 @@ schema Hadoop1 {
|
|
53
58
|
|
54
59
|
sub stop {
|
55
60
|
condition {
|
61
|
+
this.installed = true
|
56
62
|
this.running = true
|
57
63
|
}
|
58
64
|
effect {
|
@@ -61,20 +67,25 @@ schema Hadoop1 {
|
|
61
67
|
}
|
62
68
|
}
|
63
69
|
|
64
|
-
schema Hadoop1Master extends Hadoop1 {
|
65
|
-
|
70
|
+
schema Hadoop1Master extends Hadoop1 {
|
71
|
+
home = "/opt/hadoopmaster"
|
72
|
+
data_dir = "/opt/hadoopmaster/data"
|
73
|
+
}
|
66
74
|
|
67
75
|
schema Hadoop1Slave extends Hadoop1 {
|
68
76
|
master isref Hadoop1Master
|
69
77
|
|
78
|
+
home = "/opt/hadoopslave"
|
79
|
+
data_dir = "/opt/hadoopslave/data"
|
80
|
+
|
70
81
|
sub install (master : Hadoop1Master) {
|
71
82
|
condition {
|
72
83
|
this.installed != true
|
73
84
|
master.parent.created = true
|
85
|
+
this.java.installed = true
|
74
86
|
}
|
75
87
|
effect {
|
76
88
|
this.installed = true
|
77
|
-
this.running = false
|
78
89
|
this.master = master
|
79
90
|
}
|
80
91
|
}
|
data/modules/hadoop2/hadoop2.rb
CHANGED
@@ -139,7 +139,7 @@ module Sfp::Module::Hadoop2Common
|
|
139
139
|
'dfs_datanode_data_dir' => @model['data_dir'] + "/datanode_data",
|
140
140
|
'mapreduce_framework_name' => 'yarn',
|
141
141
|
'mapreduce_map_memory_mb' => 1536,
|
142
|
-
'mapreduce_map_java_opts' => '-
|
142
|
+
'mapreduce_map_java_opts' => '-Xmx2048M',
|
143
143
|
'mapreduce_reduce_memory_mb' => 3072,
|
144
144
|
'mapreduce_reduce_java_opts' => '-Xmx2560M',
|
145
145
|
'mapreduce_task_io_sort_mb' => 512,
|
@@ -150,7 +150,7 @@ module Sfp::Module::Hadoop2Common
|
|
150
150
|
'yarn_log_aggregation_enable' => false,
|
151
151
|
'yarn_resourcemanager_scheduler_class' => 'org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler',
|
152
152
|
'yarn_scheduler_minimum_allocation_mb' => 256,
|
153
|
-
'yarn_scheduler_maximum_allocation_mb' =>
|
153
|
+
'yarn_scheduler_maximum_allocation_mb' => 2048,
|
154
154
|
'yarn_nodemanager_resource_memory_mb' => 512,
|
155
155
|
'yarn_nodemanager_vmem_pmem_ratio' => 2,
|
156
156
|
'yarn_nodemanager_log_retain_seconds' => 10800,
|
@@ -159,10 +159,16 @@ module Sfp::Module::Hadoop2Common
|
|
159
159
|
'yarn_log_aggregation_retain_check_interval_seconds' => -1,
|
160
160
|
'yarn_nodemanager_local_dirs' => @model['data_dir'] + "/yarn_local_dir",
|
161
161
|
'yarn_nodemanager_log_dirs' => @model['data_dir'] + "/yarn_log_dir",
|
162
|
+
'yarn_web_proxy_address' => local_address,
|
162
163
|
'io_file_buffer_size' => 131072,
|
163
164
|
}
|
164
165
|
end
|
165
166
|
|
167
|
+
def local_address
|
168
|
+
domain = `dnsdomainname`.to_s.strip
|
169
|
+
`hostname`.to_s.strip + (domain.length > 0 ? '.' + domain : '')
|
170
|
+
end
|
171
|
+
|
166
172
|
# TODO -- user "useradd" and "groupadd"
|
167
173
|
def add_user_group
|
168
174
|
user = @model['user']
|
@@ -308,7 +314,7 @@ class Sfp::Module::Hadoop2Master < Sfp::Module::TarPackage
|
|
308
314
|
|
309
315
|
def map
|
310
316
|
map = common_map
|
311
|
-
map['master'] =
|
317
|
+
map['master'] = local_address
|
312
318
|
map
|
313
319
|
end
|
314
320
|
|
@@ -392,6 +398,7 @@ class Sfp::Module::Hadoop2Slave < Sfp::Module::TarPackage
|
|
392
398
|
def map
|
393
399
|
map = common_map
|
394
400
|
map['master'] = resolve(@model['master'] + '.parent.sfpAddress')
|
401
|
+
map['yarn_web_proxy_address'] = resolve(@model['master'] + '.parent.sfpAddress')
|
395
402
|
map
|
396
403
|
end
|
397
404
|
|
data/modules/hadoop2/hadoop2.sfp
CHANGED
@@ -18,70 +18,43 @@
|
|
18
18
|
|
19
19
|
<property>
|
20
20
|
<name>yarn.acl.enable</name>
|
21
|
-
<value
|
21
|
+
<value><%= yarn_acl_enable %></value>
|
22
22
|
</property>
|
23
23
|
|
24
24
|
<property>
|
25
25
|
<name>yarn.admin.acl</name>
|
26
|
-
<value
|
26
|
+
<value><%= yarn_admin_acl %></value>
|
27
27
|
</property>
|
28
28
|
|
29
29
|
<property>
|
30
30
|
<name>yarn.log-aggregation-enable</name>
|
31
|
-
<value
|
31
|
+
<value><%= yarn_log_aggregation_enable %></value>
|
32
32
|
</property>
|
33
33
|
|
34
34
|
<property>
|
35
|
-
<name>yarn.resourcemanager.
|
36
|
-
<value><%= master
|
37
|
-
</property>
|
38
|
-
|
39
|
-
<name>yarn.resourcemanager.scheduler.address</name>
|
40
|
-
<value><%= master %>:54312</value>
|
41
|
-
</property>
|
42
|
-
<property>
|
43
|
-
<name>yarn.resourcemanager.admin.address</name>
|
44
|
-
<value><%= master %>:54313</value>
|
45
|
-
</property>
|
46
|
-
<property>
|
47
|
-
<name>yarn.resourcemanager.webapp.address</name>
|
48
|
-
<value><%= master %>:54314</value>
|
49
|
-
</property>
|
35
|
+
<name>yarn.resourcemanager.hostname</name>
|
36
|
+
<value><%= master %></value>
|
37
|
+
</property>
|
38
|
+
|
50
39
|
<property>
|
51
40
|
<name>yarn.resourcemanager.scheduler.class</name>
|
52
|
-
<value
|
41
|
+
<value><%= yarn_resourcemanager_scheduler_class %></value>
|
53
42
|
</property>
|
54
43
|
<property>
|
55
44
|
<name>yarn.web-proxy.address</name>
|
56
|
-
<value><%=
|
45
|
+
<value><%= yarn_web_proxy_address %>:54315</value>
|
57
46
|
</property>
|
58
|
-
<property>
|
59
|
-
<name>yarn.scheduler.minimum-allocation-mb</name>
|
60
|
-
<value>256</value>
|
61
|
-
</property>
|
62
|
-
<property>
|
63
|
-
<name>yarn.scheduler.maximum-allocation-mb</name>
|
64
|
-
<value>1024</value>
|
65
|
-
</property>
|
66
|
-
<property>
|
67
|
-
<name>yarn.nodemanager.resource.memory-mb</name>
|
68
|
-
<value>512</value>
|
69
|
-
</property>
|
70
|
-
<property>
|
71
|
-
<name>yarn.nodemanager.vmem-pmem-ratio</name>
|
72
|
-
<value>2</value>
|
73
|
-
</property>
|
74
47
|
<property>
|
75
48
|
<name>yarn.nodemanager.local-dirs</name>
|
76
|
-
<value><%=
|
49
|
+
<value><%= yarn_nodemanager_local_dirs %></value>
|
77
50
|
</property>
|
78
51
|
<property>
|
79
52
|
<name>yarn.nodemanager.log-dirs</name>
|
80
|
-
<value><%=
|
53
|
+
<value><%= yarn_nodemanager_log_dirs %></value>
|
81
54
|
</property>
|
82
55
|
<property>
|
83
56
|
<name>yarn.nodemanager.log.retain-seconds</name>
|
84
|
-
<value
|
57
|
+
<value><%= yarn_nodemanager_log_retain_seconds %></value>
|
85
58
|
</property>
|
86
59
|
<property>
|
87
60
|
<name>yarn.nodemanager.remote-app-log-dir</name>
|
@@ -93,15 +66,7 @@
|
|
93
66
|
</property>
|
94
67
|
<property>
|
95
68
|
<name>yarn.nodemanager.aux-services</name>
|
96
|
-
<value
|
97
|
-
</property>
|
98
|
-
<property>
|
99
|
-
<name>yarn.log-aggregation.retain-seconds</name>
|
100
|
-
<value>-1</value>
|
101
|
-
</property>
|
102
|
-
<property>
|
103
|
-
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
|
104
|
-
<value>-1</value>
|
69
|
+
<value><%= yarn_nodemanager_aux_services %></value>
|
105
70
|
</property>
|
106
71
|
|
107
72
|
</configuration>
|
data/modules/install_module
CHANGED
@@ -1,65 +1,54 @@
|
|
1
|
-
#!/bin/
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
address
|
13
|
-
|
14
|
-
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# delete directory that holds temporary files
|
57
|
-
rm -rf $dir
|
58
|
-
|
59
|
-
if [[ $missing_module == 0 ]]; then
|
60
|
-
echo "status: ok"
|
61
|
-
else
|
62
|
-
echo "status: failed"
|
63
|
-
fi
|
64
|
-
|
65
|
-
exit $missing_module
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'uri'
|
5
|
+
require 'net/http'
|
6
|
+
require File.dirname(__FILE__) + '/../lib/nuri/targz'
|
7
|
+
|
8
|
+
module Nuri
|
9
|
+
module Util
|
10
|
+
TarGzip = Object.new.extend(Util::Tar)
|
11
|
+
|
12
|
+
def self.install_modules(address, port, modules, protocol="http")
|
13
|
+
data = {}
|
14
|
+
modules.each do |module_name|
|
15
|
+
raise Exception, "Module #{module_name} is not exist!" if not ::File.directory?(module_name)
|
16
|
+
data[module_name] = TarGzip.targzip(module_name, module_name).read
|
17
|
+
end
|
18
|
+
|
19
|
+
url = "#{protocol}://#{address}:#{port}/modules"
|
20
|
+
uri = URI.parse(url)
|
21
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
22
|
+
request = Net::HTTP::Put.new(uri.request_uri)
|
23
|
+
request.set_form_data(data)
|
24
|
+
response = http.request(request)
|
25
|
+
|
26
|
+
(response.code == '200')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if $0 == __FILE__
|
32
|
+
if ARGV.length < 2
|
33
|
+
puts "Usage: install_module <address> [port] <module-name> ..."
|
34
|
+
exit(1)
|
35
|
+
end
|
36
|
+
|
37
|
+
DefaultPort = 1314
|
38
|
+
|
39
|
+
address = ARGV.shift
|
40
|
+
port = (ARGV.length >= 2 ? ARGV.shift : DefaultPort)
|
41
|
+
modules = ARGV
|
42
|
+
missing = modules.select { |mod| not ::File.directory?(mod) }
|
43
|
+
modules = modules - missing
|
44
|
+
|
45
|
+
success = Nuri::Util.install_modules(address, port, modules),
|
46
|
+
output = {
|
47
|
+
:status => success,
|
48
|
+
:installed_modules => modules,
|
49
|
+
:missing_modules => missing
|
50
|
+
}
|
51
|
+
puts JSON.generate(output)
|
52
|
+
|
53
|
+
exit (success ? 0 : 1)
|
54
|
+
end
|
data/modules/package/package.sfp
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
|
1
4
|
class Sfp::Module::TarPackage
|
2
5
|
include Sfp::Resource
|
3
6
|
|
@@ -18,40 +21,42 @@ class Sfp::Module::TarPackage
|
|
18
21
|
##############################
|
19
22
|
|
20
23
|
def install(p={})
|
21
|
-
|
22
|
-
dest = home
|
23
|
-
return false if dest.length <= 0
|
24
|
-
|
25
|
-
# create destination directory if not exist
|
26
|
-
system "mkdir -p #{dest}" if !::File.exist?(dest)
|
24
|
+
return false if home.length <= 0
|
27
25
|
|
28
|
-
#
|
29
|
-
|
26
|
+
# create home directory if not exist
|
27
|
+
shell "mkdir -p #{home}" if !::File.exist?(home)
|
30
28
|
|
31
|
-
|
32
|
-
|
29
|
+
file = url.split('/').last.to_s
|
30
|
+
dest = "#{home}/#{file}"
|
31
|
+
download(url, dest)
|
33
32
|
|
34
|
-
file = src.split('/').last.to_s
|
35
33
|
# if downloaded file is not exist, then return false
|
36
|
-
if !::File.exist?(
|
34
|
+
if !::File.exist?(dest)
|
37
35
|
log.error "Failed to download file from #{url}"
|
38
36
|
return false
|
39
37
|
end
|
40
38
|
|
41
39
|
# extract tar file, and then delete it
|
42
|
-
|
43
|
-
|
40
|
+
shell "cd #{home} && tar xvzf #{file} && rm -f #{file}"
|
41
|
+
|
42
|
+
basename = case ::File.extname(file)
|
43
|
+
when '.gz'
|
44
|
+
::File.basename(file, '.tar.gz')
|
45
|
+
when '.tgz'
|
46
|
+
::File.basename(file, '.tgz')
|
47
|
+
else
|
48
|
+
file
|
49
|
+
end
|
44
50
|
|
45
|
-
basename
|
46
|
-
system "bash -c 'cd #{dest}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'"
|
51
|
+
shell "bash -c 'cd #{home}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'"
|
47
52
|
|
48
|
-
File.open("#{
|
53
|
+
File.open("#{home}/#{Signature}", 'w') { |f| f.write(Time.now.to_s) }
|
49
54
|
|
50
55
|
true
|
51
56
|
end
|
52
57
|
|
53
58
|
def uninstall(p={})
|
54
|
-
!!
|
59
|
+
!!shell("rm -rf #{home}") if File.exist?(home)
|
55
60
|
true
|
56
61
|
end
|
57
62
|
|
@@ -62,6 +67,37 @@ class Sfp::Module::TarPackage
|
|
62
67
|
##############################
|
63
68
|
|
64
69
|
protected
|
70
|
+
def download(source, destination)
|
71
|
+
def use_http_proxy?(uri)
|
72
|
+
ENV['no_proxy'].to_s.split(',').each { |pattern|
|
73
|
+
pattern.chop! if pattern[-1] == '*'
|
74
|
+
return false if uri.hist[0, pattern.length] == pattern
|
75
|
+
}
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
file = nil
|
80
|
+
begin
|
81
|
+
uri = URI.parse(source)
|
82
|
+
http = nil
|
83
|
+
if use_http_proxy?(uri)
|
84
|
+
proxy = URI.parse(ENV['http_proxy'])
|
85
|
+
http = Net::HTTP::Proxy(proxy.host, proxy.port).new(uri.host, uri.port)
|
86
|
+
else
|
87
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
88
|
+
end
|
89
|
+
http.request_get(uri.path) do |response|
|
90
|
+
file = ::File.open(destination, 'wb')
|
91
|
+
response.read_body do |segment|
|
92
|
+
file.write segment
|
93
|
+
end
|
94
|
+
file.flush
|
95
|
+
end
|
96
|
+
ensure
|
97
|
+
file.close if not file.nil?
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
65
101
|
def installed?
|
66
102
|
::File.exist?("#{home}/#{Signature}")
|
67
103
|
end
|