vagrant-openstack-provider 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +13 -5
  2. data/.rubocop.yml +28 -0
  3. data/Appraisals +3 -3
  4. data/CHANGELOG.md +4 -0
  5. data/Gemfile +3 -0
  6. data/Rakefile +6 -2
  7. data/Vagrantfile +4 -15
  8. data/gemfiles/latest_stable.gemfile +2 -0
  9. data/gemfiles/oldest_current.gemfile +2 -0
  10. data/gemfiles/previous_release.gemfile +2 -0
  11. data/lib/vagrant-openstack-provider.rb +18 -13
  12. data/lib/vagrant-openstack-provider/action.rb +112 -46
  13. data/lib/vagrant-openstack-provider/action/connect_openstack.rb +9 -10
  14. data/lib/vagrant-openstack-provider/action/create_server.rb +86 -57
  15. data/lib/vagrant-openstack-provider/action/delete_server.rb +5 -6
  16. data/lib/vagrant-openstack-provider/action/{is_created.rb → message.rb} +4 -3
  17. data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +7 -27
  18. data/lib/vagrant-openstack-provider/action/read_state.rb +7 -9
  19. data/lib/vagrant-openstack-provider/action/resume.rb +20 -0
  20. data/lib/vagrant-openstack-provider/action/start_server.rb +22 -0
  21. data/lib/vagrant-openstack-provider/action/stop_server.rb +22 -0
  22. data/lib/vagrant-openstack-provider/action/suspend.rb +20 -0
  23. data/lib/vagrant-openstack-provider/action/sync_folders.rb +27 -38
  24. data/lib/vagrant-openstack-provider/action/wait_stop.rb +29 -0
  25. data/lib/vagrant-openstack-provider/client/keystone.rb +76 -0
  26. data/lib/vagrant-openstack-provider/client/neutron.rb +32 -0
  27. data/lib/vagrant-openstack-provider/client/nova.rb +166 -0
  28. data/lib/vagrant-openstack-provider/client/openstack.rb +41 -0
  29. data/lib/vagrant-openstack-provider/client/utils.rb +38 -0
  30. data/lib/vagrant-openstack-provider/config.rb +38 -110
  31. data/lib/vagrant-openstack-provider/errors.rb +7 -3
  32. data/lib/vagrant-openstack-provider/plugin.rb +8 -8
  33. data/lib/vagrant-openstack-provider/provider.rb +6 -6
  34. data/lib/vagrant-openstack-provider/version.rb +1 -1
  35. data/locales/en.yml +83 -5
  36. data/numergyrc +22 -0
  37. data/spec/vagrant-openstack-provider/action/create_server_spec.rb +89 -0
  38. data/spec/vagrant-openstack-provider/client/keystone_spec.rb +140 -0
  39. data/spec/vagrant-openstack-provider/client/neutron_spec.rb +53 -0
  40. data/spec/vagrant-openstack-provider/client/nova_spec.rb +373 -0
  41. data/spec/vagrant-openstack-provider/client/utils_spec.rb +125 -0
  42. data/spec/vagrant-openstack-provider/config_spec.rb +117 -0
  43. data/spec/vagrant-openstack-provider/provider_spec.rb +13 -0
  44. data/spec/vagrant-openstack-provider/spec_helper.rb +23 -0
  45. data/vagrant-openstack-provider.gemspec +13 -14
  46. metadata +40 -30
  47. data/features/provision.feature +0 -35
  48. data/features/steps/sdk_steps.rb +0 -13
  49. data/features/steps/server_steps.rb +0 -25
  50. data/features/support/env.rb +0 -37
  51. data/features/support/fog_mock.rb +0 -19
  52. data/features/vagrant-openstack-provider.feature +0 -70
  53. data/lib/vagrant-openstack-provider/action/message_already_created.rb +0 -16
  54. data/lib/vagrant-openstack-provider/action/message_not_created.rb +0 -16
  55. data/lib/vagrant-openstack-provider/openstack_client.rb +0 -98
  56. data/spec/vagrant-openstack/config_spec.rb +0 -184
  57. data/stackrc +0 -31
@@ -1,35 +0,0 @@
1
- @announce
2
- @vagrant-openstack-provider
3
- Feature: vagrant-openstack-provider fog tests
4
-
5
- Background:
6
- Given I have Openstack credentials available
7
- And I have a "fog_mock.rb" file
8
-
9
- Scenario: Create a single server (with provisioning)
10
- Given a file named "Vagrantfile" with:
11
- """
12
- Vagrant.configure("2") do |config|
13
- Vagrant.require_plugin "vagrant-openstack-provider"
14
-
15
- config.vm.box = "dummy"
16
- config.ssh.private_key_path = "~/.ssh/id_rsa"
17
-
18
-
19
- config.vm.provider :openstack do |rs|
20
- rs.server_name = 'vagrant-provisioned-server'
21
- rs.username = ENV['RAX_USERNAME']
22
- rs.api_key = ENV['RAX_API_KEY']
23
- rs.openstack_region = ENV['RAX_REGION'].downcase.to_sym
24
- rs.flavor = /1 GB Performance/
25
- rs.image = /Ubuntu/
26
- rs.public_key_path = "~/.ssh/id_rsa.pub"
27
- end
28
-
29
- config.vm.provision :shell, :inline => "echo Hello, World"
30
- end
31
- """
32
- When I successfully run `bundle exec vagrant up --provider openstack`
33
- # I want to capture the ID like I do in tests for other tools, but Vagrant doesn't print it!
34
- # And I get the server from "Instance ID:"
35
- Then the server "vagrant-provisioned-server" should be active
@@ -1,13 +0,0 @@
1
- Given(/^I have Openstack credentials available$/) do
2
- fail unless ENV['RAX_USERNAME'] && ENV['RAX_API_KEY']
3
- end
4
-
5
- Given(/^I have a "fog_mock.rb" file$/) do
6
- script = File.open("features/support/fog_mock.rb").read
7
- steps %Q{
8
- Given a file named "fog_mock.rb" with:
9
- """
10
- #{script}
11
- """
12
- }
13
- end
@@ -1,25 +0,0 @@
1
- When(/^I get the server from "(.*?)"$/) do |label|
2
- @server_id = all_output.match(/#{label}\s([\w-]*)/)[1]
3
- puts "Server: #{@server_id}"
4
- end
5
-
6
- When(/^I load the server$/) do
7
- @server_id = all_output.strip.lines.to_a.last
8
- puts "Server: #{@server_id}"
9
- end
10
-
11
- Then(/^the server should be active$/) do
12
- unless Fog.mock? # unfortunately we can't assert this with Fog.mock!, since mocked objects do not persist from the subprocess
13
- assert_active @server_id
14
- end
15
- end
16
-
17
- Then(/^the server "(.+)" should be active$/) do |server_name|
18
- server = @compute.servers.all.find{|s| s.name == server_name}
19
- assert_active server.id
20
- end
21
-
22
- def assert_active server_id
23
- server = @compute.servers.get server_id
24
- server.state.should == 'ACTIVE'
25
- end
@@ -1,37 +0,0 @@
1
- require 'fog'
2
- require 'aruba/cucumber'
3
-
4
- Fog.mock! if ENV['RAX_MOCK'] == 'true'
5
-
6
- Before do | scenario |
7
- @aruba_timeout_seconds = 600
8
- @scenario = File.basename(scenario.file)
9
- ENV['CASSETTE'] = @scenario
10
-
11
- proxy_options = {
12
- :connection_options => {
13
- :proxy => ENV['https_proxy'],
14
- :ssl_verify_peer => false
15
- }
16
- }
17
-
18
- connect_options = {
19
- :provider => 'openstack',
20
- :openstack_username => ENV['RAX_USERNAME'],
21
- :openstack_api_key => ENV['RAX_API_KEY'],
22
- :version => :v2, # Use Next Gen Cloud Servers
23
- :openstack_region => ENV['RAX_REGION'].downcase.to_sym
24
- }
25
- connect_options.merge!(proxy_options) unless ENV['https_proxy'].nil?
26
- @compute = Fog::Compute.new(connect_options)
27
- end
28
-
29
- Around do | scenario, block |
30
- Bundler.with_clean_env do
31
- block.call
32
- end
33
- end
34
-
35
- After('@creates_server') do
36
- @compute.servers.delete @server_id
37
- end
@@ -1,19 +0,0 @@
1
- require 'fog'
2
- if ENV['RAX_MOCK'] == 'true'
3
- Fog.mock!
4
- Fog::Openstack::MockData.configure do |c|
5
- c[:image_name_generator] = Proc.new { "Ubuntu" }
6
- c[:ipv4_generator] = Proc.new { "10.11.12.2"}
7
- end
8
- connect_options = {
9
- :provider => 'openstack',
10
- :openstack_username => ENV['RAX_USERNAME'],
11
- :openstack_api_key => ENV['RAX_API_KEY'],
12
- :version => :v2, # Use Next Gen Cloud Servers
13
- :openstack_region => :ord #Use Chicago Region
14
- }
15
- connect_options.merge!(proxy_options) unless ENV['https_proxy'].nil?
16
- compute = Fog::Compute.new(connect_options)
17
- # Force creation of Ubuntu image so it will show up in compute.images.list
18
- compute.images.get(0)
19
- end
@@ -1,70 +0,0 @@
1
- @announce
2
- @vagrant-openstack-provider
3
- Feature: vagrant-openstack-provider fog tests
4
- As a Fog developer
5
- I want to smoke (or "fog") test vagrant-openstack-provider.
6
- So I am confident my upstream changes did not create downstream problems.
7
-
8
- Background:
9
- Given I have Openstack credentials available
10
- And I have a "fog_mock.rb" file
11
-
12
- Scenario: Create a single server (region)
13
- Given a file named "Vagrantfile" with:
14
- """
15
- # Testing options
16
- require File.expand_path '../fog_mock', __FILE__
17
-
18
- Vagrant.configure("2") do |config|
19
- # dev/test method of loading plugin, normally would be 'vagrant plugin install vagrant-openstack-provider'
20
- Vagrant.require_plugin "vagrant-openstack-provider"
21
-
22
- config.vm.box = "dummy"
23
- config.ssh.username = "vagrant" if Fog.mock?
24
- config.ssh.private_key_path = "~/.ssh/id_rsa" unless Fog.mock?
25
-
26
- config.vm.provider :openstack do |rs|
27
- rs.server_name = 'vagrant-single-server'
28
- rs.username = ENV['RAX_USERNAME']
29
- rs.api_key = ENV['RAX_API_KEY']
30
- rs.openstack_region = ENV['RAX_REGION'].downcase.to_sym
31
- rs.flavor = /1 GB Performance/
32
- rs.image = /Ubuntu/
33
- rs.public_key_path = "~/.ssh/id_rsa.pub" unless Fog.mock?
34
- end
35
- end
36
- """
37
- When I successfully run `bundle exec vagrant up --provider openstack`
38
- # I want to capture the ID like I do in tests for other tools, but Vagrant doesn't print it!
39
- # And I get the server from "Instance ID:"
40
- Then the server "vagrant-single-server" should be active
41
-
42
- Scenario: Create a single server (openstack_compute_url)
43
- Given a file named "Vagrantfile" with:
44
- """
45
- # Testing options
46
- require File.expand_path '../fog_mock', __FILE__
47
-
48
- Vagrant.configure("2") do |config|
49
- # dev/test method of loading plugin, normally would be 'vagrant plugin install vagrant-openstack-provider'
50
- Vagrant.require_plugin "vagrant-openstack-provider"
51
-
52
- config.vm.box = "dummy"
53
- config.ssh.username = "vagrant" if Fog.mock?
54
- config.ssh.private_key_path = "~/.ssh/id_rsa" unless Fog.mock?
55
-
56
- config.vm.provider :openstack do |rs|
57
- rs.server_name = 'vagrant-single-server'
58
- rs.username = ENV['RAX_USERNAME']
59
- rs.api_key = ENV['RAX_API_KEY']
60
- rs.openstack_compute_url = "https://#{ENV['RAX_REGION'].downcase}.servers.api.openstackcloud.com/v2"
61
- rs.flavor = /1 GB Performance/
62
- rs.image = /Ubuntu/
63
- rs.public_key_path = "~/.ssh/id_rsa.pub" unless Fog.mock?
64
- end
65
- end
66
- """
67
- When I successfully run `bundle exec vagrant up --provider openstack`
68
- # I want to capture the ID like I do in tests for other tools, but Vagrant doesn't print it!
69
- # And I get the server from "Instance ID:"
70
- Then the server "vagrant-single-server" should be active
@@ -1,16 +0,0 @@
1
- module VagrantPlugins
2
- module Openstack
3
- module Action
4
- class MessageAlreadyCreated
5
- def initialize(app, env)
6
- @app = app
7
- end
8
-
9
- def call(env)
10
- env[:ui].info(I18n.t("vagrant_openstack.already_created"))
11
- @app.call(env)
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- module VagrantPlugins
2
- module Openstack
3
- module Action
4
- class MessageNotCreated
5
- def initialize(app, env)
6
- @app = app
7
- end
8
-
9
- def call(env)
10
- env[:ui].info(I18n.t("vagrant_openstack.not_created"))
11
- @app.call(env)
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,98 +0,0 @@
1
- require "log4r"
2
- require "restclient"
3
- require "json"
4
-
5
- module VagrantPlugins
6
- module Openstack
7
- class OpenstackClient
8
-
9
- def initialize()
10
- @logger = Log4r::Logger.new("vagrant_openstack::openstack_client")
11
- @token = nil
12
- end
13
-
14
- def authenticate(env)
15
- @logger.debug("Authenticating on Keystone")
16
- config = env[:machine].provider_config
17
- authentication = RestClient.post(config.openstack_auth_url, {
18
- :auth => {
19
- :tenantName => config.tenant_name,
20
- :passwordCredentials => {
21
- :username => config.username,
22
- :password => config.api_key
23
- }
24
- }
25
- }.to_json,
26
- :content_type => :json,
27
- :accept => :json)
28
-
29
- @token = JSON.parse(authentication)['access']['token']['id']
30
- end
31
-
32
- def get_all_flavors(env)
33
- config = env[:machine].provider_config
34
- flavors_json = RestClient.get(config.openstack_compute_url + "/flavors",
35
- {"X-Auth-Token" => @token, :accept => :json})
36
- return JSON.parse(flavors_json)['flavors'].map { |fl| Item.new(fl['id'], fl['name']) }
37
- end
38
-
39
- def get_all_images(env)
40
- config = env[:machine].provider_config
41
- images_json = RestClient.get(config.openstack_compute_url + "/images",
42
- {"X-Auth-Token" => @token, :accept => :json})
43
- return JSON.parse(images_json)['images'].map { |im| Item.new(im['id'], im['name']) }
44
- end
45
-
46
- def create_server(env, name, image_ref, flavor_ref, keypair)
47
- config = env[:machine].provider_config
48
- server = RestClient.post(config.openstack_compute_url + "/servers", {
49
- :server => {
50
- :name => name,
51
- :imageRef => image_ref,
52
- :flavorRef => flavor_ref,
53
- :key_name => keypair
54
- }
55
- }.to_json,
56
- "X-Auth-Token" => @token,
57
- :accept => :json,
58
- :content_type => :json)
59
- return JSON.parse(server)['server']['id']
60
- end
61
-
62
- def delete_server(env, server_id)
63
- config = env[:machine].provider_config
64
- server = RestClient.delete(config.openstack_compute_url + "/servers/" + server_id,
65
- "X-Auth-Token" => @token,
66
- :accept => :json)
67
- end
68
-
69
- def get_server_details(env, server_id)
70
- config = env[:machine].provider_config
71
- server_details = RestClient.get(config.openstack_compute_url + "/servers/" + server_id,
72
- "X-Auth-Token" => @token,
73
- :accept => :json)
74
- return JSON.parse(server_details)['server']
75
- end
76
-
77
- def add_floating_ip(env, server_id, floating_ip)
78
- config = env[:machine].provider_config
79
- server_details = RestClient.post(config.openstack_compute_url + "/servers/" + server_id + "/action", {
80
- :addFloatingIp => {
81
- :address => floating_ip
82
- }
83
- }.to_json,
84
- "X-Auth-Token" => @token,
85
- :accept => :json,
86
- :content_type => :json)
87
- end
88
- end
89
-
90
- class Item
91
- attr_accessor :id, :name
92
- def initialize(id, name)
93
- @id = id
94
- @name = name
95
- end
96
- end
97
- end
98
- end
@@ -1,184 +0,0 @@
1
- if ENV['COVERAGE'] != 'false'
2
- require 'simplecov'
3
- require 'coveralls'
4
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
- SimpleCov::Formatter::HTMLFormatter,
6
- Coveralls::SimpleCov::Formatter
7
- ]
8
- SimpleCov.start
9
- end
10
-
11
- require "vagrant-openstack-provider/config"
12
- require 'fog'
13
-
14
- describe VagrantPlugins::Openstack::Config do
15
- describe "defaults" do
16
- let(:vagrant_public_key) { Vagrant.source_root.join("keys/vagrant.pub") }
17
-
18
- subject do
19
- super().tap do |o|
20
- o.finalize!
21
- end
22
- end
23
-
24
- its(:api_key) { should be_nil }
25
- its(:openstack_region) { should be_nil }
26
- its(:openstack_compute_url) { should be_nil }
27
- its(:openstack_auth_url) { should be_nil }
28
- its(:flavor) { should eq(/m1.tiny/) }
29
- its(:image) { should eq(/cirros/) }
30
- its(:rackconnect) { should be_nil }
31
- its(:network) { should be_nil }
32
- its(:server_name) { should be_nil }
33
- its(:username) { should be_nil }
34
- its(:disk_config) { should be_nil }
35
- its(:network) { should be_nil }
36
- its(:rsync_includes) { should be_nil }
37
- its(:keypair_name) { should be_nil }
38
- its(:ssh_username) { should be_nil }
39
- end
40
-
41
- describe "overriding defaults" do
42
- [:api_key,
43
- :openstack_region,
44
- :openstack_compute_url,
45
- :openstack_auth_url,
46
- :flavor,
47
- :image,
48
- :rackconnect,
49
- :server_name,
50
- :network,
51
- :disk_config,
52
- :username,
53
- :keypair_name,
54
- :ssh_username].each do |attribute|
55
- it "should not default #{attribute} if overridden" do
56
- subject.send("#{attribute}=".to_sym, "foo")
57
- subject.finalize!
58
- subject.send(attribute).should == "foo"
59
- end
60
- end
61
-
62
- it "should not default rsync_includes if overridden" do
63
- inc = "core"
64
- subject.send(:rsync_include, inc)
65
- subject.finalize!
66
- subject.send(:rsync_includes).should include(inc)
67
- end
68
- end
69
-
70
- describe "validation" do
71
- let(:machine) { double("machine") }
72
- let(:validation_errors) { subject.validate(machine)['Openstack Provider'] }
73
- let(:error_message) { double("error message") }
74
-
75
- before(:each) do
76
- machine.stub_chain(:env, :root_path).and_return '/'
77
- subject.username = 'foo'
78
- subject.api_key = 'bar'
79
- subject.keypair_name = 'keypair'
80
- end
81
-
82
- subject do
83
- super().tap do |o|
84
- o.finalize!
85
- end
86
- end
87
-
88
- context "with invalid key" do
89
- it "should raise an error" do
90
- subject.nonsense1 = true
91
- subject.nonsense2 = false
92
- I18n.should_receive(:t).with('vagrant.config.common.bad_field',
93
- { :fields => 'nonsense1, nonsense2' })
94
- .and_return error_message
95
- validation_errors.first.should == error_message
96
- end
97
- end
98
- context "with good values" do
99
- it "should validate" do
100
- validation_errors.should be_empty
101
- end
102
- end
103
-
104
- context "the keypair name" do
105
- it "should error if not given" do
106
- subject.keypair_name = nil
107
- I18n.should_receive(:t).with('vagrant_openstack.config.keypair_name required').and_return error_message
108
- validation_errors.first.should == error_message
109
- end
110
- end
111
-
112
- context "the API key" do
113
- it "should error if not given" do
114
- subject.api_key = nil
115
- I18n.should_receive(:t).with('vagrant_openstack.config.api_key required').and_return error_message
116
- validation_errors.first.should == error_message
117
- end
118
- end
119
-
120
- context "the username" do
121
- it "should error if not given" do
122
- subject.username = nil
123
- I18n.should_receive(:t).with('vagrant_openstack.config.username required').and_return error_message
124
- validation_errors.first.should == error_message
125
- end
126
- end
127
-
128
- [:openstack_compute_url, :openstack_auth_url].each do |url|
129
- context "the #{url}" do
130
- it "should not validate if the URL is invalid" do
131
- subject.send "#{url}=", 'baz'
132
- I18n.should_receive(:t).with('vagrant_openstack.config.invalid_uri', {:key => url, :uri => 'baz'}).and_return error_message
133
- validation_errors.first.should == error_message
134
- end
135
- end
136
- end
137
- end
138
-
139
- describe "openstack_auth_url" do
140
- it "should return UNSET_VALUE if openstack_auth_url and openstack_region are UNSET" do
141
- subject.openstack_auth_url.should == VagrantPlugins::Openstack::Config::UNSET_VALUE
142
- end
143
- it "should return UNSET_VALUE if openstack_auth_url is UNSET and openstack_region is :ord" do
144
- subject.openstack_region = :ord
145
- subject.openstack_auth_url.should == VagrantPlugins::Openstack::Config::UNSET_VALUE
146
- end
147
- it "should return custom endpoint if supplied and openstack_region is :lon" do
148
- my_endpoint = 'http://custom-endpoint.com'
149
- subject.openstack_region = :lon
150
- subject.openstack_auth_url = my_endpoint
151
- subject.openstack_auth_url.should == my_endpoint
152
- end
153
- it "should return custom endpoint if supplied and openstack_region is UNSET" do
154
- my_endpoint = 'http://custom-endpoint.com'
155
- subject.openstack_auth_url = my_endpoint
156
- subject.openstack_auth_url.should == my_endpoint
157
- end
158
- end
159
-
160
-
161
- describe "lon_region?" do
162
- it "should return false if openstack_region is UNSET_VALUE" do
163
- subject.openstack_region = VagrantPlugins::Openstack::Config::UNSET_VALUE
164
- subject.send(:lon_region?).should be_false
165
- end
166
- it "should return false if openstack_region is nil" do
167
- subject.openstack_region = nil
168
- subject.send(:lon_region?).should be_false
169
- end
170
- it "should return false if openstack_region is :ord" do
171
- subject.openstack_region = :ord
172
- subject.send(:lon_region?).should be_false
173
- end
174
- it "should return true if openstack_region is 'lon'" do
175
- subject.openstack_region = 'lon'
176
- subject.send(:lon_region?).should be_true
177
- end
178
- it "should return true if openstack_Region is :lon" do
179
- subject.openstack_region = :lon
180
- subject.send(:lon_region?).should be_true
181
- end
182
- end
183
-
184
- end