vagrant-cloudstack 0.1.0 → 0.2.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: 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: