misty 0.9.1 → 0.9.2

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: cf1c5c6f54a2f26de7e2a55a2d5f4bd169e68431
4
- data.tar.gz: 1e471a166e49dd7c4d10441593a39976f2662c8f
3
+ metadata.gz: 6a18dd08ce931589520a2cffc3a0680fc43e97d1
4
+ data.tar.gz: cc92b5a1fa75a36b6702094f2fdaf88aa5153879
5
5
  SHA512:
6
- metadata.gz: bbbd202a09f147d4cd8e5a100efc2028b32e76cac9bacd44cc6d0a5a8979b940d2f69000f808e8c4c868d860ef771731b39002f759a167e79c11658fc0f400c6
7
- data.tar.gz: 03aab150f96558bf2a3428a4c31447248cade4790f2462ee1edc28e0b65a12f4dfbc49041b8ce1c992927648b916df50b7dc0782e2b219a2ce80dcf6bbad4bd6
6
+ metadata.gz: b4e83f60c35a1a28fd96a9b3066d90d2fab52b5bad92ececbe35c690add1cc2c07118b5f6c50b789d43a136a28860a7fe1ce4602aabe58095414cd18978465cb
7
+ data.tar.gz: 51295685e0f48004e97216b5423b6f32c8ac2ac3861c226efe4c6af834567b50fafb2dd559493e78cd505da9fcb7da0af49038345e200d7778a1983be7569c76
data/README.md CHANGED
@@ -264,7 +264,7 @@ The following options are applied to each service unless specifically provided f
264
264
  Default: `:ruby`
265
265
 
266
266
  ### Services Options
267
- Each service can get parameters to be specified.
267
+ Each service can have specific parameters.
268
268
 
269
269
  ```ruby
270
270
  openstack = Misty::Cloud.new(:auth => auth, :identity => {}, :compute => {})
@@ -279,7 +279,10 @@ The following options are available:
279
279
  Type: String
280
280
  * :base_url
281
281
  Allows to force the base URL for every requests.
282
- Type: String
282
+ Type: String
283
+ * :headers
284
+ Optional headers
285
+ Type: Hash
283
286
  * :interface
284
287
  Allows to provide an alternate interface. Allowed values are "public", "internal" or "admin"
285
288
  Type: String
@@ -32,11 +32,9 @@ module Misty
32
32
  raise URLError, 'No URL provided' if auth[:url].nil? || auth[:url].empty?
33
33
  @uri = URI.parse(auth[:url])
34
34
  @config = config
35
- # autheticate
36
35
  @credentials = set_credentials(auth)
37
36
  @token, @catalog, @expires = set(authenticate)
38
37
  end
39
- #byebug unless config.is_a?(Misty::Cloud::Config)
40
38
  end
41
39
 
42
40
  def authenticate
@@ -44,10 +42,9 @@ module Misty
44
42
  @uri, ssl_verify_mode: @config.ssl_verify_mode, log: @config.log
45
43
  ) do |connection|
46
44
  response = connection.post(self.class.path, @credentials.to_json,
47
- Misty::HEADER_JSON)
45
+ { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
48
46
  unless response.code =~ /200|201/
49
- raise AuthenticationError,
50
- "Response code=#{response.code}, Msg=#{response.msg}"
47
+ raise AuthenticationError, "Response code=#{response.code}, Msg=#{response.msg}"
51
48
  end
52
49
  response
53
50
  end
@@ -60,18 +57,32 @@ module Misty
60
57
  Time.parse(@expires) < Time.now.utc
61
58
  end
62
59
 
63
- def get_endpoint(service_names, region, interface)
64
- @catalog.each do |catalog|
65
- if service_names.include? catalog['type']
66
- return catalog_endpoints(catalog['endpoints'], region, interface)
67
- end
60
+ def get_url(service_names, region_id, interface)
61
+ find_url(get_service(service_names), region_id, interface)
62
+ end
63
+
64
+ def get_service(service_names)
65
+ @catalog.each do |service|
66
+ return service if service_names.include?(service['type'])
68
67
  end
69
- raise CatalogError, "No service found with either #{service_names} name, region #{region}, interface #{interface}"
68
+ raise CatalogError, "No service '#{service_names}' found."
70
69
  end
71
70
 
72
71
  def get_token
73
72
  @token, @catalog, @expires = set(authenticate) if expired?
74
73
  @token
75
74
  end
75
+
76
+ def find_url(service, region_id, interface)
77
+ if service['endpoints']
78
+ service['endpoints'].each do |endpoint|
79
+ if (url = self.class.get_url(endpoint, region_id, interface))
80
+ return url
81
+ end
82
+ end
83
+ end
84
+ message = "No endpoint found: service '#{service['type']}', region '#{region_id}', interface '#{interface}'"
85
+ raise CatalogError, message
86
+ end
76
87
  end
77
88
  end
@@ -6,12 +6,8 @@ module Misty
6
6
  '/v2.0/tokens'
7
7
  end
8
8
 
9
- def catalog_endpoints(endpoints, region, interface)
10
- endpoints.each do |endpoint|
11
- if endpoint['region'] == region && endpoint["#{interface}URL"]
12
- return endpoint["#{interface}URL"]
13
- end
14
- end
9
+ def self.get_url(endpoint, region_id, interface)
10
+ return endpoint["#{interface}URL"] if endpoint['region'] == region_id && endpoint["#{interface}URL"]
15
11
  end
16
12
 
17
13
  def credentials
@@ -41,12 +37,6 @@ module Misty
41
37
  }
42
38
  end
43
39
 
44
- def get_endpoint_url(endpoints, region, interface)
45
- endpoint = endpoints.select { |ep| !ep[interface].empty? }
46
- raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
47
- endpoint[0][interface]
48
- end
49
-
50
40
  def set(response)
51
41
  payload = JSON.load(response.body)
52
42
  token = payload['access']['token']['id']
@@ -6,12 +6,8 @@ module Misty
6
6
  '/v3/auth/tokens'
7
7
  end
8
8
 
9
- def catalog_endpoints(endpoints, region, interface)
10
- endpoints.each do |endpoint|
11
- if endpoint['region_id'] == region && endpoint['interface'] == interface
12
- return endpoint['url']
13
- end
14
- end
9
+ def self.get_url(endpoint, region_id, interface)
10
+ return endpoint['url'] if endpoint['region_id'] == region_id && endpoint['interface'] == interface
15
11
  end
16
12
 
17
13
  def credentials
@@ -34,12 +30,6 @@ module Misty
34
30
  }
35
31
  end
36
32
 
37
- def get_endpoint_url(endpoints, region, interface)
38
- endpoint = endpoints.select { |ep| ep['region_id'] == region && ep['interface'] == interface }
39
- raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
40
- endpoint[0]['url']
41
- end
42
-
43
33
  def scope
44
34
  return @project.identity if @project
45
35
  return @domain.identity if @domain
@@ -37,22 +37,24 @@ module Misty
37
37
  # :base_path => nil
38
38
  # URL can be forced (Helps when setup is broken)
39
39
  # :base_url => nil
40
+ # Optional headers
41
+ # :headers => {}
40
42
  # Endpoint type (admin, public or internal)
41
- # :interface => "public"
43
+ # :interface => "public"
42
44
  # Region ID
43
45
  # :region_id => "regionOne"
44
46
  # Service name
45
47
  # The Service names are pre defined but more can be added using this option.
46
48
  # :service_name
47
49
  # SSL Verify Mode
48
- # :ssl_verify_mode => true
50
+ # :ssl_verify_mode => true
49
51
  # (micro)version: Can be numbered (3.1) or by state (CURRENT, LATEST or SUPPORTED)
50
52
  # :version => "CURRENT"
51
53
  def initialize(auth, config, options)
52
54
  @auth = auth
53
55
  @config = config
54
56
  @options = setup(options)
55
- @uri = URI.parse(@auth.get_endpoint(@options.service_names, @options.region_id, @options.interface))
57
+ @uri = URI.parse(@auth.get_url(@options.service_names, @options.region_id, @options.interface))
56
58
  @base_path = @options.base_path ? @options.base_path : @uri.path
57
59
  @base_path = @base_path.chomp('/')
58
60
  @version = nil
@@ -70,15 +72,14 @@ module Misty
70
72
  ''
71
73
  end
72
74
 
73
- def headers_default
74
- Misty::HEADER_JSON
75
- end
76
-
77
75
  def headers
78
- h = headers_default.merge('X-Auth-Token' => @auth.get_token.to_s)
79
- h.merge!(microversion_header) if microversion
80
- h.merge!(@options.headers) if @options.headers
81
- h
76
+ header = {}
77
+ header.merge!({'Content-Type' => 'application/json', 'Accept' => 'application/json'})
78
+ header.merge!('X-Auth-Token' => @auth.get_token.to_s)
79
+ header.merge!(@config.headers) if @config.headers
80
+ header.merge!(@options.headers) if @options.headers
81
+ header.merge!(microversion_header) if microversion
82
+ header
82
83
  end
83
84
 
84
85
  private
@@ -95,7 +96,7 @@ module Misty
95
96
  options.region_id = params[:region_id] ? params[:region_id] : @config.region_id
96
97
  options.service_names = params[:service_name] ? self.class.service_names << params[:service_name] : self.class.service_names
97
98
  options.ssl_verify_mode = params[:ssl_verify_mode] ? params[:ssl_verify_mode] : @config.ssl_verify_mode
98
- options.headers = params[:headers] ? params[:headers] : @config.headers
99
+ options.headers = params[:headers] ? params[:headers] : {}
99
100
  options.version = params[:version] ? params[:version] : 'CURRENT'
100
101
 
101
102
  unless INTERFACES.include?(options.interface)
@@ -0,0 +1,63 @@
1
+ module Misty
2
+ module Microversion
3
+ class VersionError < RuntimeError; end
4
+
5
+ VERSION_STATES = %w{CURRENT LATEST SUPPORTED}
6
+
7
+ def initialize(auth, cloud, options)
8
+ super
9
+ @microversion = true
10
+ @version = version_get(@options.version)
11
+ end
12
+
13
+ def microversion_header
14
+ {'X-Openstack-API-Version' => "#{baseclass.downcase} #{@version}" }
15
+ end
16
+
17
+ def version_get(version_option)
18
+ if VERSION_STATES.include?(version_option)
19
+ return version_by_state(version_option)
20
+ else
21
+ return version_by_number(version_option)
22
+ end
23
+ end
24
+
25
+ def versions
26
+ @versions ||= versions_fetch
27
+ end
28
+
29
+ private
30
+
31
+ def version_by_number(number)
32
+ versions.each do |version|
33
+ return number if version['min_version'] <= number && version['version'] >= number
34
+ end
35
+ raise VersionError, "Version #{number} is out of range of available versions #{versions}"
36
+ end
37
+
38
+ def version_by_state(state)
39
+ version_details = nil
40
+ versions.each do |version|
41
+ if version['status'] == state
42
+ version_details = version
43
+ break
44
+ end
45
+ end
46
+ raise VersionError, "Version #{state} is not available among #{versions}" if version_details.nil?
47
+ if version_details['version'].empty?
48
+ @microversion = false
49
+ return ''
50
+ end
51
+ version_details['version']
52
+ end
53
+
54
+ def versions_fetch
55
+ response = http_get('/', {'Accept'=> 'application/json'})
56
+ raise VersionError, "Code: #{response.code}, Message: #{response.msg}" unless response.code =~ /2??/
57
+ data = response.body.is_a?(Hash) ? response.body : JSON.parse(response.body)
58
+ list = data['versions']
59
+ raise VersionError, 'Missing version data' unless list
60
+ list
61
+ end
62
+ end
63
+ end
@@ -5,11 +5,11 @@ module Misty
5
5
  { name: :application_catalog, project: :murano, versions: ['v1']},
6
6
  { name: :alarming, project: :aodh, versions: ['v2']},
7
7
  { name: :backup, project: :freezer, versions: ['v1']},
8
- { name: :baremetal, project: :ironic, versions: nil, microversion: 'v1'},
9
- { name: :block_storage, project: :cinder, versions: ['v2', 'v1'], microversion: 'v3'},
8
+ { name: :baremetal, project: :ironic, microversion: 'v1'},
9
+ { name: :block_storage, project: :cinder, microversion: 'v3', versions: ['v2', 'v1']},
10
10
  { name: :clustering, project: :senlin, versions: ['v1']},
11
- { name: :compute, project: :nova, versions: nil, microversion: 'v2.1'},
12
- { name: :container_infrastructure_management, project: :magnum, versions: nil, microversion: 'v1'},
11
+ { name: :compute, project: :nova, microversion: 'v2.1'},
12
+ { name: :container_infrastructure_management, project: :magnum, microversion: 'v1'},
13
13
  { name: :data_processing, project: :sahara, versions: ['v1.1']},
14
14
  { name: :data_protection_orchestration, project: :karbor, versions: ['v1']},
15
15
  { name: :database, project: :trove, versions: ['v1.0']},
@@ -24,14 +24,9 @@ module Misty
24
24
  { name: :object_storage, project: :swift, versions: ['v1']},
25
25
  { name: :orchestration, project: :heat, versions: ['v1']},
26
26
  { name: :search, project: :searchlight, versions: ['v1']},
27
- { name: :shared_file_systems, project: :manila, versions: nil, microversion: 'v2'}
27
+ { name: :shared_file_systems, project: :manila, microversion: 'v2'}
28
28
  ]
29
29
 
30
- HEADER_JSON = {
31
- 'Content-Type' => 'application/json',
32
- 'Accept' => 'application/json'
33
- }
34
-
35
30
  # Default REST content type. Use :json or :ruby
36
31
  CONTENT_TYPE = :ruby
37
32
 
@@ -1,4 +1,5 @@
1
1
  require 'misty/http/client'
2
+ require 'misty/microversion'
2
3
  require 'misty/openstack/cinder/cinder_v3'
3
4
 
4
5
  module Misty
@@ -6,6 +7,7 @@ module Misty
6
7
  module Cinder
7
8
  class V3 < Misty::HTTP::Client
8
9
  extend Misty::Openstack::CinderV3
10
+ include Misty::Microversion
9
11
 
10
12
  def self.api
11
13
  v3
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require 'misty/openstack/microversion'
2
+ require 'misty/microversion'
3
3
  require 'misty/openstack/ironic/ironic_v1'
4
4
 
5
5
  module Misty
@@ -7,7 +7,7 @@ module Misty
7
7
  module Ironic
8
8
  class V1 < Misty::HTTP::Client
9
9
  extend Misty::Openstack::IronicV1
10
- include Misty::HTTP::Microversion
10
+ include Misty::Microversion
11
11
 
12
12
  def self.api
13
13
  v1
@@ -16,10 +16,6 @@ module Misty
16
16
  def self.service_names
17
17
  %w{baremetal}
18
18
  end
19
-
20
- def microversion_header
21
- { 'X-Openstack-Ironic-API-Version' => "#{@version}" }
22
- end
23
19
  end
24
20
  end
25
21
  end
@@ -16,10 +16,6 @@ module Misty
16
16
  def self.service_names
17
17
  %w{container}
18
18
  end
19
-
20
- def microversion_header
21
- {'X-Openstack-API-Version' => "#{baseclass.downcase} #{@version}" }
22
- end
23
19
  end
24
20
  end
25
21
  end
@@ -1,13 +1,13 @@
1
1
  require 'misty/http/client'
2
- require 'misty/openstack/microversion'
2
+ require 'misty/microversion'
3
3
  require 'misty/openstack/manila/manila_v2'
4
4
 
5
5
  module Misty
6
6
  module Openstack
7
7
  module Manila
8
- class V2 < Misty::HTTP::Client
9
- extend Misty::Openstack::ManilaV2
10
- include Misty::HTTP::Microversion
8
+ class V2 < Misty::HTTP::Client
9
+ extend Misty::Openstack::ManilaV2
10
+ include Misty::Microversion
11
11
 
12
12
  def self.api
13
13
  v2
@@ -16,10 +16,6 @@ module Misty
16
16
  def self.service_names
17
17
  %w{shared-file-systems shared}
18
18
  end
19
-
20
- def microversion_header
21
- { 'X-Openstack-Manila-API-Version' => "#{@version}" }
22
- end
23
19
  end
24
20
  end
25
21
  end
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require 'misty/openstack/microversion'
2
+ require 'misty/microversion'
3
3
  require 'misty/openstack/nova/nova_v2_1'
4
4
 
5
5
  module Misty
@@ -7,7 +7,7 @@ module Misty
7
7
  module Nova
8
8
  class V2_1 < Misty::HTTP::Client
9
9
  extend Misty::Openstack::NovaV2_1
10
- include Misty::HTTP::Microversion
10
+ include Misty::Microversion
11
11
 
12
12
  def self.api
13
13
  v2_1
@@ -27,12 +27,11 @@ module Misty
27
27
  end
28
28
 
29
29
  def microversion_header
30
- {
31
- # Remove once depcrecated
32
- 'X-Openstack-Nova-API-Version' => "#{@version}",
33
- # From version 2.27 the OpenStack-API-Version is used
34
- 'X-Openstack-API-Version' => "#{baseclass.downcase} #{@version}"
35
- }
30
+ # Versions 2.27+ use default OpenStack-API-Version
31
+ header = super
32
+ # For prior vesions then remove once depcrecated
33
+ header.merge!('X-Openstack-Nova-API-Version' => "#{@version}",)
34
+ header
36
35
  end
37
36
  end
38
37
  end
@@ -11,6 +11,10 @@ module Misty
11
11
  v1
12
12
  end
13
13
 
14
+ def self.prefix_path_to_ignore
15
+ '/v1/{account}'
16
+ end
17
+
14
18
  def self.service_names
15
19
  %w{object-storage object-store}
16
20
  end
@@ -10,10 +10,10 @@ module Misty
10
10
  end
11
11
 
12
12
  def to_s
13
- res = "#{name}: #{project}"
14
- res << ", versions: #{@versions}" if @versions
15
- res << ", microversion: #{@microversion}" if @microversion
16
- res
13
+ str = "#{name}: #{project}"
14
+ str << ", versions: #{@versions}" if @versions
15
+ str << ", microversion: #{@microversion}" if @microversion
16
+ str
17
17
  end
18
18
 
19
19
  def version(api_version = nil)
@@ -23,18 +23,11 @@ module Misty
23
23
  default_version
24
24
  end
25
25
 
26
+ private
27
+
26
28
  def default_version
27
29
  return @microversion if @microversion
28
30
  return self.versions.sort[-1]
29
31
  end
30
-
31
- def version=(val)
32
- if @versions.include?(val)
33
- @version = val
34
- else
35
- # Use highest version
36
- @version = versions.sort[-1]
37
- end
38
- end
39
32
  end
40
33
  end
@@ -1,3 +1,3 @@
1
1
  module Misty
2
- VERSION = '0.9.1'
2
+ VERSION = '0.9.2'
3
3
  end
@@ -1,3 +1,5 @@
1
+ $VERBOSE = nil
2
+
1
3
  require 'misty'
2
4
  require 'minitest/autorun'
3
5
  require 'vcr'
@@ -177,12 +177,12 @@ describe Misty::Auth do
177
177
  auth.catalog.must_equal ['catalog_data']
178
178
  end
179
179
 
180
- it '#get_endpoint' do
180
+ it '#get_url' do
181
181
  stub_request(:post, 'http://localhost:5000/v3/auth/tokens').
182
182
  to_return(:status => 200, :body => JSON.dump(auth_response_v3("identity", "keystone")), :headers => {'x-subject-token'=>'token_data'})
183
183
 
184
184
  auth = Misty::AuthV3.new(authv3_creds, config)
185
- auth.get_endpoint(%w{identity}, 'regionOne', 'public').must_equal 'http://localhost'
185
+ auth.get_url(%w{identity}, 'regionOne', 'public').must_equal 'http://localhost'
186
186
  end
187
187
  end
188
188
  end
@@ -289,12 +289,12 @@ describe Misty::Auth do
289
289
  auth.catalog.must_equal ['catalog_data']
290
290
  end
291
291
 
292
- it '#get_endpoint' do
292
+ it '#get_url' do
293
293
  stub_request(:post, 'http://localhost:5000/v2.0/tokens').
294
294
  to_return(:status => 200, :body => JSON.dump(auth_response_v2('identity', 'keystone')), :headers => {'x-subject-token'=>'token_data'})
295
295
 
296
296
  auth = Misty::AuthV2.new(authv2_creds, config)
297
- auth.get_endpoint(%w{identity}, 'regionOne', 'public').must_equal 'http://localhost'
297
+ auth.get_url(%w{identity}, 'regionOne', 'public').must_equal 'http://localhost'
298
298
  end
299
299
  end
300
300
  end
@@ -33,7 +33,6 @@ describe 'Misty::Cloud' do
33
33
  let(:auth_headers) do
34
34
  { 'Accept' => 'application/json',
35
35
  'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
36
- 'Content-Type' => 'application/json',
37
36
  'User-Agent' => 'Ruby' }
38
37
  end
39
38
 
@@ -94,6 +93,10 @@ describe 'Misty::Cloud' do
94
93
  with(:body => JSON.dump(auth_body), :headers => auth_headers).
95
94
  to_return(:status => 200, :body => JSON.dump(auth_response_v3('volume', 'cinder')), :headers => token_header)
96
95
 
96
+ stub_request(:get, 'http://localhost/').
97
+ with(:headers => auth_headers).
98
+ to_return(:status => 200, :body => JSON.dump(versions), :headers => {})
99
+
97
100
  cloud.block_storage.must_be_kind_of Misty::Openstack::Cinder::V3
98
101
  end
99
102
 
@@ -21,12 +21,6 @@ describe Misty::HTTP::Client do
21
21
  end
22
22
  end
23
23
 
24
- describe '#headers_default' do
25
- it 'returns hash' do
26
- service.headers_default.must_be_kind_of Hash
27
- end
28
- end
29
-
30
24
  describe '#headers' do
31
25
  it 'returns hash' do
32
26
  service.headers.must_be_kind_of Hash
@@ -1,9 +1,9 @@
1
1
  require 'test_helper'
2
2
  require 'auth_helper'
3
3
  require 'misty/http/client'
4
- require 'misty/openstack/microversion'
4
+ require 'misty/microversion'
5
5
 
6
- describe Misty::HTTP::Microversion do
6
+ describe Misty::Microversion do
7
7
  let(:versions_data) do
8
8
  { 'versions' =>
9
9
  [{ 'status' => 'SUPPORTED',
@@ -23,7 +23,7 @@ describe Misty::HTTP::Microversion do
23
23
  let(:microversion_service) do
24
24
  auth = Minitest::Mock.new
25
25
 
26
- def auth.get_endpoint(*args)
26
+ def auth.get_url(*args)
27
27
  'http://localhost'
28
28
  end
29
29
 
@@ -39,7 +39,7 @@ describe Misty::HTTP::Microversion do
39
39
  setup.ssl_verify_mode = Misty::SSL_VERIFY_MODE
40
40
 
41
41
  stub_request(:get, 'http://localhost/').
42
- with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json'}).
42
+ with(:headers => {'Accept'=>'application/json'}).
43
43
  to_return(:status => 200, :body => JSON.dump(versions_data), :headers => {})
44
44
 
45
45
  Misty::Openstack::Nova::V2_1.new(auth, setup, {})
@@ -57,19 +57,19 @@ describe Misty::HTTP::Microversion do
57
57
  it 'fails when version is not within supporterd interval' do
58
58
  proc do
59
59
  microversion_service.version_get('2.0')
60
- end.must_raise Misty::HTTP::Microversion::VersionError
60
+ end.must_raise Misty::Microversion::VersionError
61
61
  end
62
62
 
63
63
  it 'fails when LATEST version is not available' do
64
64
  proc do
65
65
  microversion_service.version_get('LATEST')
66
- end.must_raise Misty::HTTP::Microversion::VersionError
66
+ end.must_raise Misty::Microversion::VersionError
67
67
  end
68
68
 
69
69
  it 'fails when using an invalid version State' do
70
70
  proc do
71
71
  microversion_service.version_get('OTHER')
72
- end.must_raise Misty::HTTP::Microversion::VersionError
72
+ end.must_raise Misty::Microversion::VersionError
73
73
  end
74
74
  end
75
75
  end
@@ -1,13 +1,13 @@
1
1
  require 'misty/http/client'
2
2
 
3
3
  def request_header
4
- {'Accept'=>'application/json', 'Content-Type'=>'application/json'}
4
+ {'Accept' => 'application/json'}
5
5
  end
6
6
 
7
7
  def service(content_type = :ruby)
8
8
  auth = Minitest::Mock.new
9
9
 
10
- def auth.get_endpoint(*args)
10
+ def auth.get_url(*args)
11
11
  'http://localhost'
12
12
  end
13
13
 
@@ -1,3 +1,5 @@
1
+ $VERBOSE = nil
2
+
1
3
  require 'minitest/autorun'
2
4
  require 'webmock/minitest'
3
5
  require 'misty'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: misty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gilles Dubreuil
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-08 00:00:00.000000000 Z
11
+ date: 2017-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -138,6 +138,7 @@ files:
138
138
  - lib/misty/http/method_builder.rb
139
139
  - lib/misty/http/net_http.rb
140
140
  - lib/misty/http/request.rb
141
+ - lib/misty/microversion.rb
141
142
  - lib/misty/misty.rb
142
143
  - lib/misty/openstack/aodh/aodh_v2.rb
143
144
  - lib/misty/openstack/aodh/v2.rb
@@ -173,7 +174,6 @@ files:
173
174
  - lib/misty/openstack/magnum/v1.rb
174
175
  - lib/misty/openstack/manila/manila_v2.rb
175
176
  - lib/misty/openstack/manila/v2.rb
176
- - lib/misty/openstack/microversion.rb
177
177
  - lib/misty/openstack/murano/murano_v1.rb
178
178
  - lib/misty/openstack/murano/v1.rb
179
179
  - lib/misty/openstack/neutron/neutron_v2_0.rb
@@ -216,9 +216,9 @@ files:
216
216
  - test/unit/http/direct_test.rb
217
217
  - test/unit/http/method_builder_test.rb
218
218
  - test/unit/http/request_test.rb
219
+ - test/unit/microversion_test.rb
219
220
  - test/unit/misty_test.rb
220
221
  - test/unit/openstack/APIs_test.rb
221
- - test/unit/openstack/microversion_test.rb
222
222
  - test/unit/service_helper.rb
223
223
  - test/unit/services_test.rb
224
224
  - test/unit/test_helper.rb
@@ -235,7 +235,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
235
  requirements:
236
236
  - - ">="
237
237
  - !ruby/object:Gem::Version
238
- version: '0'
238
+ version: '2.3'
239
239
  required_rubygems_version: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - ">="
@@ -243,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
243
  version: '0'
244
244
  requirements: []
245
245
  rubyforge_project:
246
- rubygems_version: 2.6.11
246
+ rubygems_version: 2.6.13
247
247
  signing_key:
248
248
  specification_version: 4
249
249
  summary: Misty is an OpenStack API client
@@ -1,62 +0,0 @@
1
- module Misty
2
- # TODO: move to Openstack module
3
- module HTTP
4
- module Microversion
5
- class VersionError < RuntimeError; end
6
-
7
- VERSION_STATES = %w{CURRENT LATEST SUPPORTED}
8
-
9
- def initialize(auth, cloud, options)
10
- super
11
- @microversion = true
12
- @version = version_get(@options.version)
13
- end
14
-
15
- def version_get(version_option)
16
- if VERSION_STATES.include?(version_option)
17
- return version_by_state(version_option)
18
- else
19
- return version_by_number(version_option)
20
- end
21
- end
22
-
23
- def versions
24
- @versions ||= versions_fetch
25
- end
26
-
27
- private
28
-
29
- def version_by_number(number)
30
- versions.each do |version|
31
- return number if version['min_version'] <= number && version['version'] >= number
32
- end
33
- raise VersionError, "Version #{number} is out of range of available versions #{versions}"
34
- end
35
-
36
- def version_by_state(state)
37
- version_details = nil
38
- versions.each do |version|
39
- if version['status'] == state
40
- version_details = version
41
- break
42
- end
43
- end
44
- raise VersionError, "Version #{state} is not available among #{versions}" if version_details.nil?
45
- if version_details['version'].empty?
46
- @microversion = false
47
- return ''
48
- end
49
- version_details['version']
50
- end
51
-
52
- def versions_fetch
53
- response = http_get('/', headers_default)
54
- raise VersionError, "Code: #{response.code}, Message: #{response.msg}" unless response.code =~ /2??/
55
- data = response.body.is_a?(Hash) ? response.body : JSON.parse(response.body)
56
- list = data['versions']
57
- raise VersionError, 'Missing version data' unless list
58
- list
59
- end
60
- end
61
- end
62
- end