misty 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -23
  3. data/lib/misty/auth.rb +24 -19
  4. data/lib/misty/auth/auth_v2.rb +12 -12
  5. data/lib/misty/auth/auth_v3.rb +15 -15
  6. data/lib/misty/autoload.rb +27 -27
  7. data/lib/misty/cloud.rb +2 -1
  8. data/lib/misty/http/client.rb +17 -15
  9. data/lib/misty/http/method_builder.rb +1 -1
  10. data/lib/misty/http/net_http.rb +12 -7
  11. data/lib/misty/http/request.rb +13 -7
  12. data/lib/misty/misty.rb +30 -30
  13. data/lib/misty/openstack/aodh/v2.rb +1 -1
  14. data/lib/misty/openstack/ceilometer/v2.rb +1 -1
  15. data/lib/misty/openstack/cinder/v1.rb +2 -2
  16. data/lib/misty/openstack/cinder/v2.rb +2 -2
  17. data/lib/misty/openstack/cinder/v3.rb +2 -2
  18. data/lib/misty/openstack/designate/v2.rb +1 -1
  19. data/lib/misty/openstack/freezer/v1.rb +1 -1
  20. data/lib/misty/openstack/glance/v1.rb +1 -1
  21. data/lib/misty/openstack/glance/v2.rb +1 -1
  22. data/lib/misty/openstack/heat/v1.rb +2 -2
  23. data/lib/misty/openstack/ironic/v1.rb +2 -2
  24. data/lib/misty/openstack/karbor/v1.rb +1 -1
  25. data/lib/misty/openstack/keystone/v2_0.rb +2 -2
  26. data/lib/misty/openstack/keystone/v3.rb +2 -2
  27. data/lib/misty/openstack/magnum/v1.rb +2 -2
  28. data/lib/misty/openstack/manila/v2.rb +2 -2
  29. data/lib/misty/openstack/microversion.rb +9 -9
  30. data/lib/misty/openstack/murano/v1.rb +1 -1
  31. data/lib/misty/openstack/neutron/v2_0.rb +1 -1
  32. data/lib/misty/openstack/nova/v2_1.rb +4 -4
  33. data/lib/misty/openstack/octavia/v2_0.rb +1 -1
  34. data/lib/misty/openstack/sahara/v1_1.rb +1 -1
  35. data/lib/misty/openstack/searchlight/v1.rb +1 -1
  36. data/lib/misty/openstack/senlin/v1.rb +1 -1
  37. data/lib/misty/openstack/swift/v1.rb +1 -1
  38. data/lib/misty/openstack/tacker/v1_0.rb +1 -1
  39. data/lib/misty/openstack/trove/v1_0.rb +1 -1
  40. data/lib/misty/openstack/zaqar/v2.rb +1 -1
  41. data/lib/misty/services.rb +1 -1
  42. data/lib/misty/version.rb +1 -1
  43. data/test/integration/compute_test.rb +17 -17
  44. data/test/integration/network_test.rb +16 -16
  45. data/test/integration/orchestration_test.rb +51 -51
  46. data/test/integration/test_helper.rb +7 -7
  47. data/test/unit/auth/name_test.rb +53 -53
  48. data/test/unit/auth_test.rb +151 -152
  49. data/test/unit/cloud/requests_test.rb +58 -58
  50. data/test/unit/cloud/services_test.rb +62 -62
  51. data/test/unit/cloud_test.rb +48 -48
  52. data/test/unit/http/client_test.rb +21 -28
  53. data/test/unit/http/direct_test.rb +31 -31
  54. data/test/unit/http/method_builder_test.rb +42 -42
  55. data/test/unit/http/request_test.rb +33 -33
  56. data/test/unit/misty_test.rb +28 -28
  57. data/test/unit/openstack/APIs_test.rb +3 -3
  58. data/test/unit/openstack/microversion_test.rb +14 -14
  59. data/test/unit/service_helper.rb +4 -4
  60. data/test/unit/services_test.rb +5 -5
  61. data/test/unit/test_helper.rb +1 -1
  62. metadata +4 -4
@@ -7,7 +7,8 @@ module Misty
7
7
  module HTTP
8
8
  class Client
9
9
  class Options
10
- attr_accessor :base_path, :base_url, :interface, :region_id, :service_names, :ssl_verify_mode, :version
10
+ attr_accessor :base_path, :base_url, :interface, :region_id,
11
+ :service_names, :ssl_verify_mode, :version, :headers
11
12
  end
12
13
 
13
14
  class InvalidDataError < StandardError; end
@@ -53,8 +54,7 @@ module Misty
53
54
  @options = setup(options)
54
55
  @uri = URI.parse(@auth.get_endpoint(@options.service_names, @options.region_id, @options.interface))
55
56
  @base_path = @options.base_path ? @options.base_path : @uri.path
56
- @base_path = @base_path.chomp("/")
57
- @http = Misty::HTTP::NetHTTP.net_http(@uri, @options.ssl_verify_mode, @config.log)
57
+ @base_path = @base_path.chomp('/')
58
58
  @version = nil
59
59
  @microversion = false
60
60
  end
@@ -63,11 +63,11 @@ module Misty
63
63
  # When a catalog provides a base path and the Service API definition containts the generic equivalent as prefix
64
64
  # then the preifx is redundant and must be removed from the path.
65
65
  # For example:
66
- # Catalog provides "http://192.0.2.21:8004/v1/48985e6b8da145699d411f12a3459fca"
67
- # and Service API has "/v1/{tenant_id}/stacks"
68
- # then the path prefix is ignored and path is only "/stacks"
66
+ # Catalog provides 'http://192.0.2.21:8004/v1/48985e6b8da145699d411f12a3459fca'
67
+ # and Service API has '/v1/{tenant_id}/stacks'
68
+ # then the path prefix is ignored and path is only '/stacks'
69
69
  def self.prefix_path_to_ignore
70
- ""
70
+ ''
71
71
  end
72
72
 
73
73
  def headers_default
@@ -75,8 +75,9 @@ module Misty
75
75
  end
76
76
 
77
77
  def headers
78
- h = headers_default.merge("X-Auth-Token" => "#{@auth.get_token}")
78
+ h = headers_default.merge('X-Auth-Token' => @auth.get_token.to_s)
79
79
  h.merge!(microversion_header) if microversion
80
+ h.merge!(@options.headers) if @options.headers
80
81
  h
81
82
  end
82
83
 
@@ -88,13 +89,14 @@ module Misty
88
89
 
89
90
  def setup(params)
90
91
  options = Options.new()
91
- options.base_path = params[:base_path] ? params[:base_path] : nil
92
- options.base_url = params[:base_url] ? params[:base_url] : nil
93
- options.interface = params[:interface] ? params[:interface] : @config.interface
94
- options.region_id = params[:region_id] ? params[:region_id] : @config.region_id
95
- options.service_names = params[:service_name] ? self.class.service_names << params[:service_name] : self.class.service_names
96
- options.ssl_verify_mode = params[:ssl_verify_mode] ? params[:ssl_verify_mode] : @config.ssl_verify_mode
97
- options.version = params[:version] ? params[:version] : "CURRENT"
92
+ options.base_path = params[:base_path] ? params[:base_path] : nil
93
+ options.base_url = params[:base_url] ? params[:base_url] : nil
94
+ options.interface = params[:interface] ? params[:interface] : @config.interface
95
+ options.region_id = params[:region_id] ? params[:region_id] : @config.region_id
96
+ options.service_names = params[:service_name] ? self.class.service_names << params[:service_name] : self.class.service_names
97
+ 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.version = params[:version] ? params[:version] : 'CURRENT'
98
100
 
99
101
  unless INTERFACES.include?(options.interface)
100
102
  raise InvalidDataError, "Options ':interface' must be one of #{INTERFACES}"
@@ -69,7 +69,7 @@ module Misty
69
69
  subpath = /(.*)(\{.*\})(.*)/.match(str)
70
70
  return str unless subpath
71
71
  arg = args.pop
72
- raise ArgumentError, "Not enough arguments" unless arg
72
+ raise ArgumentError, 'Not enough arguments' unless arg
73
73
  return inject_elements(subpath[1], args) + arg + subpath[3]
74
74
  end
75
75
 
@@ -1,14 +1,19 @@
1
1
  module Misty
2
2
  module HTTP
3
+ # This class implements the http request routine.
3
4
  module NetHTTP
4
- def self.net_http(endpoint, ssl_verify_mode, log)
5
- http = Net::HTTP.new(endpoint.host, endpoint.port)
6
- http.set_debug_output(log) if log.level == Logger::DEBUG
7
- if endpoint.scheme == "https"
8
- http.use_ssl = true
9
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless ssl_verify_mode
5
+ def self.http_request(uri, options = {})
6
+ http_options = {}
7
+ if uri.scheme == 'https'
8
+ http_options[:use_ssl] = true
9
+ if options[:ssl_verify_mode] && options[:ssl_verify_mode] == false
10
+ http_options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE
11
+ end
12
+ end
13
+
14
+ Net::HTTP.start(uri.host, uri.port, http_options) do |connection|
15
+ yield(connection)
10
16
  end
11
- http
12
17
  end
13
18
  end
14
19
  end
@@ -2,17 +2,23 @@ module Misty
2
2
  module HTTP
3
3
  module Request
4
4
  def decode?(response)
5
- if @config.content_type != :json && response.code =~ /2??/ && !response.is_a?(Net::HTTPNoContent) \
6
- && !response.is_a?(Net::HTTPResetContent) && response.header["content-type"] \
7
- && response.header["content-type"].include?("application/json")
8
- true
5
+ return false if response.body.nil? || response.body.empty?
6
+ if @config.content_type != :json && response.code =~ /2??/ && !response.is_a?(Net::HTTPNoContent) \
7
+ && !response.is_a?(Net::HTTPResetContent) && response.header['content-type'] \
8
+ && response.header['content-type'].include?('application/json')
9
+ return true
9
10
  end
11
+ false
10
12
  end
11
13
 
12
14
  def http(request)
13
- response = @http.request(request)
14
- response.body = JSON.load(response.body) if decode?(response)
15
- response
15
+ Misty::HTTP::NetHTTP.http_request(
16
+ @uri, ssl_verify_mode: @options.ssl_verify_mode, log: @config.log
17
+ ) do |connection|
18
+ response = connection.request(request)
19
+ response.body = JSON.parse(response.body) if decode?(response)
20
+ response
21
+ end
16
22
  end
17
23
 
18
24
  def http_delete(path, headers)
@@ -2,12 +2,12 @@ require 'misty/services'
2
2
 
3
3
  module Misty
4
4
  HEADER_JSON = {
5
- "Content-Type" => "application/json",
6
- "Accept" => "application/json"
5
+ 'Content-Type' => 'application/json',
6
+ 'Accept' => 'application/json'
7
7
  }
8
8
 
9
9
  # Default log file. Use :log_file option to override
10
- LOG_FILE = "misty.log"
10
+ LOG_FILE = 'misty.log'
11
11
  # Default log level. Use :log_level option to override
12
12
  LOG_LEVEL = Logger::INFO
13
13
 
@@ -17,42 +17,42 @@ module Misty
17
17
  CONTENT_TYPE = :ruby
18
18
 
19
19
  # Defaults Domain ID
20
- DOMAIN_ID = "default"
20
+ DOMAIN_ID = 'default'
21
21
 
22
22
  # Default Interface
23
- INTERFACE = "public"
23
+ INTERFACE = 'public'
24
24
 
25
25
  # Default Region ID
26
- REGION_ID = "regionOne"
26
+ REGION_ID = 'regionOne'
27
27
 
28
- # Default mode when SSL is used (uri.scheme == "https")
28
+ # Default mode when SSL is used (uri.scheme == 'https')
29
29
  SSL_VERIFY_MODE = true
30
30
 
31
31
  def self.services
32
32
  services = Misty::Services.new
33
- services.add(:application_catalog, :murano, ["v1"])
34
- services.add(:alarming, :aodh, ["v2"])
35
- services.add(:backup, :freezer, ["v1"])
36
- services.add(:baremetal, :ironic, ["v1"])
37
- services.add(:block_storage, :cinder, ["v3", "v2", "v1"])
38
- services.add(:clustering, :senlin, ["v1"])
39
- services.add(:compute, :nova, ["v2.1"])
40
- services.add(:container, :magnum, ["v1"])
41
- services.add(:data_processing, :sahara, ["v1.1"])
42
- services.add(:data_protection, :karbor, ["v1"])
43
- services.add(:database, :trove, ["v1.0"])
44
- services.add(:dns, :designate, ["v2"])
45
- services.add(:identity, :keystone, ["v3", "v2.0"])
46
- services.add(:image, :glance, ["v2", "v1"])
47
- services.add(:load_balancer, :octavia, ["v2.0"])
48
- services.add(:messaging, :zaqar, ["v2"])
49
- services.add(:metering, :ceilometer, ["v2"])
50
- services.add(:networking, :neutron, ["v2.0"])
51
- services.add(:nfv_orchestration, :tacker, ["v1.0"])
52
- services.add(:object_storage, :swift, ["v1"])
53
- services.add(:orchestration, :heat, ["v1"])
54
- services.add(:search, :searchlight, ["v1"])
55
- services.add(:shared_file_systems, :manila, ["v2"])
33
+ services.add(:application_catalog, :murano, ['v1'])
34
+ services.add(:alarming, :aodh, ['v2'])
35
+ services.add(:backup, :freezer, ['v1'])
36
+ services.add(:baremetal, :ironic, ['v1'])
37
+ services.add(:block_storage, :cinder, ['v3', 'v2', 'v1'])
38
+ services.add(:clustering, :senlin, ['v1'])
39
+ services.add(:compute, :nova, ['v2.1'])
40
+ services.add(:container, :magnum, ['v1'])
41
+ services.add(:data_processing, :sahara, ['v1.1'])
42
+ services.add(:data_protection, :karbor, ['v1'])
43
+ services.add(:database, :trove, ['v1.0'])
44
+ services.add(:dns, :designate, ['v2'])
45
+ services.add(:identity, :keystone, ['v3', 'v2.0'])
46
+ services.add(:image, :glance, ['v2', 'v1'])
47
+ services.add(:load_balancer, :octavia, ['v2.0'])
48
+ services.add(:messaging, :zaqar, ['v2'])
49
+ services.add(:metering, :ceilometer, ['v2'])
50
+ services.add(:networking, :neutron, ['v2.0'])
51
+ services.add(:nfv_orchestration, :tacker, ['v1.0'])
52
+ services.add(:object_storage, :swift, ['v1'])
53
+ services.add(:orchestration, :heat, ['v1'])
54
+ services.add(:search, :searchlight, ['v1'])
55
+ services.add(:shared_file_systems, :manila, ['v2'])
56
56
  services
57
57
  end
58
58
 
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/aodh/aodh_v2"
2
+ require 'misty/openstack/aodh/aodh_v2'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/ceilometer/ceilometer_v2"
2
+ require 'misty/openstack/ceilometer/ceilometer_v2'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/cinder/cinder_v1"
2
+ require 'misty/openstack/cinder/cinder_v1'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -12,7 +12,7 @@ module Misty
12
12
  end
13
13
 
14
14
  def self.prefix_path_to_ignore
15
- "/v1/{admin_tenant_id}/"
15
+ '/v1/{admin_tenant_id}/'
16
16
  end
17
17
 
18
18
  def self.service_names
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/cinder/cinder_v2"
2
+ require 'misty/openstack/cinder/cinder_v2'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -12,7 +12,7 @@ module Misty
12
12
  end
13
13
 
14
14
  def self.prefix_path_to_ignore
15
- "/v2/{tenant_id}"
15
+ '/v2/{tenant_id}'
16
16
  end
17
17
 
18
18
  def self.service_names
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/cinder/cinder_v3"
2
+ require 'misty/openstack/cinder/cinder_v3'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -12,7 +12,7 @@ module Misty
12
12
  end
13
13
 
14
14
  def self.prefix_path_to_ignore
15
- "/v3/{tenant_id}"
15
+ '/v3/{tenant_id}'
16
16
  end
17
17
 
18
18
  def self.service_names
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/designate/designate_v2"
2
+ require 'misty/openstack/designate/designate_v2'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/freezer/freezer_v1"
2
+ require 'misty/openstack/freezer/freezer_v1'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/glance/glance_v1"
2
+ require 'misty/openstack/glance/glance_v1'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/glance/glance_v2"
2
+ require 'misty/openstack/glance/glance_v2'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/heat/heat_v1"
2
+ require 'misty/openstack/heat/heat_v1'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -12,7 +12,7 @@ module Misty
12
12
  end
13
13
 
14
14
  def self.prefix_path_to_ignore
15
- "/v1/{tenant_id}"
15
+ '/v1/{tenant_id}'
16
16
  end
17
17
 
18
18
  def self.service_names
@@ -1,6 +1,6 @@
1
1
  require 'misty/http/client'
2
2
  require 'misty/openstack/microversion'
3
- require "misty/openstack/ironic/ironic_v1"
3
+ require 'misty/openstack/ironic/ironic_v1'
4
4
 
5
5
  module Misty
6
6
  module Openstack
@@ -18,7 +18,7 @@ module Misty
18
18
  end
19
19
 
20
20
  def microversion_header
21
- { "X-Openstack-Ironic-API-Version" => "#{@version}" }
21
+ { 'X-Openstack-Ironic-API-Version' => "#{@version}" }
22
22
  end
23
23
  end
24
24
  end
@@ -1,5 +1,5 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/karbor/karbor_v1"
2
+ require 'misty/openstack/karbor/karbor_v1'
3
3
 
4
4
  module Misty
5
5
  module Openstack
@@ -1,6 +1,6 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/keystone/keystone_v2_0"
3
- require "misty/openstack/keystone/keystone_v2_0_ext"
2
+ require 'misty/openstack/keystone/keystone_v2_0'
3
+ require 'misty/openstack/keystone/keystone_v2_0_ext'
4
4
 
5
5
  module Misty
6
6
  module Openstack
@@ -1,6 +1,6 @@
1
1
  require 'misty/http/client'
2
- require "misty/openstack/keystone/keystone_v3"
3
- require "misty/openstack/keystone/keystone_v3_ext"
2
+ require 'misty/openstack/keystone/keystone_v3'
3
+ require 'misty/openstack/keystone/keystone_v3_ext'
4
4
 
5
5
  module Misty
6
6
  module Openstack
@@ -1,6 +1,6 @@
1
1
  require 'misty/http/client'
2
2
  require 'misty/openstack/microversion'
3
- require "misty/openstack/magnum/magnum_v1"
3
+ require 'misty/openstack/magnum/magnum_v1'
4
4
 
5
5
  module Misty
6
6
  module Openstack
@@ -18,7 +18,7 @@ module Misty
18
18
  end
19
19
 
20
20
  def microversion_header
21
- { "X-Openstack-API-Version" => "#{baseclass.downcase} #{@version}" }
21
+ {'X-Openstack-API-Version' => "#{baseclass.downcase} #{@version}" }
22
22
  end
23
23
  end
24
24
  end
@@ -1,6 +1,6 @@
1
1
  require 'misty/http/client'
2
2
  require 'misty/openstack/microversion'
3
- require "misty/openstack/manila/manila_v2"
3
+ require 'misty/openstack/manila/manila_v2'
4
4
 
5
5
  module Misty
6
6
  module Openstack
@@ -18,7 +18,7 @@ module Misty
18
18
  end
19
19
 
20
20
  def microversion_header
21
- { "X-Openstack-Manila-API-Version" => "#{@version}" }
21
+ { 'X-Openstack-Manila-API-Version' => "#{@version}" }
22
22
  end
23
23
  end
24
24
  end
@@ -28,7 +28,7 @@ module Misty
28
28
 
29
29
  def version_by_number(number)
30
30
  versions.each do |version|
31
- return number if version["min_version"] <= number && version["version"] >= number
31
+ return number if version['min_version'] <= number && version['version'] >= number
32
32
  end
33
33
  raise VersionError, "Version #{number} is out of range of available versions #{versions}"
34
34
  end
@@ -36,25 +36,25 @@ module Misty
36
36
  def version_by_state(state)
37
37
  version_details = nil
38
38
  versions.each do |version|
39
- if version["status"] == state
39
+ if version['status'] == state
40
40
  version_details = version
41
41
  break
42
42
  end
43
43
  end
44
44
  raise VersionError, "Version #{state} is not available among #{versions}" if version_details.nil?
45
- if version_details["version"].empty?
45
+ if version_details['version'].empty?
46
46
  @microversion = false
47
- return ""
47
+ return ''
48
48
  end
49
- version_details["version"]
49
+ version_details['version']
50
50
  end
51
51
 
52
52
  def versions_fetch
53
- request = Net::HTTP::Get.new("/", headers_default)
54
- response = @http.request request
53
+ response = http_get('/', headers_default)
55
54
  raise VersionError, "Code: #{response.code}, Message: #{response.msg}" unless response.code =~ /2??/
56
- list = JSON.load(response.body)["versions"]
57
- raise VersionError, "Missing version data" unless list
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
58
  list
59
59
  end
60
60
  end