vagrant-cloudstack 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e63f390567590eef3c9213dfac92b9d2d8d5f1b
4
- data.tar.gz: 283ca0b998a55fdd780756abc76646152f2a6793
3
+ metadata.gz: 1a9724648009ab879e5942a62aa08d4c188252d7
4
+ data.tar.gz: 1d0a3bdc0cf73b524751f9d05d93ecc0936dc61a
5
5
  SHA512:
6
- metadata.gz: c848430cc6bffd286e66d8baa99403197ff3a1871130f541d88adcc834ac1c3660a6947d2db66ae266c2ddffae755fe6b2ccfbd83502dde5210cb52c83688659
7
- data.tar.gz: c2a967dd880d8a3daa7209ec99afd8e44ffa0d2b8850d90deed017ea3d58890deb56bfa36a22631240362ea7d178741ed06eedac80dc7ae9eb16fcbe234d8f14
6
+ metadata.gz: ea6c055c56ff72ae743972a5afa07c2b6bfc79bd7c65e9fa6b1838462c39e2e46cdb861236c8f99c87496a8aab1d0425863e91d2651680e4c278a7680e2ec1db
7
+ data.tar.gz: ecda268bcf95ab512827da77c009aca1e98c0ecd3f6f64e619c5ef675c35881efce7fcbdf0892f4343cfb9b941b2be1f4bd3edef1f0fa537e6360a3da82f0168
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p484
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  notifications:
3
3
  email:
4
- - carl.loa.odin@klarna.com
4
+ - engineering.support@klarna.com
5
5
  before_install:
6
6
  - sudo apt-get update -qq
7
7
  - sudo apt-get install -qq -y bsdtar
data/CHANGELOG.md CHANGED
@@ -1,4 +1,19 @@
1
- # 0.1.0
1
+ # 0.2.0 (Jan 8, 2014)
2
+
3
+ * Add display name and group support
4
+ * Add support for security groups
5
+ * Bump versions of dependencies
6
+
7
+ # 0.1.2 (Dec 12, 2013)
8
+ * Version bump to gemspec configucation to use shared email
9
+
10
+ # 0.1.1 (Dec 11, 2013)
11
+
12
+ * Enable Vagrant 1.4 compability
13
+ * Add support for security groups
14
+ * Add helper script to build a RPM for easier deployment
15
+
16
+ # 0.1.0 (Dec 3, 2013)
2
17
  * Plugin now enables parallelization by default.
3
18
  * This behaviour can be turned off by invoking vagrant with
4
19
  --no-parallel (this flag requires vagrant 1.2.1)
data/README.md CHANGED
@@ -76,7 +76,10 @@ no preconfigured defaults.
76
76
 
77
77
  And then run `vagrant up --provider=cloudstack`.
78
78
 
79
- This will start an instance in Cloudstack. And assuming your template on Cloudstack is Vagrant compatible _(vagrant user with official vagrant pub key in authorized_keys)_ SSH and provisioning will work as well.
79
+ This will start an instance in Cloudstack. And assuming your template
80
+ on Cloudstack is Vagrant compatible _(vagrant user with official
81
+ vagrant pub key in authorized_keys)_ SSH and provisioning will work as
82
+ well.
80
83
 
81
84
  ## Box Format
82
85
 
@@ -112,6 +115,8 @@ This provider exposes quite a few provider-specific configuration options:
112
115
  * `pf_ip_address_id` - IP address ID for port forwarding rule
113
116
  * `pf_public_port` - Public port for port forwarding rule
114
117
  * `pf_private_port` - Private port for port forwarding rule
118
+ * `display_name` - Display name for the instance
119
+ * `group` - Group for the instance
115
120
 
116
121
  These can be set like typical provider-specific configuration:
117
122
 
data/build_rpm.sh ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ VERSION=0.2.0
3
+ mkdir -p /tmp/vagrant-cloudstack-build_rpm.$$/vagrant-cloudstack-$VERSION
4
+ cp -r . /tmp/vagrant-cloudstack-build_rpm.$$/vagrant-cloudstack-$VERSION/
5
+ tar -C /tmp/vagrant-cloudstack-build_rpm.$$/ -czf ~/rpmbuild/SOURCES/vagrant-cloudstack-$VERSION.tar.gz vagrant-cloudstack-$VERSION
6
+ rpmbuild --define "gemver $VERSION" -bb vagrant-cloudstack.spec
7
+ rm -rf /tmp/vagrant-cloudstack-build_rpm.$$
@@ -25,44 +25,138 @@ module VagrantPlugins
25
25
  domain = env[:machine].provider_config.domain
26
26
 
27
27
  # Get the configs
28
- domain_config = env[:machine].provider_config.get_domain_config(domain)
29
- zone_id = domain_config.zone_id
30
- network_id = domain_config.network_id
31
- network_type = domain_config.network_type
32
- project_id = domain_config.project_id
33
- service_offering_id = domain_config.service_offering_id
34
- template_id = domain_config.template_id
35
- keypair = domain_config.keypair
36
-
37
- pf_ip_address_id = domain_config.pf_ip_address_id
38
- pf_public_port = domain_config.pf_public_port
39
- pf_private_port = domain_config.pf_private_port
28
+ domain_config = env[:machine].provider_config.get_domain_config(domain)
29
+ zone_id = domain_config.zone_id
30
+ network_id = domain_config.network_id
31
+ network_type = domain_config.network_type
32
+ project_id = domain_config.project_id
33
+ service_offering_id = domain_config.service_offering_id
34
+ template_id = domain_config.template_id
35
+ keypair = domain_config.keypair
36
+ pf_ip_address_id = domain_config.pf_ip_address_id
37
+ pf_public_port = domain_config.pf_public_port
38
+ pf_private_port = domain_config.pf_private_port
39
+ security_group_ids = domain_config.security_group_ids
40
+ display_name = domain_config.display_name
41
+ group = domain_config.group
42
+ security_group_ids = domain_config.security_group_ids
43
+ security_group_names = domain_config.security_group_names
44
+ security_groups = domain_config.security_groups
40
45
 
41
46
  # If there is no keypair then warn the user
42
47
  if !keypair
43
48
  env[:ui].warn(I18n.t("vagrant_cloudstack.launch_no_keypair"))
44
49
  end
45
50
 
51
+ if display_name.nil?
52
+ local_user = ENV['USER'].dup
53
+ local_user.gsub!(/[^-a-z0-9_]/i, "")
54
+ prefix = env[:root_path].basename.to_s
55
+ prefix.gsub!(/[^-a-z0-9_]/i, "")
56
+ display_name = local_user + "_" + prefix + "_#{Time.now.to_i}"
57
+ end
58
+
59
+ # Can't use Security Group IDs and Names at the same time
60
+ # Let's use IDs by default...
61
+ if !security_group_ids.nil?
62
+ if !security_group_names.nil?
63
+ env[:ui].warn("Security Group Names won't be used since Security Group IDs are declared")
64
+ security_group_names = nil
65
+ end
66
+
67
+ if !security_groups.nil?
68
+ env[:ui].warn("Security Groups defined in Vagrantfile won't be used since Security Group IDs are declared")
69
+ security_groups = nil
70
+ end
71
+ else # security_group_ids is nil
72
+ if !security_group_names.nil? && !security_groups.nil?
73
+ env[:ui].warn("Security Groups defined in Vagrantfile won't be used since Security Group Names are declared")
74
+ security_groups = nil
75
+ end
76
+ end
77
+
46
78
  # Launch!
47
79
  env[:ui].info(I18n.t("vagrant_cloudstack.launching_instance"))
80
+ env[:ui].info(" -- Display Name: #{display_name}")
81
+ env[:ui].info(" -- Group: #{group}") if group
82
+ env[:ui].info(" -- Service offering UUID: #{service_offering_id}")
48
83
  env[:ui].info(" -- Service offering UUID: #{service_offering_id}")
49
84
  env[:ui].info(" -- Template UUID: #{template_id}")
50
85
  env[:ui].info(" -- Project UUID: #{project_id}") if project_id != nil
51
86
  env[:ui].info(" -- Zone UUID: #{zone_id}")
52
87
  env[:ui].info(" -- Network UUID: #{network_id}") if network_id
53
88
  env[:ui].info(" -- Keypair: #{keypair}") if keypair
89
+ if !security_group_ids.nil?
90
+ security_group_ids.each do |security_group_id|
91
+ env[:ui].info(" -- Security Group ID: #{security_group_id}")
92
+ end
93
+ end
54
94
 
55
- local_user = ENV['USER'].dup
56
- local_user.gsub!(/[^-a-z0-9_]/i, "")
57
- prefix = env[:root_path].basename.to_s
58
- prefix.gsub!(/[^-a-z0-9_]/i, "")
59
- display_name = local_user + "_" + prefix + "_#{Time.now.to_i}"
95
+ if !security_group_names.nil? && security_group_ids.nil?
96
+ security_group_ids = []
97
+ security_group_names.each do |security_group_name|
98
+ env[:ui].info(" -- Security Group Name: #{security_group_name}")
99
+ # since we can't access Security Groups by name, we grab the ID and add it to the security_group_ids
100
+ sg = env[:cloudstack_compute].list_security_groups["listsecuritygroupsresponse"]["securitygroup"].select{|sgrp| sgrp["name"] == security_group_name }
101
+ security_group_ids.push(sg[0]["id"])
102
+ end
103
+ end
104
+
105
+ if !security_groups.nil? && security_group_names.nil? && security_group_ids.nil?
106
+ security_group_ids = []
107
+ security_groups.each do |sg|
108
+ # Creating the security group and retrieving it's ID
109
+ sgid = nil
110
+ begin
111
+ sgid = env[:cloudstack_compute].create_security_group(:name => sg[:name],
112
+ :description => sg[:description])["createsecuritygroupresponse"]["securitygroup"]["id"]
113
+ env[:ui].info(" -- Security Group #{sg[:name]} created with ID: #{sgid}")
114
+ rescue Exception => e
115
+ if e.message =~ /already exis/
116
+ existingGroup = env[:cloudstack_compute].list_security_groups["listsecuritygroupsresponse"]["securitygroup"].select {|secgrp| secgrp["name"] == sg[:name] }
117
+ sgid = existingGroup[0]["id"]
118
+ env[:ui].info(" -- Security Group #{sg[:name]} found with ID: #{sgid}")
119
+ end
120
+ end
121
+
122
+ # security group is created and we have it's ID
123
+ # so we add the rules... Does it really matter if they already exist ? CLoudstack seems to take care of that!
124
+ sg[:rules].each do |rule|
125
+ case rule[:type]
126
+ when "ingress"
127
+ env[:cloudstack_compute].authorize_security_group_ingress(:securityGroupId => sgid,
128
+ :protocol => rule[:protocol],
129
+ :startport => rule[:startport],
130
+ :endport => rule[:endport],
131
+ :cidrlist => rule[:cidrlist])
132
+ env[:ui].info(" --- Ingress Rule added: #{rule[:protocol]} from #{rule[:startport]} to #{rule[:endport]} (#{rule[:cidrlist]})")
133
+ when "egress"
134
+ env[:cloudstack_compute].authorize_security_group_egress(:securityGroupId => sgid,
135
+ :protocol => rule[:protocol],
136
+ :startport => rule[:startport],
137
+ :endport => rule[:endport],
138
+ :cidrlist => rule[:cidrlist])
139
+ env[:ui].info(" --- Egress Rule added: #{rule[:protocol]} from #{rule[:startport]} to #{rule[:endport]} (#{rule[:cidrlist]})")
140
+ end
141
+ end
142
+
143
+ # We want to use the Security groups we created
144
+ security_group_ids.push(sgid)
145
+
146
+ # and record the security group ids for future deletion (of rules and groups if possible)
147
+ security_groups_file = env[:machine].data_dir.join('security_groups')
148
+ security_groups_file.open('a+') do |f|
149
+ f.write("#{sgid}\n")
150
+ end
151
+ end
152
+ end
60
153
 
61
154
  begin
62
155
  case network_type
63
156
  when "Advanced"
64
157
  options = {
65
158
  :display_name => display_name,
159
+ :group => group,
66
160
  :zone_id => zone_id,
67
161
  :flavor_id => service_offering_id,
68
162
  :image_id => template_id,
@@ -71,9 +165,11 @@ module VagrantPlugins
71
165
  when "Basic"
72
166
  options = {
73
167
  :display_name => display_name,
168
+ :group => group,
74
169
  :zone_id => zone_id,
75
170
  :flavor_id => service_offering_id,
76
- :image_id => template_id
171
+ :image_id => template_id,
172
+ :security_group_ids => security_group_ids
77
173
  }
78
174
  end
79
175
 
@@ -57,10 +57,11 @@ module VagrantPlugins
57
57
  "chown #{ssh_info[:username]} '#{guestpath}'")
58
58
 
59
59
  # Rsync over to the guest path using the SSH info
60
+ private_keys = (ssh_info[:private_key_path].class == Array ? ssh_info[:private_key_path].join(",") : ssh_info[:private_key_path])
60
61
  command = [
61
62
  "rsync", "--verbose", "--archive", "-z",
62
63
  "--exclude", ".vagrant/",
63
- "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i '#{ssh_info[:private_key_path]}'",
64
+ "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i '#{private_keys}'",
64
65
  hostpath,
65
66
  "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
66
67
 
@@ -35,7 +35,51 @@ module VagrantPlugins
35
35
  # Destroy the server and remove the tracking ID
36
36
  server = env[:cloudstack_compute].servers.get(env[:machine].id)
37
37
  env[:ui].info(I18n.t("vagrant_cloudstack.terminating"))
38
- server.destroy
38
+
39
+ job = server.destroy
40
+ while true
41
+ response = env[:cloudstack_compute].query_async_job_result({:jobid => job.id})
42
+ if response["queryasyncjobresultresponse"]["jobstatus"] != 0
43
+ break
44
+ else
45
+ env[:ui].info("Waiting for instance to be deleted")
46
+ sleep 2
47
+ end
48
+ end
49
+
50
+ security_groups_file = env[:machine].data_dir.join("security_groups")
51
+ if security_groups_file.file?
52
+ File.open(security_groups_file, "r").each_line do |line|
53
+ security_group_id = line.strip
54
+ begin
55
+ security_group = env[:cloudstack_compute].security_groups.get(security_group_id)
56
+
57
+ security_group.ingress_rules.each do |ir|
58
+ env[:cloudstack_compute].revoke_security_group_ingress({:id => ir["ruleid"]})
59
+ end
60
+ env[:ui].info("Deleted ingress rules")
61
+
62
+ security_group.egress_rules.each do |er|
63
+ env[:cloudstack_compute].revoke_security_group_egress({:id => er["ruleid"]})
64
+ end
65
+ env[:ui].info("Deleted egress rules")
66
+
67
+ rescue Fog::Compute::Cloudstack::Error => e
68
+ raise Errors::FogError, :message => e.message
69
+ end
70
+
71
+ begin
72
+ env[:cloudstack_compute].delete_security_group({:id => security_group_id})
73
+ rescue Fog::Compute::Cloudstack::Error => e
74
+ env[:ui].warn("Couldn't delete group right now.")
75
+ env[:ui].warn("Waiting 30 seconds to retry")
76
+ sleep 30
77
+ retry
78
+ end
79
+ end
80
+ security_groups_file.delete
81
+ end
82
+
39
83
  env[:machine].id = nil
40
84
 
41
85
  @app.call(env)
@@ -94,6 +94,35 @@ module VagrantPlugins
94
94
  # @return [String]
95
95
  attr_accessor :pf_private_port
96
96
 
97
+ # comma separated list of security groups id that going
98
+ # to be applied to the virtual machine.
99
+ #
100
+ # @return [Array]
101
+ attr_accessor :security_group_ids
102
+
103
+ # comma separated list of security groups name that going
104
+ # to be applied to the virtual machine.
105
+ #
106
+ # @return [Array]
107
+ attr_accessor :security_group_names
108
+
109
+ # comma separated list of security groups
110
+ # (hash with ingress/egress rules)
111
+ # to be applied to the virtual machine.
112
+ #
113
+ # @return [Array]
114
+ attr_accessor :security_groups
115
+
116
+ # display name for the instance
117
+ #
118
+ # @return [String]
119
+ attr_accessor :display_name
120
+
121
+ # group for the instance
122
+ #
123
+ # @return [String]
124
+ attr_accessor :group
125
+
97
126
  def initialize(domain_specific=false)
98
127
  @host = UNSET_VALUE
99
128
  @path = UNSET_VALUE
@@ -113,6 +142,11 @@ module VagrantPlugins
113
142
  @pf_ip_address_id = UNSET_VALUE
114
143
  @pf_public_port = UNSET_VALUE
115
144
  @pf_private_port = UNSET_VALUE
145
+ @security_group_ids = UNSET_VALUE
146
+ @display_name = UNSET_VALUE
147
+ @group = UNSET_VALUE
148
+ @security_group_names = UNSET_VALUE
149
+ @security_groups = UNSET_VALUE
116
150
 
117
151
  # Internal state (prefix with __ so they aren't automatically
118
152
  # merged)
@@ -237,6 +271,21 @@ module VagrantPlugins
237
271
  # Private port must be nil, since we can't default that
238
272
  @pf_private_port = nil if @pf_private_port == UNSET_VALUE
239
273
 
274
+ # Security Group IDs must be nil, since we can't default that
275
+ @security_group_ids = nil if @security_group_ids == UNSET_VALUE
276
+
277
+ # Security Group Names must be nil, since we can't default that
278
+ @security_group_names = nil if @security_group_names == UNSET_VALUE
279
+
280
+ # Security Groups must be nil, since we can't default that
281
+ @security_groups = nil if @security_groups == UNSET_VALUE
282
+
283
+ # Display name must be nil, since we can't default that
284
+ @display_name = nil if @display_name == UNSET_VALUE
285
+
286
+ # Group must be nil, since we can't default that
287
+ @group = nil if @group == UNSET_VALUE
288
+
240
289
  # Compile our domain specific configurations only within
241
290
  # NON-DOMAIN-SPECIFIC configurations.
242
291
  if !@__domain_specific
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Cloudstack
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
data/locales/en.yml CHANGED
@@ -75,6 +75,12 @@ en:
75
75
  not created
76
76
  long_not_created: |-
77
77
  The instance is not created. Run `vagrant up` to create it.
78
+
79
+ short_starting: |-
80
+ starting
81
+ long_starting: |-
82
+ The instance is starting.
83
+
78
84
  short_stopped: |-
79
85
  stopped
80
86
  long_stopped: |-
@@ -32,6 +32,11 @@ describe VagrantPlugins::Cloudstack::Config do
32
32
  its("pf_ip_address_id") { should be_nil }
33
33
  its("pf_public_port") { should be_nil }
34
34
  its("pf_private_port") { should be_nil }
35
+ its("security_group_ids") { should be_nil }
36
+ its("display_name") { should be_nil }
37
+ its("group") { should be_nil }
38
+ its("security_group_names") { should be_nil }
39
+ its("security_groups") { should be_nil }
35
40
  end
36
41
 
37
42
  describe "overriding defaults" do
@@ -83,6 +88,11 @@ describe VagrantPlugins::Cloudstack::Config do
83
88
  let(:config_pf_ip_address_id) { "foo" }
84
89
  let(:config_pf_public_port) { "foo" }
85
90
  let(:config_pf_private_port) { "foo" }
91
+ let(:config_security_group_ids) { ["foo", "bar"] }
92
+ let(:config_display_name) { "foo" }
93
+ let(:config_group) { "foo" }
94
+ let(:config_security_group_names) { ["foo", "bar"] }
95
+ let(:config_security_groups) { [{:foo => "bar"}, {:bar => "foo"}] }
86
96
 
87
97
  def set_test_values(instance)
88
98
  instance.host = config_host
@@ -102,6 +112,11 @@ describe VagrantPlugins::Cloudstack::Config do
102
112
  instance.pf_ip_address_id = config_pf_ip_address_id
103
113
  instance.pf_public_port = config_pf_public_port
104
114
  instance.pf_private_port = config_pf_private_port
115
+ instance.security_group_ids = config_security_group_ids
116
+ instance.display_name = config_display_name
117
+ instance.group = config_group
118
+ instance.security_group_names = config_security_group_names
119
+ instance.security_groups = config_security_groups
105
120
  end
106
121
 
107
122
  it "should raise an exception if not finalized" do
@@ -138,6 +153,11 @@ describe VagrantPlugins::Cloudstack::Config do
138
153
  its("pf_ip_address_id") { should == config_pf_ip_address_id }
139
154
  its("pf_public_port") { should == config_pf_public_port }
140
155
  its("pf_private_port") { should == config_pf_private_port }
156
+ its("security_group_ids") { should == config_security_group_ids }
157
+ its("display_name") { should == config_display_name }
158
+ its("group") { should == config_group }
159
+ its("security_group_names") { should == config_security_group_names }
160
+ its("security_groups") { should == config_security_groups }
141
161
  end
142
162
 
143
163
  context "with a specific config set" do
@@ -173,6 +193,11 @@ describe VagrantPlugins::Cloudstack::Config do
173
193
  its("pf_ip_address_id") { should == config_pf_ip_address_id }
174
194
  its("pf_public_port") { should == config_pf_public_port }
175
195
  its("pf_private_port") { should == config_pf_private_port }
196
+ its("security_group_ids") { should == config_security_group_ids }
197
+ its("display_name") { should == config_display_name }
198
+ its("group") { should == config_group }
199
+ its("security_group_names") { should == config_security_group_names }
200
+ its("security_groups") { should == config_security_groups }
176
201
  end
177
202
 
178
203
  describe "inheritance of parent config" do
@@ -6,8 +6,8 @@ Gem::Specification.new do |s|
6
6
  s.version = VagrantPlugins::Cloudstack::VERSION
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.license = "MIT"
9
- s.authors = ["Mitchell Hashimoto", "Carl Loa Odin", "Tor-Åke Fransson", "Olle Lundberg", "Roeland Kuipers", "u-ichi", "atsaki"]
10
- s.email = "carlodin@gmail.com"
9
+ s.authors = ["Mitchell Hashimoto", "Carl Loa Odin", "Tor-Åke Fransson", "Olle Lundberg", "Roeland Kuipers", "Yuichi Uemura", "Atsushi Sasaki", "Nicolas Brechet", "Peter Jönsson"]
10
+ s.email = "engineering.support@klarna.com"
11
11
  s.homepage = "https://github.com/klarna/vagrant-cloudstack/"
12
12
  s.summary = "Enables Vagrant to manage machines in Cloudstack."
13
13
  s.description = "Enables Vagrant to manage machines in Cloudstack."
@@ -15,12 +15,12 @@ Gem::Specification.new do |s|
15
15
  s.required_rubygems_version = ">= 1.3.6"
16
16
  s.rubyforge_project = "vagrant-cloudstack"
17
17
 
18
- s.add_runtime_dependency "fog", "~> 1.18.0"
18
+ s.add_runtime_dependency "fog", "~> 1.19.0"
19
19
 
20
20
  s.add_development_dependency "rake"
21
- s.add_development_dependency "rspec-core", "~> 2.12.2"
22
- s.add_development_dependency "rspec-expectations", "~> 2.12.1"
23
- s.add_development_dependency "rspec-mocks", "~> 2.12.1"
21
+ s.add_development_dependency "rspec-core", "~> 2.14.7"
22
+ s.add_development_dependency "rspec-expectations", "~> 2.14.4"
23
+ s.add_development_dependency "rspec-mocks", "~> 2.14.4"
24
24
 
25
25
  # The following block of code determines the files that should be included
26
26
  # in the gem. It does this by reading all the files in the directory where
@@ -0,0 +1,42 @@
1
+ %define gemdir /usr/lib/vagrant-cloudstack/gems
2
+ Name: vagrant-cloudstack
3
+ Version: %{gemver}
4
+ Release: 3%{?dist}
5
+ Summary: vagrant cloudstack plugin
6
+
7
+ License: MIT
8
+ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
9
+
10
+ Source0: vagrant-cloudstack-%{version}.tar.gz
11
+ BuildRequires: rubygems
12
+ Requires: vagrant >= 1.2.0 libxml2-devel libxslt-devel libffi-devel ruby-devel
13
+
14
+ %description
15
+ vagrant cloudstack
16
+
17
+
18
+ %prep
19
+ %setup -q
20
+
21
+ %build
22
+ env LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bundle package
23
+ env LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 gem build vagrant-cloudstack.gemspec
24
+
25
+
26
+ %install
27
+ mkdir -p %{buildroot}/%{gemdir}
28
+ cp vagrant-cloudstack-%{version}.gem %{buildroot}/%{gemdir}
29
+ cp vendor/cache/*.gem %{buildroot}/%{gemdir}
30
+
31
+
32
+ %clean
33
+ rm -rf %{buildroot}
34
+
35
+
36
+ %post
37
+ cd %{gemdir}
38
+ gem install --local fog --no-rdoc --no-ri
39
+
40
+ %files
41
+ %defattr(-,root,root,-)
42
+ %{gemdir}
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitchell Hashimoto
@@ -9,12 +9,14 @@ authors:
9
9
  - Tor-Åke Fransson
10
10
  - Olle Lundberg
11
11
  - Roeland Kuipers
12
- - u-ichi
13
- - atsaki
12
+ - Yuichi Uemura
13
+ - Atsushi Sasaki
14
+ - Nicolas Brechet
15
+ - Peter Jönsson
14
16
  autorequire:
15
17
  bindir: bin
16
18
  cert_chain: []
17
- date: 2013-12-03 00:00:00.000000000 Z
19
+ date: 2014-01-08 00:00:00.000000000 Z
18
20
  dependencies:
19
21
  - !ruby/object:Gem::Dependency
20
22
  name: fog
@@ -22,14 +24,14 @@ dependencies:
22
24
  requirements:
23
25
  - - ~>
24
26
  - !ruby/object:Gem::Version
25
- version: 1.18.0
27
+ version: 1.19.0
26
28
  type: :runtime
27
29
  prerelease: false
28
30
  version_requirements: !ruby/object:Gem::Requirement
29
31
  requirements:
30
32
  - - ~>
31
33
  - !ruby/object:Gem::Version
32
- version: 1.18.0
34
+ version: 1.19.0
33
35
  - !ruby/object:Gem::Dependency
34
36
  name: rake
35
37
  requirement: !ruby/object:Gem::Requirement
@@ -50,48 +52,49 @@ dependencies:
50
52
  requirements:
51
53
  - - ~>
52
54
  - !ruby/object:Gem::Version
53
- version: 2.12.2
55
+ version: 2.14.7
54
56
  type: :development
55
57
  prerelease: false
56
58
  version_requirements: !ruby/object:Gem::Requirement
57
59
  requirements:
58
60
  - - ~>
59
61
  - !ruby/object:Gem::Version
60
- version: 2.12.2
62
+ version: 2.14.7
61
63
  - !ruby/object:Gem::Dependency
62
64
  name: rspec-expectations
63
65
  requirement: !ruby/object:Gem::Requirement
64
66
  requirements:
65
67
  - - ~>
66
68
  - !ruby/object:Gem::Version
67
- version: 2.12.1
69
+ version: 2.14.4
68
70
  type: :development
69
71
  prerelease: false
70
72
  version_requirements: !ruby/object:Gem::Requirement
71
73
  requirements:
72
74
  - - ~>
73
75
  - !ruby/object:Gem::Version
74
- version: 2.12.1
76
+ version: 2.14.4
75
77
  - !ruby/object:Gem::Dependency
76
78
  name: rspec-mocks
77
79
  requirement: !ruby/object:Gem::Requirement
78
80
  requirements:
79
81
  - - ~>
80
82
  - !ruby/object:Gem::Version
81
- version: 2.12.1
83
+ version: 2.14.4
82
84
  type: :development
83
85
  prerelease: false
84
86
  version_requirements: !ruby/object:Gem::Requirement
85
87
  requirements:
86
88
  - - ~>
87
89
  - !ruby/object:Gem::Version
88
- version: 2.12.1
90
+ version: 2.14.4
89
91
  description: Enables Vagrant to manage machines in Cloudstack.
90
- email: carlodin@gmail.com
92
+ email: engineering.support@klarna.com
91
93
  executables: []
92
94
  extensions: []
93
95
  extra_rdoc_files: []
94
96
  files:
97
+ - build_rpm.sh
95
98
  - CHANGELOG.md
96
99
  - dummy.box
97
100
  - example_box/metadata.json
@@ -127,7 +130,9 @@ files:
127
130
  - README.md
128
131
  - spec/vagrant-cloudstack/config_spec.rb
129
132
  - vagrant-cloudstack.gemspec
133
+ - vagrant-cloudstack.spec
130
134
  - .gitignore
135
+ - .ruby-version
131
136
  - .travis.yml
132
137
  homepage: https://github.com/klarna/vagrant-cloudstack/
133
138
  licenses: