hq-mongodb-installer 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 80cd8c8bb9b00573cd2553a18083243cc75bfe6e
4
+ data.tar.gz: 5de8f053adeb736af5f474686ed61b7fef9a3709
5
+ SHA512:
6
+ metadata.gz: 1434c4a1713046b5f901f522bd274a6b776155ea168ae93300f2168cbef8c7e578e5574258e6e1a4b9a54e29443ecb15fc76b0500ff9e2d142ff205a6b8239aa
7
+ data.tar.gz: 6fa912c022e830272a37554b49cb46f045a665fda6f10ac76ff5c331159db85f9815895fe9deeb6a91868a02eb1d187b4fe777510220e68b78ea8a3c40f4f22f
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "shellwords"
4
+ require "yaml"
5
+
6
+ config = YAML.load_file ARGV[0]
7
+
8
+ # download mongo
9
+
10
+ downloaded = false
11
+
12
+ config["install"]["urls"].each do
13
+ |url|
14
+
15
+ # delete the file if it exists already
16
+
17
+ system "rm -f #{config["install"]["filename"]}"
18
+
19
+ # try and download file
20
+
21
+ next unless system "wget --quiet #{url}"
22
+
23
+ # check file exists
24
+
25
+ next unless File.exist? "#{config["install"]["filename"]}"
26
+
27
+ # check it's sha1
28
+
29
+ file_sha1 = `sha1sum #{config["install"]["filename"]}`.split.first
30
+
31
+ next unless file_sha1 == config["install"]["sha1"]
32
+
33
+ # we got it
34
+
35
+ downloaded = true
36
+ break
37
+
38
+ end
39
+
40
+ # error if the download failed
41
+
42
+ unless downloaded
43
+ puts "Download failed"
44
+ exit 1
45
+ end
46
+
47
+ # extract file
48
+
49
+ unless system "sudo tar xzf #{config["install"]["filename"]}"
50
+ puts "Extract failed"
51
+ exit 1
52
+ end
53
+
54
+ # move to install location
55
+
56
+ unless system "sudo mkdir -p #{File.dirname config["install"]["target"]}"
57
+ puts "Install failed"
58
+ exit 1
59
+ end
60
+
61
+ system "sudo rm -rf #{config["install"]["target"]}"
62
+
63
+ unless system "sudo mv #{config["install"]["dirname"]} #{config["install"]["target"]}"
64
+ puts "Install failed"
65
+ exit 1
66
+ end
67
+
68
+ puts "Install successful"
69
+
70
+ # create user
71
+
72
+ if config["user"]["create"] \
73
+ && ! system("getent passwd #{config["user"]["name"]}")
74
+
75
+ unless system [
76
+ "sudo",
77
+ "useradd",
78
+ "-r",
79
+ config["user"]["name"],
80
+ ].shelljoin
81
+ puts "Create user failed"
82
+ exit 1
83
+ end
84
+
85
+ end
86
+
87
+ # create directories
88
+
89
+ config["dirs"].each do
90
+ |path|
91
+
92
+ unless system "sudo mkdir -p #{path}"
93
+ puts "Error creating #{path}"
94
+ exit 1
95
+ end
96
+
97
+ unless system "sudo chown #{config["user"]["name"]}:#{config["user"]["name"]} #{path}"
98
+ puts "Error setting ownership of #{path}"
99
+ exit 1
100
+ end
101
+
102
+ end
103
+
104
+ unless system "sudo mkdir -p /etc/mongodb"
105
+ puts "Error creating config dir"
106
+ exit 1
107
+ end
108
+
109
+ # iterate servers
110
+
111
+ (config["servers"] || []).each do
112
+ |server_name, server|
113
+
114
+ # write upstart config
115
+
116
+ File.open "mongodb-#{server_name}.conf", "w" do
117
+ |file_io|
118
+
119
+ file_io.puts "limit nofile 20000 20000"
120
+ file_io.puts "kill timeout 300"
121
+
122
+ file_io.puts "start on runlevel [#{server["runlevels"]}]"
123
+ file_io.puts "stop on runlevel [!#{server["runlevels"]}]"
124
+
125
+ file_io.puts "script"
126
+
127
+ file_io.puts "\t" + [
128
+
129
+ "exec",
130
+ "start-stop-daemon",
131
+
132
+ "--start",
133
+
134
+ "--quiet",
135
+
136
+ "--chuid",
137
+ config["user"]["name"],
138
+
139
+ "--exec",
140
+ "#{config["install"]["target"]}/bin/#{server["exec"]}",
141
+
142
+ "--",
143
+
144
+ "--config",
145
+ "/etc/mongodb/#{server_name}.conf"
146
+
147
+ ].shelljoin
148
+
149
+ file_io.puts "end script"
150
+
151
+ end
152
+
153
+ unless system "sudo mv mongodb-#{server_name}.conf /etc/init"
154
+ puts "Write upstart config #{server_name} failed"
155
+ exit 1
156
+ end
157
+
158
+ # reload upstart config
159
+
160
+ unless system "sudo initctl reload-configuration"
161
+ puts "Reload upstart config #{server_name} failed"
162
+ exit 1
163
+ end
164
+
165
+ # write config
166
+
167
+ File.open "#{server_name}.conf", "w" do
168
+ |file_io|
169
+
170
+ file_io.puts server["config"]
171
+
172
+ end
173
+
174
+ unless system "sudo mv #{server_name}.conf /etc/mongodb"
175
+ puts "Error writing config file #{server_name}.conf"
176
+ exit 1
177
+ end
178
+
179
+ # start service
180
+
181
+ unless system "sudo initctl start mongodb-#{server_name}"
182
+ puts "Start mongodb #{server_name} failed"
183
+ exit 1
184
+ end
185
+
186
+ end
187
+
188
+ exit 0
189
+
@@ -0,0 +1,18 @@
1
+ Feature: Download and install is reliable
2
+
3
+ Background:
4
+
5
+ Given I start vagrant box "data"
6
+
7
+ Scenario: Download checksum fails
8
+
9
+ When I install mongo on "data" with "checksum.yml"
10
+
11
+ Then the command stdout should include:
12
+ """
13
+ Download failed
14
+ """
15
+
16
+ And the command exit status should be non-zero
17
+
18
+ # vim: et ts=2
@@ -0,0 +1,19 @@
1
+ Feature: Setup a mongodb cluster
2
+
3
+ Background:
4
+
5
+ Given I start vagrant box "config"
6
+ And I start vagrant box "data"
7
+ And I start vagrant box "shard"
8
+
9
+ Scenario: Setup cluster
10
+
11
+ When I install mongo on "config" with "cluster-config.yml"
12
+ And I install mongo on "data" with "cluster-data.yml"
13
+ And I install mongo on "shard" with "cluster-shard.yml"
14
+
15
+ And I run mongo "2.4.3" script "cluster-setup.js" on "shard"
16
+
17
+ Then mongo "2.4.3" test script "cluster-test.js" should work on "shard"
18
+
19
+ # vim: et ts=2
@@ -0,0 +1,13 @@
1
+ Feature: Setup a standalone mongo server
2
+
3
+ Background:
4
+
5
+ Given I start vagrant box "data"
6
+
7
+ Scenario: Setup standalone
8
+
9
+ When I install mongo on "data" with "standalone.yml"
10
+
11
+ Then mongo "2.4.3" works on "data"
12
+
13
+ # vim: et ts=2
@@ -0,0 +1,8 @@
1
+ require "hq/cucumber/command"
2
+ require "hq/cucumber/temp-dir"
3
+
4
+ ENV["VAGRANT_DEFAULT_PROVIDER"] = "lxc"
5
+
6
+ $temp_dir_use_sudo = true
7
+
8
+ $project_dir = Dir.pwd
@@ -0,0 +1,86 @@
1
+ require "shellwords"
2
+
3
+ Before do
4
+ @vagrant_boxes = []
5
+ end
6
+
7
+ When /^I start vagrant box "(.*?)"$/ do
8
+ |box_name|
9
+ @vagrant_boxes << box_name
10
+ system "vagrant up #{box_name}"
11
+ end
12
+
13
+ After do
14
+ @vagrant_boxes.each do
15
+ |box_name|
16
+ system "vagrant destroy #{box_name} --force"
17
+ end
18
+ end
19
+
20
+ When /^I install mongo on "(.*?)" with "(.*?)"$/ do
21
+ |server, config|
22
+ command_run [
23
+ "vagrant", "ssh",
24
+ server,
25
+ "--command", [
26
+ "/vagrant/bin/hq-mongodb-installer",
27
+ "/vagrant/test/#{config}",
28
+ ].shelljoin
29
+ ].shelljoin
30
+ end
31
+
32
+ When /^I run mongo "(.*?)" script "(.*?)" on "(.*?)"$/ do
33
+ |version, script, server|
34
+
35
+ command_run [
36
+ "vagrant", "ssh",
37
+ server,
38
+ "--command", [
39
+ "/opt/mongodb-#{version}/bin/mongo",
40
+ "/vagrant/test/#{script}",
41
+ ].shelljoin
42
+ ].shelljoin
43
+
44
+ end
45
+
46
+ Then /^mongo "(.*?)" test script "(.*?)" should work on "(.*?)"$/ do
47
+ |version, script, server|
48
+
49
+ command_run [
50
+ "vagrant", "ssh",
51
+ server,
52
+ "--command", [
53
+ "/opt/mongodb-#{version}/bin/mongo",
54
+ "/vagrant/test/#{script}",
55
+ ].shelljoin
56
+ ].shelljoin
57
+
58
+ @command_stdout.should include "hello world"
59
+
60
+ end
61
+
62
+ Then /^it should return non-zero$/ do
63
+ @command_exit_status.should_not == 0
64
+ end
65
+
66
+ Then /^mongo "(.*?)" works on "(.*?)"$/ do
67
+ |version, server|
68
+
69
+ # run the hello script in the mongo shell
70
+
71
+ command_run [
72
+ "vagrant", "ssh",
73
+ server,
74
+ "--command", [
75
+ "/opt/mongodb-#{version}/bin/mongo",
76
+ "/vagrant/test/hello.js",
77
+ ].shelljoin
78
+ ].shelljoin
79
+
80
+ # check the output includes "hello world"
81
+
82
+ @command_stdout.should include "hello world"
83
+
84
+ end
85
+
86
+
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hq-mongodb-installer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - James Pharaoh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cucumber
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.1
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: hq-dev
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.7.7
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.7.7
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 10.0.4
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 10.0.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.13.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.13.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec_junit_formatter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.1.6
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.1.6
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.1
111
+ description: HQ standalone MongoDB installation and configuration script
112
+ email:
113
+ - james@phsys.co.uk
114
+ executables:
115
+ - hq-mongodb-installer
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - features/checksum.feature
120
+ - features/cluster.feature
121
+ - features/standalone.feature
122
+ - features/support/steps.rb
123
+ - features/support/env.rb
124
+ - bin/hq-mongodb-installer
125
+ homepage: https://github.com/jamespharaoh/hq-mongodb-installer
126
+ licenses: []
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - '>='
140
+ - !ruby/object:Gem::Version
141
+ version: 1.3.6
142
+ requirements: []
143
+ rubyforge_project: hq-mongodb-installer
144
+ rubygems_version: 2.0.3
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: HQ MongoDB installer
148
+ test_files:
149
+ - features/checksum.feature
150
+ - features/cluster.feature
151
+ - features/standalone.feature
152
+ - features/support/steps.rb
153
+ - features/support/env.rb