misty 0.9.1 → 0.9.2

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: 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