vagrant-cloudstack 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 065d4c664b0264e9b6ed28dbeb4795923e3d0a7b
4
- data.tar.gz: d975ba10d423c87128bb87defe72da057ac250d5
3
+ metadata.gz: 41759a933a26fc03edb1e84909cf4dc04f63c46a
4
+ data.tar.gz: f77c0919074fd8a7c9694b8c8f55b1b672fcaa0f
5
5
  SHA512:
6
- metadata.gz: 511d4d6baf9eb3d4de13c83558e9bd8bd65a851ba2466cd1aac9b524714ede49367e2af24f2275747ac6d632cd73c25e5c5f350acfe0f86ab733a72dc9493aef
7
- data.tar.gz: 278f00212ded80fb43f03e4894af1f5888e01094fbf20fbe4c476b48ce4a275eeb5306aafde1df5e8fac1df70d0c2ca6cbd801cb071095bbb410c9174c39c35a
6
+ metadata.gz: 2a9d4dc84e206fc45e88647629858245be3e37d3c5be0a9a98a6b68727aaf5774019e17fb0482fa6abb8d733fc2a82f5b824e562c479b09f80955b8890898b73
7
+ data.tar.gz: 8001d1b9bddc343a9113a6c279693a4d810ffb72d4b501ae118ff1ddd5523038a5611fbd1a51e1192eb14b7ad50060dfbd2e82956c4c857af9cb6fb7ef191979
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.10.0 (Sep 11, 2014)
2
+ * Clean up code base DRY
3
+ * Improve documentation
4
+ * Use URL safe base 64 encoding
5
+
1
6
  # 0.9.1 (Jun 29, 2014)
2
7
  * Fixed a bug intrcduced in 0.9.0, where we failed to fetch correct
3
8
  name because we didn't pass the correct parameters.
data/README.md CHANGED
@@ -204,6 +204,69 @@ supported with `vagrant-cloudstack`, currently. If any of these are
204
204
  specified, Vagrant will emit a warning, but will otherwise boot
205
205
  the Cloudstack machine.
206
206
 
207
+ ### Basic Networking
208
+
209
+ If you set the `network_type` to `basic`, you can use Security
210
+ Groups and associate rules in your Vagrantfile.
211
+
212
+ If you already have Security Groups, you can associate them to your
213
+ instance, with their IDs:
214
+
215
+ ```ruby
216
+ Vagrant.configure("2") do |config|
217
+ # ... other stuff
218
+
219
+ config.vm.provider :cloudstack do |cloudstack|
220
+ cloudstack.api_key = "foo"
221
+ cloudstack.secret_key = "bar"
222
+ cloudstack.network_type = "basic"
223
+ cloudstack.security_group_ids = ['aaaa-bbbb-cccc-dddd', '1111-2222-3333-4444']
224
+ end
225
+ end
226
+ ```
227
+
228
+ or their names:
229
+
230
+ ```ruby
231
+ Vagrant.configure("2") do |config|
232
+ # ... other stuff
233
+
234
+ config.vm.provider :cloudstack do |cloudstack|
235
+ cloudstack.api_key = "foo"
236
+ cloudstack.secret_key = "bar"
237
+ cloudstack.network_type = "basic"
238
+ cloudstack.security_group_names = ['
239
+ min_fantastiska_security_group', 'another_security_grupp']
240
+ end
241
+ end
242
+ ```
243
+
244
+ But you can also create your Security Groups in the Vagrantfile:
245
+
246
+ ```ruby
247
+ Vagrant.configure("2") do |config|
248
+ # ... other stuff
249
+
250
+ config.vm.provider :cloudstack do |cloudstack|
251
+ cloudstack.api_key = "foo"
252
+ cloudstack.secret_key = "bar"
253
+ cloudstack.network_type = "basic"
254
+ cloudstack.security_groups = [
255
+ {
256
+ :name => "Awesome_security_group",
257
+ :description => "Created from the Vagrantfile",
258
+ :rules => [
259
+ {:type => "ingress", :protocol => "TCP", :startport => 22, :endport => 22, :cidrlist => "0.0.0.0/0"},
260
+ {:type => "ingress", :protocol => "TCP", :startport => 80, :endport => 80, :cidrlist => "0.0.0.0/0"},
261
+ {:type => "egress", :protocol => "TCP", :startport => 81, :endport => 82, :cidrlist => "1.2.3.4/24"},
262
+ ]
263
+ }
264
+ ]
265
+ end
266
+ end
267
+ ```
268
+
269
+
207
270
  ## Synced Folders
208
271
 
209
272
  There is minimal support for synced folders. Upon `vagrant up`,
data/build_rpm.sh CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/bin/bash
2
- VERSION=0.9.1
2
+ VERSION=0.10.0
3
3
  mkdir -p /tmp/vagrant-cloudstack-build_rpm.$$/vagrant-cloudstack-$VERSION
4
4
  cp -r . /tmp/vagrant-cloudstack-build_rpm.$$/vagrant-cloudstack-$VERSION/
5
5
  tar -C /tmp/vagrant-cloudstack-build_rpm.$$/ -czf ~/rpmbuild/SOURCES/vagrant-cloudstack-$VERSION.tar.gz vagrant-cloudstack-$VERSION
@@ -74,6 +74,24 @@ module VagrantPlugins
74
74
  'templatefilter' => 'executable'})
75
75
  end
76
76
 
77
+ # Can't use Security Group IDs and Names at the same time
78
+ # Let's use IDs by default...
79
+ if security_group_ids.empty? and !security_group_names.empty?
80
+ security_group_ids = security_group_names.map { |name| name_to_id(env, name, "security_group") }
81
+ elsif !security_group_ids.empty?
82
+ security_group_names = security_group_ids.map { |id| id_to_name(env, id, "security_group") }
83
+ end
84
+
85
+ # Still no security group ids huh?
86
+ # Let's try to create some security groups from specifcation, if provided.
87
+ if !security_groups.empty? and security_group_ids.empty?
88
+ security_groups.each do |security_group|
89
+ sgname, sgid = create_security_group(env, security_group)
90
+ security_group_names.push(sgname)
91
+ security_group_ids.push(sgid)
92
+ end
93
+ end
94
+
77
95
  # If there is no keypair then warn the user
78
96
  if !keypair
79
97
  env[:ui].warn(I18n.t("vagrant_cloudstack.launch_no_keypair"))
@@ -87,25 +105,6 @@ module VagrantPlugins
87
105
  display_name = local_user + "_" + prefix + "_#{Time.now.to_i}"
88
106
  end
89
107
 
90
- # Can't use Security Group IDs and Names at the same time
91
- # Let's use IDs by default...
92
- if !security_group_ids.nil?
93
- if !security_group_names.nil?
94
- env[:ui].warn("Security Group Names won't be used since Security Group IDs are declared")
95
- security_group_names = nil
96
- end
97
-
98
- if !security_groups.nil?
99
- env[:ui].warn("Security Groups defined in Vagrantfile won't be used since Security Group IDs are declared")
100
- security_groups = nil
101
- end
102
- else # security_group_ids is nil
103
- if !security_group_names.nil? && !security_groups.nil?
104
- env[:ui].warn("Security Groups defined in Vagrantfile won't be used since Security Group Names are declared")
105
- security_groups = nil
106
- end
107
- end
108
-
109
108
  # Launch!
110
109
  env[:ui].info(I18n.t("vagrant_cloudstack.launching_instance"))
111
110
  env[:ui].info(" -- Display Name: #{display_name}")
@@ -117,99 +116,30 @@ module VagrantPlugins
117
116
  env[:ui].info(" -- Network: #{network_name} (#{network_id})") if !network_id.nil? or !network_name.nil?
118
117
  env[:ui].info(" -- Keypair: #{keypair}") if keypair
119
118
  env[:ui].info(" -- User Data: Yes") if user_data
120
- if !security_group_ids.nil?
121
- security_group_ids.each do |security_group_id|
122
- env[:ui].info(" -- Security Group ID: #{security_group_id}")
123
- end
124
- end
125
-
126
- if !security_group_names.nil? && security_group_ids.nil?
127
- security_group_ids = []
128
- security_group_names.each do |security_group_name|
129
- env[:ui].info(" -- Security Group Name: #{security_group_name}")
130
- # since we can't access Security Groups by name, we grab the ID and add it to the security_group_ids
131
- sg = env[:cloudstack_compute].list_security_groups["listsecuritygroupsresponse"]["securitygroup"].select { |sgrp| sgrp["name"] == security_group_name }
132
- security_group_ids.push(sg[0]["id"])
133
- end
134
- end
135
-
136
- if !security_groups.nil? && security_group_names.nil? && security_group_ids.nil?
137
- security_group_ids = []
138
- security_groups.each do |sg|
139
- # Creating the security group and retrieving it's ID
140
- sgid = nil
141
- begin
142
- sgid = env[:cloudstack_compute].create_security_group(:name => sg[:name],
143
- :description => sg[:description])["createsecuritygroupresponse"]["securitygroup"]["id"]
144
- env[:ui].info(" -- Security Group #{sg[:name]} created with ID: #{sgid}")
145
- rescue Exception => e
146
- if e.message =~ /already exis/
147
- existingGroup = env[:cloudstack_compute].list_security_groups["listsecuritygroupsresponse"]["securitygroup"].select { |secgrp| secgrp["name"] == sg[:name] }
148
- sgid = existingGroup[0]["id"]
149
- env[:ui].info(" -- Security Group #{sg[:name]} found with ID: #{sgid}")
150
- end
151
- end
152
-
153
- # security group is created and we have it's ID
154
- # so we add the rules... Does it really matter if they already exist ? CLoudstack seems to take care of that!
155
- sg[:rules].each do |rule|
156
- case rule[:type]
157
- when "ingress"
158
- env[:cloudstack_compute].authorize_security_group_ingress(:securityGroupId => sgid,
159
- :protocol => rule[:protocol],
160
- :startport => rule[:startport],
161
- :endport => rule[:endport],
162
- :cidrlist => rule[:cidrlist])
163
- env[:ui].info(" --- Ingress Rule added: #{rule[:protocol]} from #{rule[:startport]} to #{rule[:endport]} (#{rule[:cidrlist]})")
164
- when "egress"
165
- env[:cloudstack_compute].authorize_security_group_egress(:securityGroupId => sgid,
166
- :protocol => rule[:protocol],
167
- :startport => rule[:startport],
168
- :endport => rule[:endport],
169
- :cidrlist => rule[:cidrlist])
170
- env[:ui].info(" --- Egress Rule added: #{rule[:protocol]} from #{rule[:startport]} to #{rule[:endport]} (#{rule[:cidrlist]})")
171
- end
172
- end
173
-
174
- # We want to use the Security groups we created
175
- security_group_ids.push(sgid)
176
-
177
- # and record the security group ids for future deletion (of rules and groups if possible)
178
- security_groups_file = env[:machine].data_dir.join('security_groups')
179
- security_groups_file.open('a+') do |f|
180
- f.write("#{sgid}\n")
181
- end
182
- end
119
+ security_group_names.zip(security_group_ids).each do |security_group_name, security_group_id|
120
+ env[:ui].info(" -- Security Group: #{security_group_name} (#{security_group_id})")
183
121
  end
184
122
 
185
123
  begin
186
- case network_type
187
- when "Advanced"
188
- options = {
189
- :display_name => display_name,
190
- :group => group,
191
- :zone_id => zone_id,
192
- :flavor_id => service_offering_id,
193
- :image_id => template_id,
194
- :network_ids => [network_id]
195
- }
196
- when "Basic"
197
- options = {
198
- :display_name => display_name,
199
- :group => group,
200
- :zone_id => zone_id,
201
- :flavor_id => service_offering_id,
202
- :image_id => template_id,
203
- :security_group_ids => security_group_ids
204
- }
124
+ options = {
125
+ :display_name => display_name,
126
+ :group => group,
127
+ :zone_id => zone_id,
128
+ :flavor_id => service_offering_id,
129
+ :image_id => template_id
130
+ }
131
+
132
+ if network_type == "Advanced"
133
+ options['network_ids'] = [network_id]
134
+ elsif network_type == "Basic"
135
+ options['security_group_ids'] = security_group_ids
205
136
  end
206
-
207
137
  options['project_id'] = project_id if project_id != nil
208
138
  options['key_name'] = keypair if keypair != nil
209
139
  options['name'] = hostname if hostname != nil
210
140
 
211
141
  if user_data != nil
212
- options['user_data'] = Base64.encode64(user_data)
142
+ options['user_data'] = Base64.urlsafe_encode64(user_data)
213
143
  if options['user_data'].length > 2048
214
144
  raise Errors::UserdataError,
215
145
  :userdataLength => options['user_data'].length
@@ -288,6 +218,43 @@ module VagrantPlugins
288
218
  @app.call(env)
289
219
  end
290
220
 
221
+ def create_security_group(env, security_group)
222
+ begin
223
+ sgid = env[:cloudstack_compute].create_security_group(:name => security_group[:name],
224
+ :description => security_group[:description])["createsecuritygroupresponse"]["securitygroup"]["id"]
225
+ env[:ui].info(" -- Security Group #{security_group[:name]} created with ID: #{sgid}")
226
+ rescue Exception => e
227
+ if e.message =~ /already exis/
228
+ sgid = name_to_id(env, security_group[:name], "security_group")
229
+ env[:ui].info(" -- Security Group #{security_group[:name]} found with ID: #{sgid}")
230
+ end
231
+ end
232
+
233
+ # security group is created and we have it's ID
234
+ # so we add the rules... Does it really matter if they already exist ? CLoudstack seems to take care of that!
235
+ security_group[:rules].each do |rule|
236
+ rule_options = {
237
+ :securityGroupId => sgid,
238
+ :protocol => rule[:protocol],
239
+ :startport => rule[:startport],
240
+ :endport => rule[:endport],
241
+ :cidrlist => rule[:cidrlist]
242
+ }
243
+
244
+ # The rule[:type] is either ingress or egress, but the method call looks the same.
245
+ # We build a dynamic method name and then send it off.
246
+ env[:cloudstack_compute].send("authorize_security_group_#{rule[:type]}".to_sym, rule_options)
247
+ env[:ui].info(" --- #{rule[:type].capitalize} Rule added: #{rule[:protocol]} from #{rule[:startport]} to #{rule[:endport]} (#{rule[:cidrlist]})")
248
+ end
249
+
250
+ # and record the security group ids for future deletion (of rules and groups if possible)
251
+ security_groups_file = env[:machine].data_dir.join('security_groups')
252
+ security_groups_file.open('a+') do |f|
253
+ f.write("#{sgid}\n")
254
+ end
255
+ [security_group[:name], sgid]
256
+ end
257
+
291
258
  def recover(env)
292
259
  return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
293
260
 
@@ -327,13 +327,13 @@ module VagrantPlugins
327
327
  @pf_private_port = nil if @pf_private_port == UNSET_VALUE
328
328
 
329
329
  # Security Group IDs must be nil, since we can't default that
330
- @security_group_ids = nil if @security_group_ids == UNSET_VALUE
330
+ @security_group_ids = [] if @security_group_ids == UNSET_VALUE
331
331
 
332
332
  # Security Group Names must be nil, since we can't default that
333
- @security_group_names = nil if @security_group_names == UNSET_VALUE
333
+ @security_group_names = [] if @security_group_names == UNSET_VALUE
334
334
 
335
335
  # Security Groups must be nil, since we can't default that
336
- @security_groups = nil if @security_groups == UNSET_VALUE
336
+ @security_groups = [] if @security_groups == UNSET_VALUE
337
337
 
338
338
  # Display name must be nil, since we can't default that
339
339
  @display_name = nil if @display_name == UNSET_VALUE
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Cloudstack
3
- VERSION = "0.9.1"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
@@ -35,11 +35,11 @@ describe VagrantPlugins::Cloudstack::Config do
35
35
  its("pf_ip_address_id") { should be_nil }
36
36
  its("pf_public_port") { should be_nil }
37
37
  its("pf_private_port") { should be_nil }
38
- its("security_group_ids") { should be_nil }
38
+ its("security_group_ids") { should == [] }
39
39
  its("display_name") { should be_nil }
40
40
  its("group") { should be_nil }
41
- its("security_group_names") { should be_nil }
42
- its("security_groups") { should be_nil }
41
+ its("security_group_names") { should == [] }
42
+ its("security_groups") { should == [] }
43
43
  its("user_data") { should be_nil }
44
44
  end
45
45
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-cloudstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitchell Hashimoto
@@ -18,7 +18,7 @@ authors:
18
18
  autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
- date: 2014-06-29 00:00:00.000000000 Z
21
+ date: 2014-09-11 00:00:00.000000000 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: fog