vhost_generator 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -221,7 +221,13 @@ class ForemanExportApplication
221
221
  end
222
222
 
223
223
  def service
224
- config.generator # nginx
224
+ if config.generator == 'nginx'
225
+ 'nginx'
226
+ elsif config.generator == 'apache'
227
+ 'apache2'
228
+ else
229
+ raise RuntimeError, "Can't guess service for generator=#{config.generator}"
230
+ end
225
231
  end
226
232
 
227
233
  def target
@@ -229,13 +235,7 @@ class ForemanExportApplication
229
235
  end
230
236
 
231
237
  def vhost_dir
232
- if config.generator == 'nginx'
233
- '/etc/nginx/sites-enabled'
234
- elsif config.generator == 'apache'
235
- '/etc/apache2/sites-enabled'
236
- else
237
- raise RuntimeError, "Can't guess vhost_dir for generator=#{config.generator}"
238
- end
238
+ "/etc/#{service}/sites-enabled"
239
239
  end
240
240
 
241
241
  def vhost_config
@@ -34,20 +34,20 @@ Feature: Wrap "foreman export"
34
34
  -h, -H, --help Display this help message.
35
35
  """
36
36
 
37
- Scenario: display source that will be executed
37
+ Scenario Outline: display source that will be executed with generator <generator>
38
38
  Given a file named "Procfile" with:
39
39
  """
40
40
  clock: ....
41
41
  web: bundle exec webserver -p $PORT
42
42
  """
43
- When I run `bundle exec foreman-export-vhost upstart /etc/init -f Procfile -a MYAPP -u MYUSER -p 6000 -c clock=1,web=2 -L 80,81 -S localhost,myapp.com -K web -G nginx -O assets_expire_in=15d -N -R`
43
+ When I run `bundle exec foreman-export-vhost upstart /etc/init -f Procfile -a MYAPP -u MYUSER -p 6000 -c clock=1,web=2 -L 80,81 -S localhost,myapp.com -K web -G <generator> -O assets_expire_in=15d -N -R`
44
44
  Then the output should match:
45
45
  """
46
- bundle exec vhost-generator -a MYAPP -f /.*/public -l 80,81 -s localhost,myapp.com -p 6100,6101 -g nginx -o assets_expire_in\\=15d \| sudo tee /etc/nginx/sites-enabled/vhost-MYAPP.conf
46
+ bundle exec vhost-generator -a MYAPP -f /.*/public -l 80,81 -s localhost,myapp.com -p 6100,6101 -g <generator> -o assets_expire_in\\=15d \| sudo tee <config_dir>/vhost-MYAPP.conf
47
47
  """
48
48
  And the output should contain:
49
49
  """
50
- sudo service nginx reload
50
+ sudo service <service> reload
51
51
  sudo service MYAPP stop >/dev/null 2>&1 || true
52
52
  sudo rm -rf /etc/init/MYAPP-*.conf
53
53
  """
@@ -61,3 +61,8 @@ Feature: Wrap "foreman export"
61
61
  echo "Finished, now open your browser and see if everything works."
62
62
  # Now, try to run this script again without the --dry-run switch!
63
63
  """
64
+
65
+ Scenarios:
66
+ | generator | service | config_dir |
67
+ | nginx | nginx | /etc/nginx/sites-enabled |
68
+ | apache | apache2 | /etc/apache2/sites-enabled |
@@ -0,0 +1,213 @@
1
+ Feature: Output apache configuration file
2
+
3
+ In order to run my application as an apache virtualhost
4
+ As a user of the library
5
+ I want to output a apache virtualhost configuration.
6
+
7
+ Scenario: using command-line options, multiple upstreams
8
+ When I run `bundle exec vhost-generator -g apache -o assets_expire_in=15d -a testapp -f html -l 80,81 -s localhost,my.server -p 5000,5001,5002 -r /myapp`
9
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
10
+ And the output should contain:
11
+ """
12
+ <VirtualHost *:80 *:81>
13
+ """
14
+ And the output should contain:
15
+ """
16
+ ServerName localhost
17
+ ServerAlias my.server
18
+ """
19
+ And the output should match /DocumentRoot.*html/
20
+ And the output should contain:
21
+ """
22
+ AllowEncodedSlashes On
23
+ """
24
+ And the output should contain:
25
+ """
26
+ <Proxy balancer://testapp>
27
+ BalancerMember http://localhost:5000
28
+ BalancerMember http://localhost:5001
29
+ BalancerMember http://localhost:5002
30
+ </Proxy>
31
+ """
32
+ And the output should contain:
33
+ """
34
+ # Redirect all non-static requests to instances
35
+ RewriteEngine On
36
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
37
+ RewriteRule ^/(.*)$ balancer://testapp%{REQUEST_URI} [P,QSA,L]
38
+ """
39
+ And the output should contain:
40
+ """
41
+ <Location /myapp/assets>
42
+ ExpiresActive On
43
+ Header unset ETag
44
+ FileETag None
45
+ ExpiresDefault "access plus 15 days"
46
+ </Location>
47
+ """
48
+ And the output should contain:
49
+ """
50
+ ErrorDocument 500 /500.html
51
+ ErrorDocument 502 /500.html
52
+ ErrorDocument 503 /500.html
53
+ ErrorDocument 504 /500.html
54
+ LimitRequestBody 2147483647
55
+ KeepAliveTimeout 10
56
+ </VirtualHost>
57
+ """
58
+
59
+ Scenario: using environment variables, multiple upstreams
60
+ When I set env variable "GENERATOR" to "apache"
61
+ And I set env variable "GENERATOR_OPTIONS" to "assets_expire_in=15d"
62
+ And I set env variable "APPLICATION" to "testapp"
63
+ And I set env variable "STATIC_FOLDER" to "html"
64
+ And I set env variable "SERVER_PORTS" to "80,81"
65
+ And I set env variable "SERVER_NAMES" to "localhost,my.server"
66
+ And I set env variable "INSTANCE_PORTS" to "5000,5001,5002"
67
+ And I set env variable "RAILS_RELATIVE_URL_ROOT" to "/myapp"
68
+ And I run `bundle exec vhost-generator`
69
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
70
+ And the output should contain:
71
+ """
72
+ <VirtualHost *:80 *:81>
73
+ """
74
+ And the output should contain:
75
+ """
76
+ ServerName localhost
77
+ ServerAlias my.server
78
+ """
79
+ And the output should match /DocumentRoot.*html/
80
+ And the output should contain:
81
+ """
82
+ AllowEncodedSlashes On
83
+ """
84
+ And the output should contain:
85
+ """
86
+ <Proxy balancer://testapp>
87
+ BalancerMember http://localhost:5000
88
+ BalancerMember http://localhost:5001
89
+ BalancerMember http://localhost:5002
90
+ </Proxy>
91
+ """
92
+ And the output should contain:
93
+ """
94
+ # Redirect all non-static requests to instances
95
+ RewriteEngine On
96
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
97
+ RewriteRule ^/(.*)$ balancer://testapp%{REQUEST_URI} [P,QSA,L]
98
+ """
99
+ And the output should contain:
100
+ """
101
+ <Location /myapp/assets>
102
+ ExpiresActive On
103
+ Header unset ETag
104
+ FileETag None
105
+ ExpiresDefault "access plus 15 days"
106
+ </Location>
107
+ """
108
+ And the output should contain:
109
+ """
110
+ ErrorDocument 500 /500.html
111
+ ErrorDocument 502 /500.html
112
+ ErrorDocument 503 /500.html
113
+ ErrorDocument 504 /500.html
114
+ LimitRequestBody 2147483647
115
+ KeepAliveTimeout 10
116
+ </VirtualHost>
117
+ """
118
+
119
+ Scenario: using command-line options, single upstream
120
+ When I run `bundle exec vhost-generator -g apache -o assets_expire_in=15d -a testapp -f html -l 80,81 -s localhost,my.server -p 5000 -r /myapp`
121
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
122
+ And the output should contain:
123
+ """
124
+ <VirtualHost *:80 *:81>
125
+ """
126
+ And the output should contain:
127
+ """
128
+ ServerName localhost
129
+ ServerAlias my.server
130
+ """
131
+ And the output should match /DocumentRoot.*html/
132
+ And the output should contain:
133
+ """
134
+ AllowEncodedSlashes On
135
+ """
136
+ And the output should contain:
137
+ """
138
+ # Redirect all non-static requests to instances
139
+ RewriteEngine On
140
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
141
+ RewriteRule ^/(.*)$ http://localhost:5000%{REQUEST_URI} [P,QSA,L]
142
+ """
143
+ And the output should contain:
144
+ """
145
+ <Location /myapp/assets>
146
+ ExpiresActive On
147
+ Header unset ETag
148
+ FileETag None
149
+ ExpiresDefault "access plus 15 days"
150
+ </Location>
151
+ """
152
+ And the output should contain:
153
+ """
154
+ ErrorDocument 500 /500.html
155
+ ErrorDocument 502 /500.html
156
+ ErrorDocument 503 /500.html
157
+ ErrorDocument 504 /500.html
158
+ LimitRequestBody 2147483647
159
+ KeepAliveTimeout 10
160
+ </VirtualHost>
161
+ """
162
+
163
+ Scenario: using environment variables, single upstream
164
+ When I set env variable "GENERATOR" to "apache"
165
+ And I set env variable "GENERATOR_OPTIONS" to "assets_expire_in=15d"
166
+ And I set env variable "APPLICATION" to "testapp"
167
+ And I set env variable "STATIC_FOLDER" to "html"
168
+ And I set env variable "SERVER_PORTS" to "80,81"
169
+ And I set env variable "SERVER_NAMES" to "localhost,my.server"
170
+ And I set env variable "INSTANCE_PORTS" to "5000"
171
+ And I set env variable "RAILS_RELATIVE_URL_ROOT" to "/myapp"
172
+ And I run `bundle exec vhost-generator`
173
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
174
+ And the output should contain:
175
+ """
176
+ <VirtualHost *:80 *:81>
177
+ """
178
+ And the output should contain:
179
+ """
180
+ ServerName localhost
181
+ ServerAlias my.server
182
+ """
183
+ And the output should match /DocumentRoot.*html/
184
+ And the output should contain:
185
+ """
186
+ AllowEncodedSlashes On
187
+ """
188
+ And the output should contain:
189
+ """
190
+ # Redirect all non-static requests to instances
191
+ RewriteEngine On
192
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
193
+ RewriteRule ^/(.*)$ http://localhost:5000%{REQUEST_URI} [P,QSA,L]
194
+ """
195
+ And the output should contain:
196
+ """
197
+ <Location /myapp/assets>
198
+ ExpiresActive On
199
+ Header unset ETag
200
+ FileETag None
201
+ ExpiresDefault "access plus 15 days"
202
+ </Location>
203
+ """
204
+ And the output should contain:
205
+ """
206
+ ErrorDocument 500 /500.html
207
+ ErrorDocument 502 /500.html
208
+ ErrorDocument 503 /500.html
209
+ ErrorDocument 504 /500.html
210
+ LimitRequestBody 2147483647
211
+ KeepAliveTimeout 10
212
+ </VirtualHost>
213
+ """
@@ -4,7 +4,7 @@ Feature: Output nginx configuration file
4
4
  As a user of the library
5
5
  I want to output a nginx virtualhost configuration.
6
6
 
7
- Scenario: using command-line options
7
+ Scenario: using command-line options, multiple upstreams
8
8
  When I run `bundle exec vhost-generator -g nginx -o assets_expire_in=15d -a testapp -f html -l 80,81 -s localhost,my.server -p 5000,5001,5002 -r /myapp`
9
9
  Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
10
10
  And the output should contain:
@@ -53,7 +53,7 @@ Feature: Output nginx configuration file
53
53
  }
54
54
  """
55
55
 
56
- Scenario: using environment variables
56
+ Scenario: using environment variables, multiple upstreams
57
57
  When I set env variable "GENERATOR" to "nginx"
58
58
  And I set env variable "GENERATOR_OPTIONS" to "assets_expire_in=15d"
59
59
  And I set env variable "APPLICATION" to "testapp"
@@ -109,3 +109,93 @@ Feature: Output nginx configuration file
109
109
  keepalive_timeout 10;
110
110
  }
111
111
  """
112
+
113
+ Scenario: using command-line options, single upstream
114
+ When I run `bundle exec vhost-generator -g nginx -o assets_expire_in=15d -a testapp -f html -l 80,81 -s localhost,my.server -p 5000 -r /myapp`
115
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
116
+ And the output should contain:
117
+ """
118
+ server {
119
+ listen 80;
120
+ listen 81;
121
+ """
122
+ And the output should contain:
123
+ """
124
+ server_name localhost, my.server;
125
+ """
126
+ And the output should match /root.*html;/
127
+ And the output should contain:
128
+ """
129
+ try_files $uri/index.html $uri @upstream;
130
+ location @upstream {
131
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
132
+ proxy_set_header X-Forwarded-Proto $scheme;
133
+ proxy_set_header Host $http_host;
134
+ proxy_redirect off;
135
+ proxy_pass http://localhost:5000;
136
+ }
137
+ """
138
+ And the output should contain:
139
+ """
140
+ location /myapp/assets {
141
+ gzip_static on; # to serve pre-gzipped version
142
+ expires 15d;
143
+ add_header Cache-Control public;
144
+ }
145
+ """
146
+ And the output should contain:
147
+ """
148
+ error_page 500 502 503 504 /500.html;
149
+ client_max_body_size 4G;
150
+ keepalive_timeout 10;
151
+ }
152
+ """
153
+
154
+ Scenario: using environment variables, single upstream
155
+ When I set env variable "GENERATOR" to "nginx"
156
+ And I set env variable "GENERATOR_OPTIONS" to "assets_expire_in=15d"
157
+ And I set env variable "APPLICATION" to "testapp"
158
+ And I set env variable "STATIC_FOLDER" to "html"
159
+ And I set env variable "SERVER_PORTS" to "80,81"
160
+ And I set env variable "SERVER_NAMES" to "localhost,my.server"
161
+ And I set env variable "INSTANCE_PORTS" to "5000"
162
+ And I set env variable "RAILS_RELATIVE_URL_ROOT" to "/myapp"
163
+ And I run `bundle exec vhost-generator`
164
+ Then the output should match /FILE GENERATED BY.*EDIT AT YOUR OWN RISK/
165
+ And the output should contain:
166
+ """
167
+ server {
168
+ listen 80;
169
+ listen 81;
170
+ """
171
+ And the output should contain:
172
+ """
173
+ server_name localhost, my.server;
174
+ """
175
+ And the output should match /root.*html;/
176
+ And the output should contain:
177
+ """
178
+ try_files $uri/index.html $uri @upstream;
179
+ location @upstream {
180
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
181
+ proxy_set_header X-Forwarded-Proto $scheme;
182
+ proxy_set_header Host $http_host;
183
+ proxy_redirect off;
184
+ proxy_pass http://localhost:5000;
185
+ }
186
+ """
187
+ And the output should contain:
188
+ """
189
+ location /myapp/assets {
190
+ gzip_static on; # to serve pre-gzipped version
191
+ expires 15d;
192
+ add_header Cache-Control public;
193
+ }
194
+ """
195
+ And the output should contain:
196
+ """
197
+ error_page 500 502 503 504 /500.html;
198
+ client_max_body_size 4G;
199
+ keepalive_timeout 10;
200
+ }
201
+ """
@@ -8,5 +8,5 @@ Feature: Output program version
8
8
  When I run `bundle exec vhost-generator --version`
9
9
  Then it should pass with:
10
10
  """
11
- vhost-generator, version 0.3.1
11
+ vhost-generator, version 0.3.2
12
12
  """
@@ -0,0 +1,98 @@
1
+ require 'ostruct'
2
+ require 'erb'
3
+
4
+ module VhostGenerator
5
+
6
+ # Apache VhostGenerator
7
+ #
8
+ class ApacheGenerator
9
+ attr_reader :cfg, :options
10
+ def initialize(cfg, options={})
11
+ @cfg = cfg
12
+ @options = OpenStruct.new(default_options.merge(options))
13
+ @options.upstream ||= cfg.application
14
+ @options.has_upstream = cfg.instance_ports.length > 1
15
+ @options.proxy_pass =
16
+ if @options.has_upstream
17
+ "balancer://#{@options.upstream}"
18
+ elsif cfg.instance_ports.length > 0
19
+ "http://localhost:#{cfg.instance_ports.first}"
20
+ else
21
+ raise ArgumentError, "Please specify at least 1 instance-port."
22
+ end
23
+ # by commodity, support same syntax as nginx: 15d, 2m, 1y
24
+ expires = {'d' => 'days', 'm' => 'months', 'y' => 'years'}
25
+ @options.assets_expire_in.gsub!(/\A(\d+)([dmy])\Z/) do |_|
26
+ [$~[1], expires.fetch($~[2])].join(' ') # s/15d/15 days/g
27
+ end
28
+ # by commodity, support same syntax as nginx: 2k, 2M, 2G
29
+ sizes = {'k' => 1024, 'M' => 1024**2, 'G' => 1024**3}
30
+ if @options.client_max_body_size =~ /\A(\d+)([kMG])\Z/
31
+ @options.client_max_body_size = Integer($~[1]) * sizes[$~[2]] - 1
32
+ else
33
+ @options.client_max_body_size = Integer(@options.client_max_body_size)
34
+ end
35
+ # apache does not support body sizes > 2G
36
+ if @options.client_max_body_size > (size_max = 2 * sizes['G'] - 1)
37
+ @options.client_max_body_size = size_max
38
+ end
39
+ @options.freeze
40
+ end
41
+
42
+ def render
43
+ template.result(binding)
44
+ end
45
+
46
+ protected
47
+
48
+ def default_options
49
+ Hash[ 'client_max_body_size' => '2G', # max for apache
50
+ 'keepalive_timeout' => '10',
51
+ 'assets_expire_in' => '60d' ].freeze
52
+ end
53
+
54
+ private
55
+
56
+ def template
57
+ @template ||= ERB.new <<EOF
58
+ #### FILE GENERATED BY `<%= String(cfg.cmdline) %>`, EDIT AT YOUR OWN RISK ####
59
+ #### Note: you may need to a2enmod the following modules: proxy_http, proxy_balancer, rewrite, headers, expires
60
+
61
+ <VirtualHost <%= cfg.server_ports.map{ |p| "*:\#{p}" }.join(' ') %>>
62
+ <% unless cfg.server_names.empty? %>ServerName <%= cfg.server_names.first %><% end %>
63
+ <% if cfg.server_names.length >= 2 %>ServerAlias <%=
64
+ cfg.server_names[1..-1].join(' ') %><% end %>
65
+
66
+ DocumentRoot <%= cfg.static_folder %>;
67
+
68
+ AllowEncodedSlashes On
69
+
70
+ <% if options.has_upstream %>
71
+ <Proxy balancer://<%= options.upstream %>>
72
+ <% cfg.instance_ports.each do |p| %> BalancerMember http://localhost:<%= p %>
73
+ <% end %></Proxy>
74
+ <% end %>
75
+
76
+ # Redirect all non-static requests to instances
77
+ RewriteEngine On
78
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
79
+ RewriteRule ^/(.*)$ <%= options.proxy_pass %>%{REQUEST_URI} [P,QSA,L]
80
+
81
+ <Location <%= cfg.relative_root %>assets>
82
+ ExpiresActive On
83
+ Header unset ETag
84
+ FileETag None
85
+ ExpiresDefault "access plus <%= options.assets_expire_in %>"
86
+ </Location>
87
+
88
+ ErrorDocument 500 /500.html
89
+ ErrorDocument 502 /500.html
90
+ ErrorDocument 503 /500.html
91
+ ErrorDocument 504 /500.html
92
+ LimitRequestBody <%= options.client_max_body_size %>
93
+ KeepAliveTimeout <%= options.keepalive_timeout %>
94
+ </VirtualHost>
95
+ EOF
96
+ end
97
+ end
98
+ end
@@ -131,7 +131,7 @@ module VhostGenerator
131
131
  rescue SystemExit => ex
132
132
  # Exit silently with current status
133
133
  raise
134
- rescue OptionParser::InvalidOption => ex
134
+ rescue OptionParser::InvalidOption, ArgumentError => ex
135
135
  $stderr.puts ex.message
136
136
  exit(false)
137
137
  rescue Exception => ex
@@ -11,6 +11,15 @@ module VhostGenerator
11
11
  @cfg = cfg
12
12
  @options = OpenStruct.new(default_options.merge(options))
13
13
  @options.upstream ||= cfg.application
14
+ @options.has_upstream = cfg.instance_ports.length > 1
15
+ @options.proxy_pass =
16
+ if @options.has_upstream
17
+ @options.upstream
18
+ elsif cfg.instance_ports.length > 0
19
+ "localhost:#{cfg.instance_ports.first}"
20
+ else
21
+ raise ArgumentError, "Please specify at least 1 instance-port."
22
+ end
14
23
  @options.freeze
15
24
  end
16
25
 
@@ -31,10 +40,11 @@ module VhostGenerator
31
40
  @template ||= ERB.new <<EOF
32
41
  #### FILE GENERATED BY `<%= String(cfg.cmdline) %>`, EDIT AT YOUR OWN RISK ####
33
42
 
43
+ <% if options.has_upstream %>
34
44
  upstream <%= options.upstream %> {
35
45
  <% cfg.instance_ports.each do |p| %> server localhost:<%= p %> fail_timeout=0;
36
46
  <% end %>}
37
-
47
+ <% end %>
38
48
  server {
39
49
  <% cfg.server_ports.each do |p| %>listen <%= p %>;
40
50
  <% end %>
@@ -49,7 +59,7 @@ server {
49
59
  proxy_set_header X-Forwarded-Proto $scheme;
50
60
  proxy_set_header Host $http_host;
51
61
  proxy_redirect off;
52
- proxy_pass http://<%= options.upstream %>;
62
+ proxy_pass http://<%= options.proxy_pass %>;
53
63
  }
54
64
 
55
65
  location <%= cfg.relative_root %>assets {
@@ -1,3 +1,3 @@
1
1
  module VhostGenerator
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'vhost_generator/nginx_generator'
2
+ require 'vhost_generator/apache_generator'
2
3
  require 'shellwords'
3
4
 
4
5
  module VhostGenerator
@@ -85,7 +86,8 @@ module VhostGenerator
85
86
  attr_writer :registry
86
87
  def registry
87
88
  # XXX use a real registry to reduce coupling
88
- @registry ||= {'nginx' => VhostGenerator::NginxGenerator}
89
+ @registry ||= {'nginx' => VhostGenerator::NginxGenerator,
90
+ 'apache' => VhostGenerator::ApacheGenerator}
89
91
  end
90
92
 
91
93
  def parse_word_list(s)
@@ -0,0 +1,73 @@
1
+ require 'vhost_generator/apache_generator'
2
+
3
+ describe VhostGenerator::ApacheGenerator do
4
+ let(:config) { double('vhost config').as_null_object }
5
+ subject do
6
+ described_class.new(config, 'upstream' => 'myupstream')
7
+ end
8
+
9
+ describe "#render" do
10
+ let(:output) { subject.render }
11
+
12
+ it "includes the cmdline in a comment" do
13
+ config.stub(:cmdline).and_return('CMDLINE')
14
+ expect(output).to match(/^#### FILE GENERATED BY .*CMDLINE/)
15
+ end
16
+
17
+ context "when multiple upstreams" do
18
+ before { config.stub(:instance_ports).and_return([1337, 1338]) }
19
+
20
+ it "declares the named upstream" do
21
+ expect(output).to match(%r{<Proxy balancer://myupstream>})
22
+ end
23
+
24
+ it "declares all the requested upstream servers" do
25
+ expect(output).to include('BalancerMember http://localhost:1337')
26
+ expect(output).to include('BalancerMember http://localhost:1338')
27
+ end
28
+
29
+ it "proxies to the named upstream" do
30
+ expect(output).to include(
31
+ 'RewriteRule ^/(.*)$ balancer://myupstream%{REQUEST_URI} [P,QSA,L]')
32
+ end
33
+ end
34
+
35
+ context "when single upstream" do
36
+ before { config.stub(:instance_ports).and_return([1337]) }
37
+
38
+ it "declares no upstream section" do
39
+ expect(output).not_to match(%r{<Proxy balancer://\w+>})
40
+ end
41
+
42
+ it "does not declare any upstream servers" do
43
+ expect(output).not_to include('BalancerMember http://localhost:1337')
44
+ end
45
+
46
+ it "proxies the single upstream directly" do
47
+ expect(output).to include(
48
+ 'RewriteRule ^/(.*)$ http://localhost:1337%{REQUEST_URI} [P,QSA,L]')
49
+ end
50
+ end
51
+
52
+ it "listens to the requested server ports" do
53
+ config.stub(:server_ports).and_return([12345, 12346])
54
+ expect(output).to include('<VirtualHost *:12345 *:12346>')
55
+ end
56
+
57
+ it "declares the server names it responds to" do
58
+ config.stub(:server_names).and_return(%w(host1 host2 host3))
59
+ expect(output).to include('ServerName host1')
60
+ expect(output).to include('ServerAlias host2 host3')
61
+ end
62
+
63
+ it "declares the requested document root" do
64
+ config.stub(:static_folder).and_return('STATIC-FOLDER')
65
+ expect(output).to include('DocumentRoot STATIC-FOLDER')
66
+ end
67
+
68
+ it "respects custom relative_roots" do
69
+ config.stub(:relative_root).and_return('RELATIVE_ROOT')
70
+ expect(output).to include('<Location RELATIVE_ROOTassets>')
71
+ end
72
+ end
73
+ end
@@ -14,18 +14,37 @@ describe VhostGenerator::NginxGenerator do
14
14
  expect(output).to match(/^#### FILE GENERATED BY .*CMDLINE/)
15
15
  end
16
16
 
17
- it "declares the named upstream" do
18
- expect(output).to include('upstream myupstream {')
19
- end
17
+ context "when multiple upstreams" do
18
+ before { config.stub(:instance_ports).and_return([1337, 1338]) }
19
+
20
+ it "declares the named upstream" do
21
+ expect(output).to match(/upstream myupstream {/)
22
+ end
23
+
24
+ it "declares all the requested upstream servers" do
25
+ expect(output).to include('server localhost:1337 fail_timeout=0;')
26
+ expect(output).to include('server localhost:1338 fail_timeout=0;')
27
+ end
20
28
 
21
- it "references the named upstream" do
22
- expect(output).to include('http://myupstream;')
29
+ it "proxies to the named upstream" do
30
+ expect(output).to include('proxy_pass http://myupstream;')
31
+ end
23
32
  end
24
33
 
25
- it "declares all the requested upstream servers" do
26
- config.stub(:instance_ports).and_return([1337, 1338])
27
- expect(output).to include('server localhost:1337 fail_timeout=0;')
28
- expect(output).to include('server localhost:1338 fail_timeout=0;')
34
+ context "when single upstream" do
35
+ before { config.stub(:instance_ports).and_return([1337]) }
36
+
37
+ it "declares no upstream section" do
38
+ expect(output).not_to match(/upstream \w+ {/)
39
+ end
40
+
41
+ it "does not declare any upstream servers" do
42
+ expect(output).not_to include('server localhost:1337 fail_timeout=0;')
43
+ end
44
+
45
+ it "proxies the single upstream directly" do
46
+ expect(output).to include('proxy_pass http://localhost:1337;')
47
+ end
29
48
  end
30
49
 
31
50
  it "listens to the requested server ports" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vhost_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-10 00:00:00.000000000 Z
12
+ date: 2012-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -94,11 +94,13 @@ files:
94
94
  - bin/vhost-generator
95
95
  - features/foreman-export-vhost.feature
96
96
  - features/help.feature
97
+ - features/output-apache.feature
97
98
  - features/output-nginx.feature
98
99
  - features/step_definitions/dev_steps.rb
99
100
  - features/support/env.rb
100
101
  - features/version.feature
101
102
  - lib/vhost_generator.rb
103
+ - lib/vhost_generator/apache_generator.rb
102
104
  - lib/vhost_generator/application.rb
103
105
  - lib/vhost_generator/capistrano.rb
104
106
  - lib/vhost_generator/cmdline_builder.rb
@@ -107,6 +109,7 @@ files:
107
109
  - lib/vhost_generator/vhost_configuration.rb
108
110
  - lib/vhost_generator/vhost_generator_module.rb
109
111
  - script/cibuild
112
+ - spec/apache_generator_spec.rb
110
113
  - spec/application_env_spec.rb
111
114
  - spec/application_options_spec.rb
112
115
  - spec/cmdline_builder_spec.rb
@@ -127,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
130
  version: '0'
128
131
  segments:
129
132
  - 0
130
- hash: -968082637
133
+ hash: 336320189
131
134
  required_rubygems_version: !ruby/object:Gem::Requirement
132
135
  none: false
133
136
  requirements:
@@ -136,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
139
  version: '0'
137
140
  segments:
138
141
  - 0
139
- hash: -968082637
142
+ hash: 336320189
140
143
  requirements: []
141
144
  rubyforge_project:
142
145
  rubygems_version: 1.8.23
@@ -147,11 +150,13 @@ summary: vhost_generator outputs nginx or apache VirtualHost configurations to r
147
150
  test_files:
148
151
  - features/foreman-export-vhost.feature
149
152
  - features/help.feature
153
+ - features/output-apache.feature
150
154
  - features/output-nginx.feature
151
155
  - features/step_definitions/dev_steps.rb
152
156
  - features/support/env.rb
153
157
  - features/version.feature
154
158
  - script/cibuild
159
+ - spec/apache_generator_spec.rb
155
160
  - spec/application_env_spec.rb
156
161
  - spec/application_options_spec.rb
157
162
  - spec/cmdline_builder_spec.rb