gv-valley 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4c6117529adbc808f6a13a4e17c1e8f697b5e085
4
+ data.tar.gz: 49fc611a1c2b486427db03b8085036d34dc9cb91
5
+ SHA512:
6
+ metadata.gz: 4543b48176a0bd9f1311f084d06ca6b825bf860a9e6614967971b21b38beb6dea9ffc755c795ec038d1ab19d668314a28a15a9c314e70d368f42abf3d6e6a117
7
+ data.tar.gz: 4c5c60f9385db2840999e50488212506452c1e8d9b0959cf076ba6c766611653351f2867a0d8d38f33978822ef4b491f0ad17ebef6fc1f068a98dba88d039e99
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in loam.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org>
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # GV::Valley
2
+
3
+ Micro Private PaaS with Ruby.
4
+ Heavily influenced from dokku and flynn, also uses several flynn components. You
5
+ should use flynn instead, this is a distributed Ruby experiment which is not for
6
+ production use.
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'gv-valley'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install gv-valley
21
+
22
+ ## Usage
23
+
24
+ $ gv-valley run # runs valley server
25
+
26
+ ## Todo
27
+
28
+ - Write more tests
29
+ - Documentation
30
+
31
+
32
+ ## Contributing
33
+
34
+ 1. Fork it ( http://github.com/<my-github-username>/gv-valley/fork )
35
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
36
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 4. Push to the branch (`git push origin my-new-feature`)
38
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/**/test*.rb']
7
+ end
8
+
9
+ task :default => :test
data/bin/gv-valley ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gv/common/cli/server'
4
+ GV::Common::CLI::Server.gen "valley", %w(gv/valley/etcd gv/valley/file_server
5
+ gv/valley/runner gv/valley/deployer gv/valley/balancer
6
+ gv/addons/postgresql gv/addons/etcd gv/addons/memcached)
data/bin/valley ADDED
@@ -0,0 +1,319 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $stdout.sync = true
4
+ $stderr.sync = true
5
+
6
+ require "gv/valley"
7
+ require "commander/import"
8
+
9
+ require 'gv/valley/app'
10
+ require 'gv/valley/deployer'
11
+ require 'gv/valley/runner'
12
+ require 'gv/valley/balancer'
13
+ require 'sticks/pipe'
14
+
15
+ program :name, "Green Valley"
16
+ program :version, '0.0.1'
17
+ program :description, 'Green Valley CLI'
18
+
19
+ def restart_app app
20
+ deployer = GV::Valley::Deployer.service
21
+ deployer.stop app, &Sticks::Pipe::Blocks.stream
22
+ deployer.start app
23
+ end
24
+
25
+ ##
26
+ # Apps API
27
+
28
+ command :'apps:deploy' do |c|
29
+ c.syntax = 'valley apps:deploy APP_NAME'
30
+ c.description = 'deploys app'
31
+ c.action do |args, options|
32
+
33
+ DRb.start_service
34
+ service = GV::Valley::Deployer.random_service
35
+ service.deploy args.first, &Sticks::Pipe::Blocks.stream
36
+ DRb.stop_service
37
+ end
38
+ end
39
+
40
+ command :'apps:config' do |c|
41
+ c.syntax = 'valley apps:config APP_NAME'
42
+ c.description = 'shows app config'
43
+ c.action do |args, options|
44
+
45
+ DRb.start_service
46
+ puts GV::Valley::App.find!(args.first)['config']
47
+ DRb.stop_service
48
+ end
49
+ end
50
+
51
+ command :'apps:config add' do |c|
52
+ c.syntax = 'valley apps:config add APP_NAME KEY=VALUE [KEY=VALUE]'
53
+ c.description = 'adds item to app config'
54
+ c.action do |args, options|
55
+
56
+ DRb.start_service
57
+
58
+ name = args.shift
59
+ config = Hash[args.map{|kv| kv.split("=")}]
60
+ app = GV::Valley::App.find!(name)
61
+ app["config"].update(config)
62
+ app.save
63
+
64
+ restart_app app
65
+
66
+ DRb.stop_service
67
+ end
68
+ end
69
+
70
+ command :'apps:config remove' do |c|
71
+ c.syntax = 'valley apps:config remove APP_NAME KEY [KEY]'
72
+ c.description = 'removes item from app config'
73
+ c.action do |args, options|
74
+
75
+ DRb.start_service
76
+
77
+ name = args.shift
78
+ app = GV::Valley::App.find!(name)
79
+ args.each do |key|
80
+ app["config"].delete(key)
81
+ end
82
+ app.save
83
+
84
+ restart_app app
85
+
86
+ DRb.stop_service
87
+ end
88
+ end
89
+
90
+ command :'apps:ps' do |c|
91
+ c.syntax = 'valley apps:ps APP_NAME'
92
+ c.description = 'shows app processes'
93
+ c.action do |args, options|
94
+
95
+ DRb.start_service
96
+ puts GV::Valley::App.find!(args.first)['ps'].map{|type,ps| {type => ps['scale']} }
97
+ DRb.stop_service
98
+ end
99
+ end
100
+
101
+ command :'apps:ps scale' do |c|
102
+ c.syntax = 'valley apps:ps scale APP_NAME TYPE=SCALE [TYPE=SCALE]'
103
+ c.description = 'shows app processes'
104
+ c.action do |args, options|
105
+
106
+ DRb.start_service
107
+
108
+ name = args.shift
109
+ ps = Hash[args.map{|kv| kv.split("=")}]
110
+ app = GV::Valley::App.find!(name)
111
+ ps.each do |key,scale|
112
+ if app['ps'][key]
113
+ app['ps'][key]['scale'] = scale.to_i
114
+ else
115
+ error "Process type #{key} not found"
116
+ end
117
+ end
118
+ app.save
119
+ restart_app app
120
+
121
+ DRb.stop_service
122
+ end
123
+ end
124
+
125
+ command :'apps:domains' do |c|
126
+ c.syntax = 'valley apps:domains APP_NAME'
127
+ c.description = 'shows app domains'
128
+ c.action do |args, options|
129
+
130
+ DRb.start_service
131
+ puts GV::Valley::App.find!(args.first)['domains']
132
+ DRb.stop_service
133
+ end
134
+ end
135
+
136
+ command :'apps:domains add' do |c|
137
+ c.syntax = 'valley apps:domains add APP_NAME DOMAIN [DOMAIN]'
138
+ c.description = 'adds item to app domains'
139
+ c.action do |args, options|
140
+
141
+ DRb.start_service
142
+
143
+ name = args.shift
144
+ app = GV::Valley::App.find!(name)
145
+ domains = args - GV::Valley::App.all.map{|a| a["domains"]}.flatten
146
+ app["domains"] = (app["domains"] + domains).compact.uniq
147
+ app.save
148
+
149
+ GV::Valley::Balancer.service.reload &Sticks::Pipe::Blocks.stream
150
+
151
+ DRb.stop_service
152
+ end
153
+ end
154
+
155
+ command :'apps:domains remove' do |c|
156
+ c.syntax = 'valley apps:domains remove APP_NAME DOMAIN [DOMAIN]'
157
+ c.description = 'removes item from app domains'
158
+ c.action do |args, options|
159
+
160
+ DRb.start_service
161
+
162
+ name = args.shift
163
+ app = GV::Valley::App.find!(name)
164
+ app["domains"] = app["domains"] - args
165
+ app.save
166
+
167
+ GV::Valley::Balancer.service.reload &Sticks::Pipe::Blocks.stream
168
+
169
+ DRb.stop_service
170
+ end
171
+ end
172
+
173
+ command :'apps:run' do |c|
174
+ c.syntax = 'valley apps:run APP_NAME CMD'
175
+ c.description = 'runs cmd on app'
176
+ c.action do |args, options|
177
+
178
+ DRb.start_service
179
+ service = GV::Valley::Runner.random_service
180
+ name = args.shift
181
+ cmd = args.join(" ")
182
+ block = cmd =~ Sticks::Pipe::INTERACTIVE_COMMANDS ? Sticks::Pipe::Blocks.interactive : Sticks::Pipe::Blocks.stream
183
+ service.run name, cmd, &block
184
+ DRb.stop_service
185
+ end
186
+ end
187
+
188
+ command :'apps:logs' do |c|
189
+ c.syntax = 'valley apps:logs APP_NAME <PS>'
190
+ c.description = 'runs cmd on app'
191
+ c.option '-f','--follow', String, 'streams log'
192
+ c.action do |args, options|
193
+
194
+ DRb.start_service
195
+ name = args.shift
196
+ app = GV::Valley::App.find!(name)
197
+ ps = args.shift
198
+ psname = "#{name}.#{ps}"
199
+
200
+ # debug GV::Valley::Deployer.space.read_all([:ps,/#{psname}/,nil,nil])
201
+
202
+ tuple = [:ps, /#{psname}/, nil, nil ]
203
+ block = options.follow ? Sticks::Pipe::Blocks.stream : Sticks::Pipe::Blocks.capture
204
+ (GV::Valley::Deployer.space.read_all(tuple) rescue []).each do |h|
205
+ h[2].logs psname,options.follow, &block
206
+ end
207
+
208
+ DRb.stop_service
209
+ end
210
+ end
211
+
212
+ command :'apps:logs' do |c|
213
+ c.syntax = 'valley apps:logs APP_NAME <PS>'
214
+ c.description = 'runs cmd on app'
215
+ c.option '-f','--follow', String, 'streams log'
216
+ c.action do |args, options|
217
+
218
+ DRb.start_service
219
+ name = args.shift
220
+ app = GV::Valley::App.find!(name)
221
+ ps = args.shift
222
+ psname = "#{name}.#{ps}"
223
+
224
+ # debug GV::Valley::Deployer.space.read_all([:ps,/#{psname}/,nil,nil])
225
+
226
+ tuple = [:ps, /#{psname}/, nil, nil ]
227
+ block = options.follow ? Sticks::Pipe::Blocks.stream : Sticks::Pipe::Blocks.capture
228
+ (GV::Valley::Deployer.space.read_all(tuple) rescue []).each do |h|
229
+ h[2].logs psname,options.follow, &block
230
+ end
231
+
232
+ DRb.stop_service
233
+ end
234
+ end
235
+
236
+ command :'apps:destroy' do |c|
237
+ c.syntax = 'valley apps:destroy APP_NAME'
238
+ c.description = 'destroys app'
239
+ c.action do |args, options|
240
+
241
+ DRb.start_service
242
+
243
+ name = args.shift
244
+ app = GV::Valley::App.find!(name)
245
+
246
+ deployer = GV::Valley::Deployer.service
247
+ deployer.stop app, &Sticks::Pipe::Blocks.stream
248
+
249
+ app.delete
250
+
251
+ DRb.stop_service
252
+ end
253
+ end
254
+
255
+ command :'balancer:reload' do |c|
256
+ c.syntax = 'valley balancer:reload'
257
+ c.description = 'reloads haproxy config'
258
+ c.action do |args, options|
259
+
260
+ DRb.start_service
261
+
262
+ balancer = GV::Valley::Balancer.service
263
+ balancer.reload &Sticks::Pipe::Blocks.stream
264
+
265
+ DRb.stop_service
266
+ end
267
+ end
268
+
269
+ command :'addons:create' do |c|
270
+ c.syntax = 'valley addons:create NAME APP_NAME'
271
+ c.description = 'creates addon service'
272
+ c.action do |args, options|
273
+
274
+ DRb.start_service
275
+ addon = args.shift
276
+ app_name = args.shift
277
+
278
+ require "gv/addons/#{addon}"
279
+ addon_service = "GV::Addons::#{addon.classify}".constantize.service
280
+ addon_service.create app_name
281
+
282
+ DRb.stop_service
283
+ end
284
+ end
285
+
286
+ command :'addons:run' do |c|
287
+ c.syntax = 'valley addons:run NAME APP_NAME CMD'
288
+ c.description = 'runs method on addon service'
289
+ c.action do |args, options|
290
+
291
+ DRb.start_service
292
+ addon = args.shift
293
+ app_name = args.shift
294
+ cmd = args.shift
295
+
296
+ require "gv/addons/#{addon}"
297
+ addon_service = "GV::Addons::#{addon.classify}".constantize.service
298
+ puts addon_service.public_send(cmd, app_name)
299
+
300
+ DRb.stop_service
301
+ end
302
+ end
303
+
304
+ command :'addons:destroy' do |c|
305
+ c.syntax = 'valley addons:destroy NAME APP_NAME'
306
+ c.description = 'destroys addon service'
307
+ c.action do |args, options|
308
+
309
+ DRb.start_service
310
+ addon = args.shift
311
+ app_name = args.shift
312
+
313
+ require "gv/addons/#{addon}"
314
+ addon_service = "GV::Addons::#{addon.classify}".constantize.service
315
+ addon_service.destroy app_name
316
+
317
+ DRb.stop_service
318
+ end
319
+ end
data/gv-valley.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gv/valley/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "gv-valley"
8
+ spec.version = GV::Valley::VERSION
9
+ spec.authors = ["Onur Uyar"]
10
+ spec.email = ["me@onuruyar.com"]
11
+ spec.summary = %q{Micro Private PaaS with Ruby}
12
+ spec.homepage = "https://github.com/green-valley/gv-valley"
13
+ spec.license = "Unlicense"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.5"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "minitest"
23
+ spec.add_dependency 'goliath'
24
+ spec.add_dependency 'etcd'
25
+ spec.add_dependency 'gv-common'
26
+ spec.add_dependency 'gv-bedrock'
27
+ end
@@ -0,0 +1,41 @@
1
+ require 'gv/valley'
2
+ require 'gv/valley/addon'
3
+
4
+ module GV
5
+ module Addons
6
+ class Etcd < GV::Valley::Addon
7
+
8
+ PORT = 4001
9
+
10
+ CONTAINER_DIR="/data/db"
11
+
12
+ def image; "flynn/etcd" end
13
+
14
+ def params
15
+ "-v #{@home}/#{@name}/#{@app_name}:#{CONTAINER_DIR}:rw"
16
+ end
17
+
18
+ def cmd
19
+ "--name=#{@app_name} -data-dir=#{CONTAINER_DIR}"
20
+ end
21
+
22
+ def url app_name
23
+ @app_name = app_name
24
+ self.class.space.read([@name.to_sym,@app_name,nil,nil],0) rescue nil
25
+ end
26
+
27
+ def create app_name
28
+ super app_name
29
+ self.class.space.write([@name.to_sym,@app_name,"http://#{self.external_ip}:#{port(app_name)}",self.external_ip])
30
+ end
31
+
32
+ def destroy app_name
33
+ super app_name
34
+ tuple = [@name.to_sym,@app_name,nil,nil]
35
+ (self.class.space.take(tuple,0) rescue nil) while (self.class.space.read(tuple,0) rescue nil)
36
+ end
37
+
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ require 'gv/valley'
2
+ require 'gv/valley/addon'
3
+
4
+ module GV
5
+ module Addons
6
+ class Memcached < GV::Valley::Addon
7
+
8
+ PORT = 4001
9
+
10
+ CONTAINER_DIR="/data/db"
11
+
12
+ def image; "bacongobbler/memcached" end
13
+
14
+
15
+ def url app_name
16
+ @app_name = app_name
17
+ self.class.space.read([@name.to_sym,@app_name,nil,nil],0) rescue nil
18
+ end
19
+
20
+ def create app_name
21
+ super app_name
22
+ self.class.space.write([@name.to_sym,@app_name,"#{self.external_ip}:#{port(app_name)}",self.external_ip])
23
+ end
24
+
25
+ def destroy app_name
26
+ super app_name
27
+ tuple = [@name.to_sym,@app_name,nil,nil]
28
+ (self.class.space.take(tuple,0) rescue nil) while (self.class.space.read(tuple,0) rescue nil)
29
+ end
30
+
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ require 'gv/valley'
2
+ require 'gv/valley/addon'
3
+
4
+ module GV
5
+ module Addons
6
+ class Postgresql < GV::Valley::Addon
7
+
8
+ PORT = 5432
9
+
10
+ CONTAINER_DIR="/var/lib/postgresql/9.3/main"
11
+
12
+ def image; "valley/postgresql" end
13
+
14
+ def params
15
+ ["-v #{@home}/#{@name}/#{@app_name}:#{CONTAINER_DIR} -w #{CONTAINER_DIR}",
16
+ "-e POSTGRESQL_USER=#{@app_name}",
17
+ "-e POSTGRESQL_PASS=#{@pass=rand(2**64).to_s(36)}",
18
+ "-e POSTGRESQL_DB=#{@app_name}"
19
+ ].join(" ")
20
+ end
21
+
22
+ def url app_name
23
+ @app_name = app_name
24
+ self.class.space.read([@name.to_sym,@app_name,nil,nil],0)[2] rescue nil
25
+ end
26
+
27
+ def create app_name
28
+ if super(app_name)
29
+ self.class.space.write([@name.to_sym,@app_name,"postgres://#{@app_name}:#{@pass}@#{self.external_ip}:#{port(app_name)}/#{@app_name}",self.external_ip])
30
+ end
31
+ end
32
+
33
+ def destroy app_name
34
+ super app_name
35
+ tuple = [@name.to_sym,@app_name,nil,nil]
36
+ (self.class.space.take(tuple,0) rescue nil) while (self.class.space.read(tuple,0) rescue nil)
37
+ end
38
+
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,116 @@
1
+ require 'gv/valley'
2
+
3
+ USER = ENV['VALLEY_USER'] || "val"
4
+ HOME = ENV['VALLEY_HOME'] || "/home/#{USER}"
5
+ CONFIG_DIR = "/etc/greenvalley/config"
6
+
7
+ namespace :install do
8
+
9
+ def capture cmd
10
+ `#{cmd}`.chomp rescue nil
11
+ end
12
+
13
+ task :config_dir do
14
+ mkdir_p CONFIG_DIR
15
+ end
16
+
17
+ task :domain => ['install:config_dir'] do
18
+ unless File.exists? "#{CONFIG_DIR}/domain"
19
+ print "Enter Domain: "
20
+ domain = STDIN.gets.strip
21
+ if domain.empty?
22
+ abort "Domain cannot be blank"
23
+ end
24
+ sh "echo \"#{domain}\" > #{CONFIG_DIR}/domain"
25
+ end
26
+ end
27
+
28
+ task :user => ['install:config_dir'] do
29
+ sh "useradd #{USER}" rescue nil
30
+ sh "chown -R #{USER} #{CONFIG_DIR}"
31
+ sh "echo \"#{USER}\" > #{CONFIG_DIR}/user" unless File.exists? "#{CONFIG_DIR}/user"
32
+ sh "echo \"#{HOME}\" > #{CONFIG_DIR}/home" unless File.exists? "#{CONFIG_DIR}/home"
33
+ end
34
+
35
+ desc "Install Gitreceive"
36
+ task :gitreceive => ['install:user'] do
37
+
38
+ sh "wget -O /usr/local/bin/gitreceive https://raw.githubusercontent.com/progrium/gitreceive/master/gitreceive"
39
+ sh "chmod +x /usr/local/bin/gitreceive"
40
+ sh "GITUSER=#{USER} gitreceive init"
41
+
42
+ cp "#{GV::Valley.root}/scripts/receiver", "#{HOME}/receiver"
43
+ sh "chmod +x #{HOME}/receiver"
44
+
45
+ end
46
+
47
+ task :aufs do
48
+ sh "lsmod | grep aufs || modprobe aufs || apt-get install -y linux-image-extra-`uname -r`"
49
+ end
50
+
51
+ desc "Install Docker"
52
+ task :docker => ['install:aufs','install:user'] do
53
+ if capture('docker -v').nil?
54
+ sh "egrep -i \"^docker\" /etc/group || groupadd docker"
55
+ sh "usermod -aG docker #{USER}"
56
+ sh "curl https://get.docker.io/gpg | apt-key add -"
57
+ sh "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
58
+ sh "apt-get update"
59
+ sh "apt-get install -y lxc-docker"
60
+ sh "sleep 2" # give docker a moment i guess
61
+ end
62
+ end
63
+
64
+ desc "Pull Docker repo"
65
+ task :pull, [:repo] => ['install:docker'] do |t,args|
66
+ if capture("docker images | grep #{args.repo}").empty?
67
+ sh "docker pull #{args.repo}"
68
+ end
69
+ end
70
+
71
+ desc "Pulls flynn/etcd"
72
+ task :etcd do
73
+ Rake::Task['install:pull'].invoke("flynn/etcd")
74
+ end
75
+
76
+ desc "Pulls flynn/slugbuilder"
77
+ task :slugbuilder => ['install:docker'] do
78
+ Rake::Task['install:pull'].invoke("flynn/slugbuilder")
79
+ end
80
+
81
+ desc "Pulls flynn/slugrunner"
82
+ task :slugrunner => ['install:docker'] do
83
+ Rake::Task['install:pull'].invoke("flynn/slugrunner")
84
+ end
85
+
86
+ desc "Install Haproxy"
87
+ task :haproxy => ['install:user'] do
88
+ if capture("haproxy -v").nil?
89
+ sh "add-apt-repository -y ppa:vbernat/haproxy-1.5"
90
+ sh "apt-get update -y -q"
91
+ sh "apt-get install haproxy -y -q"
92
+ sh "echo \"ENABLED=1\" >> /etc/default/haproxy"
93
+ end
94
+ cp "#{GV::Valley.root}/scripts/haproxy.cfg", "/etc/haproxy/haproxy.cfg"
95
+ sh "usermod -aG haproxy #{USER}"
96
+ chmod 0770, "/etc/haproxy/haproxy.cfg"
97
+ sh "chgrp haproxy /etc/haproxy/haproxy.cfg"
98
+ end
99
+
100
+
101
+ desc "Installs bare host to run apps"
102
+ task :host do
103
+ Rake::Task['install:slugrunner'].invoke
104
+ end
105
+
106
+ desc "Installs Green Valley"
107
+ task :valley => ['install:domain','install:user'] do
108
+ Rake::Task['install:gitreceive'].invoke
109
+ Rake::Task['install:slugbuilder'].invoke
110
+ Rake::Task['install:slugrunner'].invoke
111
+ Rake::Task['install:haproxy'].invoke
112
+ end
113
+
114
+ end
115
+
116
+ task :install => ['install:valley']