aviator 0.0.2 → 0.0.3
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.
- data/README.md +9 -1
- data/aviator.gemspec +1 -1
- data/bin/aviator +6 -86
- data/lib/aviator/core/cli/describer.rb +95 -0
- data/lib/aviator/core/cli.rb +1 -0
- data/lib/aviator/core/request.rb +62 -65
- data/lib/aviator/core/service.rb +26 -41
- data/lib/aviator/core/session.rb +7 -0
- data/lib/aviator/core.rb +1 -0
- data/lib/aviator/openstack/compute/v2/public/list_images.rb +51 -42
- data/lib/aviator/openstack/compute/v2/public/list_servers.rb +58 -0
- data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +43 -32
- data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +49 -38
- data/lib/aviator/openstack/identity/v2/public/create_token.rb +53 -47
- data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +36 -26
- data/lib/aviator/version.rb +1 -1
- data/lib/aviator.rb +1 -0
- data/test/aviator/core/cli/describer_test.rb +140 -0
- data/test/aviator/core/request_test.rb +132 -157
- data/test/aviator/core/service_test.rb +49 -26
- data/test/aviator/core/session_test.rb +29 -0
- data/test/aviator/openstack/compute/v2/public/list_images_test.rb +16 -18
- data/test/aviator/openstack/compute/v2/public/list_servers_test.rb +178 -0
- data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +10 -12
- data/test/aviator/openstack/identity/v2/public/create_token_test.rb +12 -14
- data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +1 -1
- data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +1 -1
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +1 -1
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +1 -1
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_if_api_version_is_not_defined_but_can_be_inferred_from_host_uri.yml +1 -1
- data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +1 -1
- data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +1 -1
- data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +1 -1
- data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +1 -1
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +1 -1
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +1 -1
- data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +2 -2
- data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +1 -1
- data/test/cassettes/core/session/i_load/returns_itself.yml +63 -0
- data/test/cassettes/core/session/i_load/updates_the_session_data_of_its_service_objects.yml +123 -0
- data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +1 -1
- data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +1 -1
- data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_http_method_.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +1 -1
- data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_no_parameters_are_provided.yml +101 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_invalid.yml +95 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_valid.yml +109 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_body_.yml +62 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_headers_.yml +62 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_http_method_.yml +62 -0
- data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_url_.yml +62 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +1 -1
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +1 -1
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +1 -1
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +2 -2
- data/test/support/{openstack_request_test_helper.rb → request_helper.rb} +21 -2
- data/test/support/test_base_class.rb +1 -1
- data/test/support/test_reporter.rb +4 -2
- data/test/support/vcr_setup.rb +4 -0
- data/test/test_helper.rb +5 -1
- metadata +38 -10
data/README.md
CHANGED
@@ -25,7 +25,7 @@ Or install it yourself as:
|
|
25
25
|
## Usage
|
26
26
|
|
27
27
|
```ruby
|
28
|
-
require 'aviator'
|
28
|
+
require 'aviator/core'
|
29
29
|
|
30
30
|
# Create a new session. See 'Configuration' below for the config file format.
|
31
31
|
session = Aviator::Session.new(
|
@@ -59,6 +59,14 @@ str = session.dump
|
|
59
59
|
# If you employed any form of encryption on the string, make sure to decrypt it first!
|
60
60
|
session = Aviator::Session.load(str)
|
61
61
|
|
62
|
+
# In some instances, Session::load is inefficient because it creates a new session object
|
63
|
+
# each time. In a web app environment, for instance, having to destroy and recreate the
|
64
|
+
# session object can take its toll on performance. In such a scenario, use Session#load
|
65
|
+
# (instance method, as opposed to class method). This will 'infect' an already existing
|
66
|
+
# session object with the supplied session dump and return itself instead of creating
|
67
|
+
# a brand new session object.
|
68
|
+
session.load(other_session_dump)
|
69
|
+
|
62
70
|
# Depending on how old the loaded session dump is, the auth_info may already be expired.
|
63
71
|
# Check if it's still current by calling Session#validate and reauthenticate as needed.
|
64
72
|
#
|
data/aviator.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency 'faraday', '~> 0.8.0'
|
22
|
-
spec.add_dependency 'activesupport', '
|
22
|
+
spec.add_dependency 'activesupport', '>= 3.2.8'
|
23
23
|
spec.add_dependency 'thor', '~> 0.18.1'
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/bin/aviator
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'bundler/setup'
|
4
3
|
require 'thor'
|
5
|
-
require 'aviator
|
4
|
+
require 'aviator'
|
5
|
+
require 'aviator/core/cli'
|
6
6
|
|
7
7
|
module Aviator
|
8
8
|
module CLI
|
@@ -12,98 +12,18 @@ module CLI
|
|
12
12
|
desc 'describe [PROVIDER] [SERVICE] [API_VERSION ENDPOINT_TYPE REQUEST_NAME]', 'Describes various parts of Aviator.'
|
13
13
|
def describe(provider=nil, service=nil, api_version=nil, endpoint_type=nil, request=nil)
|
14
14
|
if request
|
15
|
-
describe_request
|
15
|
+
puts Aviator::Describer.describe_request(provider, service, api_version, endpoint_type, request)
|
16
16
|
elsif service
|
17
|
-
describe_service
|
17
|
+
puts Aviator::Describer.describe_service(provider, service)
|
18
18
|
elsif provider
|
19
|
-
describe_provider
|
19
|
+
puts Aviator::Describer.describe_provider(provider)
|
20
20
|
else
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
|
29
|
-
def describe_provider(provider)
|
30
|
-
puts "Available services from #{ provider }"
|
31
|
-
|
32
|
-
Dir[Pathname.new(__FILE__).join('..', '..', 'lib', 'aviator', provider, '**')].each do |d|
|
33
|
-
puts " #{ Pathname.new(d).basename }"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def describe_request(provider, service, api_version, endpoint_type, request_name)
|
39
|
-
endpoints = Service.new(provider: provider, service: service).requests[api_version.to_sym]
|
40
|
-
raise "Invalid API version #{ api_version }" unless endpoints
|
41
|
-
|
42
|
-
requests = endpoints[endpoint_type.to_sym]
|
43
|
-
raise "Invalid endpoint type #{ endpoint_type }" unless requests
|
44
|
-
|
45
|
-
request = requests[request_name.to_sym]
|
46
|
-
raise "Could not find request named #{ request_name }. Try a different api version or endpoint" unless request
|
47
|
-
|
48
|
-
puts "Request: #{ request_name }"
|
49
|
-
|
50
|
-
params = []
|
51
|
-
|
52
|
-
request.optional_params.each do |param|
|
53
|
-
params << [param, :optional]
|
54
|
-
end
|
55
|
-
|
56
|
-
request.required_params.each do |param|
|
57
|
-
params << [param, :required]
|
21
|
+
puts Aviator::Describer.describe_aviator
|
58
22
|
end
|
59
|
-
|
60
|
-
params.sort! { |a,b| a[0].to_s <=> b[0].to_s }
|
61
|
-
|
62
|
-
puts "\nParameters:"
|
63
|
-
params.each do |param_desc|
|
64
|
-
puts " (#{ param_desc[1] }) #{ param_desc[0] }"
|
65
|
-
end
|
66
|
-
|
67
|
-
puts "\nSample Code:"
|
68
|
-
print " session.#{ service }_service.request(:#{ request_name }, endpoint_type: '#{ endpoint_type }')"
|
69
|
-
if params
|
70
|
-
puts " do |params|"
|
71
|
-
params.each do |pair|
|
72
|
-
puts " params['#{ pair[0] }'] = val"
|
73
|
-
end
|
74
|
-
puts " end"
|
75
|
-
end
|
76
|
-
|
77
|
-
puts "\nLinks:"
|
78
|
-
request.links.each do |link|
|
79
|
-
puts " #{ link[:rel] }:"
|
80
|
-
puts " #{ link[:href] }\n"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
def describe_service(provider, service)
|
86
|
-
puts "Available requests for #{ provider } #{ service }:"
|
87
|
-
|
88
|
-
Service.new(provider: provider, service: service).requests.each do |api_version, endpoints|
|
89
|
-
endpoints.each do |endpoint_type, requests|
|
90
|
-
requests.each do |request_name, request_obj|
|
91
|
-
puts " #{ api_version} #{ endpoint_type } #{ request_name }"
|
92
|
-
end
|
93
|
-
puts ""
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
def list_providers
|
100
|
-
puts "Available providers:"
|
101
|
-
puts " openstack"
|
102
23
|
end
|
103
24
|
|
104
25
|
end
|
105
26
|
|
106
|
-
|
107
27
|
end
|
108
28
|
end
|
109
29
|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Aviator
|
2
|
+
|
3
|
+
module Describer
|
4
|
+
|
5
|
+
def self.describe_aviator
|
6
|
+
provider_names = Pathname.new(__FILE__)
|
7
|
+
.join('..', '..', '..')
|
8
|
+
.children
|
9
|
+
.select{|c| c.directory? && c.basename.to_s != 'core' }
|
10
|
+
.map{|c| c.basename.to_s }
|
11
|
+
|
12
|
+
str = "Available providers:\n"
|
13
|
+
|
14
|
+
provider_names.each do |provider_name|
|
15
|
+
str << " #{ provider_name }\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
str
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def self.describe_provider(provider_name)
|
23
|
+
service_names = Pathname.new(__FILE__)
|
24
|
+
.join('..', '..', '..', provider_name)
|
25
|
+
.children
|
26
|
+
.select{|c| c.directory? }
|
27
|
+
.map{|c| c.basename.to_s }
|
28
|
+
|
29
|
+
str = "Available services for #{ provider_name }:\n"
|
30
|
+
|
31
|
+
service_names.each do |service_name|
|
32
|
+
str << " #{ service_name }\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
str
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def self.describe_request(provider_name, service_name, api_version, endpoint_type, request_name)
|
40
|
+
service = Aviator::Service.new provider: provider_name, service: service_name
|
41
|
+
request_class = "Aviator::#{ provider_name.camelize }::#{ service_name.camelize }::"\
|
42
|
+
"#{ api_version.camelize }::#{ endpoint_type.camelize }::#{ request_name.camelize }".constantize
|
43
|
+
|
44
|
+
str = "Request: #{ request_name }\n\n"
|
45
|
+
|
46
|
+
str << "Parameters:\n"
|
47
|
+
|
48
|
+
params = request_class.optional_params.map{|p| [p, :optional]} +
|
49
|
+
request_class.required_params.map{|p| [p, :required]}
|
50
|
+
|
51
|
+
params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
|
52
|
+
str << " (#{ param[1].to_s }) #{ param[0] }\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
str << "\nSample Code:\n"
|
56
|
+
|
57
|
+
str << " session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
|
58
|
+
if params
|
59
|
+
str << " do |params|\n"
|
60
|
+
params.each do |pair|
|
61
|
+
str << " params['#{ pair[0] }'] = value\n"
|
62
|
+
end
|
63
|
+
str << " end\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
if request_class.links
|
67
|
+
str << "\nLinks:\n"
|
68
|
+
|
69
|
+
request_class.links.each do |link|
|
70
|
+
str << " #{ link[:rel] }:\n"
|
71
|
+
str << " #{ link[:href] }\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
str
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def self.describe_service(provider_name, service_name)
|
80
|
+
service = Aviator::Service.new(provider: provider_name, service: service_name)
|
81
|
+
klasses = service.request_classes
|
82
|
+
|
83
|
+
str = "Available requests for #{ provider_name } #{ service_name }_service:\n"
|
84
|
+
|
85
|
+
klasses.each do |klass|
|
86
|
+
str << " #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
str
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "aviator/core/cli/describer"
|
data/lib/aviator/core/request.rb
CHANGED
@@ -1,5 +1,40 @@
|
|
1
1
|
module Aviator
|
2
2
|
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def define_request(request_name, &block)
|
6
|
+
class_obj = Class.new(Request, &block)
|
7
|
+
|
8
|
+
set_class_name(
|
9
|
+
Aviator,
|
10
|
+
class_obj,
|
11
|
+
|
12
|
+
class_obj.provider,
|
13
|
+
class_obj.service,
|
14
|
+
class_obj.api_version,
|
15
|
+
class_obj.endpoint_type,
|
16
|
+
request_name
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def set_class_name(base, obj, *hierarchy)
|
24
|
+
const_name = hierarchy.shift.to_s.camelize
|
25
|
+
|
26
|
+
const = if base.const_defined?(const_name)
|
27
|
+
base.const_get(const_name)
|
28
|
+
else
|
29
|
+
base.const_set(const_name, (hierarchy.empty? ? obj : Module.new))
|
30
|
+
end
|
31
|
+
|
32
|
+
hierarchy.empty? ? const : set_class_name(const, obj, *hierarchy)
|
33
|
+
end
|
34
|
+
|
35
|
+
end # class << self
|
36
|
+
|
37
|
+
|
3
38
|
class Request
|
4
39
|
|
5
40
|
class ApiVersionNotDefinedError < StandardError
|
@@ -40,31 +75,16 @@ module Aviator
|
|
40
75
|
end
|
41
76
|
|
42
77
|
|
43
|
-
def api_version
|
44
|
-
self.class.api_version
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
78
|
def body?
|
49
79
|
self.class.body?
|
50
80
|
end
|
51
81
|
|
52
82
|
|
53
|
-
def endpoint_type
|
54
|
-
self.class.endpoint_type
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
83
|
def headers?
|
59
84
|
self.class.headers?
|
60
85
|
end
|
61
86
|
|
62
87
|
|
63
|
-
def http_method
|
64
|
-
self.class.http_method
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
88
|
def links
|
69
89
|
self.class.links
|
70
90
|
end
|
@@ -80,11 +100,6 @@ module Aviator
|
|
80
100
|
end
|
81
101
|
|
82
102
|
|
83
|
-
def querystring?
|
84
|
-
self.class.querystring?
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
103
|
def required_params
|
89
104
|
self.class.required_params
|
90
105
|
end
|
@@ -100,6 +115,11 @@ module Aviator
|
|
100
115
|
end
|
101
116
|
|
102
117
|
|
118
|
+
def querystring?
|
119
|
+
self.class.querystring?
|
120
|
+
end
|
121
|
+
|
122
|
+
|
103
123
|
def url?
|
104
124
|
self.class.url?
|
105
125
|
end
|
@@ -123,22 +143,8 @@ module Aviator
|
|
123
143
|
# within the class and because they don't change between instances anyway.
|
124
144
|
class << self
|
125
145
|
|
126
|
-
def anonymous
|
127
|
-
@anonymous = true
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
146
|
def anonymous?
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
|
-
def api_version(value=nil)
|
137
|
-
if value
|
138
|
-
@api_version = value
|
139
|
-
else
|
140
|
-
@api_version
|
141
|
-
end
|
147
|
+
respond_to?(:anonymous) && anonymous == true
|
142
148
|
end
|
143
149
|
|
144
150
|
|
@@ -147,33 +153,10 @@ module Aviator
|
|
147
153
|
end
|
148
154
|
|
149
155
|
|
150
|
-
def endpoint_type(value=nil)
|
151
|
-
if value
|
152
|
-
@endpoint_type = value
|
153
|
-
else
|
154
|
-
@endpoint_type
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
156
|
def headers?
|
160
157
|
instance_methods.include? :headers
|
161
158
|
end
|
162
|
-
|
163
|
-
|
164
|
-
def http_method(value=nil)
|
165
|
-
if value
|
166
|
-
@http_method = value
|
167
|
-
else
|
168
|
-
@http_method
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
|
173
|
-
def link_to(rel, href)
|
174
|
-
links << { rel: rel, href: href }
|
175
|
-
end
|
176
|
-
|
159
|
+
|
177
160
|
|
178
161
|
def links
|
179
162
|
@links ||= []
|
@@ -199,12 +182,12 @@ module Aviator
|
|
199
182
|
def querystring?
|
200
183
|
instance_methods.include? :querystring
|
201
184
|
end
|
202
|
-
|
185
|
+
|
203
186
|
|
204
187
|
def required_params
|
205
188
|
@required_params ||= []
|
206
189
|
end
|
207
|
-
|
190
|
+
|
208
191
|
|
209
192
|
def url?
|
210
193
|
instance_methods.include? :url
|
@@ -213,13 +196,27 @@ module Aviator
|
|
213
196
|
|
214
197
|
private
|
215
198
|
|
216
|
-
|
217
|
-
|
199
|
+
|
200
|
+
def link(rel, href)
|
201
|
+
links << { rel: rel, href: href }
|
218
202
|
end
|
219
203
|
|
220
204
|
|
221
|
-
def
|
222
|
-
|
205
|
+
def meta(attr_name, attr_value)
|
206
|
+
define_singleton_method(attr_name) do
|
207
|
+
attr_value
|
208
|
+
end
|
209
|
+
|
210
|
+
define_method(attr_name) do
|
211
|
+
self.class.send(attr_name)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
|
216
|
+
def param(param_name, opts={})
|
217
|
+
opts = opts.with_indifferent_access
|
218
|
+
list = (opts[:required] == false ? optional_params : required_params)
|
219
|
+
list << param_name unless optional_params.include?(param_name)
|
223
220
|
end
|
224
221
|
|
225
222
|
end
|
data/lib/aviator/core/service.rb
CHANGED
@@ -45,29 +45,6 @@ module Aviator
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
# Because we define requests in a flattened scope, we want to make sure that when each
|
49
|
-
# request is initialized it doesn't get polluted by instance variables and methods
|
50
|
-
# of the containing class. This builder class makes that happen by being a
|
51
|
-
# scope gate for the file. See Metaprogramming Ruby, specifically on blocks and scope
|
52
|
-
class RequestBuilder
|
53
|
-
|
54
|
-
# This method gets called by the request file eval'd in self.build below
|
55
|
-
def define_request(request_name, &block)
|
56
|
-
klass = Class.new(Aviator::Request, &block)
|
57
|
-
return klass, request_name
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
def self.build(path_to_request_file)
|
62
|
-
clean_room = new
|
63
|
-
clean_room.instance_eval(File.read(path_to_request_file))
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
private_class_method :new
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
48
|
|
72
49
|
attr_accessor :default_session_data
|
73
50
|
|
@@ -108,8 +85,8 @@ module Aviator
|
|
108
85
|
end
|
109
86
|
|
110
87
|
|
111
|
-
def
|
112
|
-
@
|
88
|
+
def request_classes
|
89
|
+
@request_classes
|
113
90
|
end
|
114
91
|
|
115
92
|
|
@@ -134,19 +111,27 @@ module Aviator
|
|
134
111
|
# Candidate for extraction to aviator/openstack
|
135
112
|
def find_request(name, session_data, endpoint_type=nil)
|
136
113
|
endpoint_types = if endpoint_type
|
137
|
-
[endpoint_type.
|
114
|
+
[endpoint_type.to_s.camelize]
|
138
115
|
else
|
139
|
-
[
|
116
|
+
['Public', 'Admin']
|
140
117
|
end
|
141
118
|
|
142
|
-
|
119
|
+
namespace = Aviator.const_get(provider.camelize)
|
120
|
+
.const_get(service.camelize)
|
143
121
|
|
144
|
-
|
122
|
+
version = infer_version(session_data).to_s.camelize
|
123
|
+
|
124
|
+
return nil unless version && namespace.const_defined?(version)
|
125
|
+
|
126
|
+
namespace = namespace.const_get(version)
|
145
127
|
|
146
128
|
endpoint_types.each do |endpoint_type|
|
147
|
-
|
148
|
-
|
149
|
-
|
129
|
+
name = name.to_s.camelize
|
130
|
+
|
131
|
+
next unless namespace.const_defined?(endpoint_type)
|
132
|
+
next unless namespace.const_get(endpoint_type).const_defined?(name)
|
133
|
+
|
134
|
+
return namespace.const_get(endpoint_type).const_get(name)
|
150
135
|
end
|
151
136
|
|
152
137
|
nil
|
@@ -182,14 +167,14 @@ module Aviator
|
|
182
167
|
).expand_path
|
183
168
|
)
|
184
169
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
170
|
+
request_file_paths.each{ |path| require path }
|
171
|
+
|
172
|
+
constant_parts = request_file_paths
|
173
|
+
.map{|rf| rf.to_s.match(/#{provider}\/#{service}\/([\w\/]+)\.rb$/) }
|
174
|
+
.map{|rf| rf[1].split('/').map{|c| c.camelize }.join('::') }
|
175
|
+
|
176
|
+
@request_classes = constant_parts.map do |cp|
|
177
|
+
"Aviator::#{provider.camelize}::#{service.camelize}::#{cp}".constantize
|
193
178
|
end
|
194
179
|
end
|
195
180
|
|
@@ -197,7 +182,7 @@ module Aviator
|
|
197
182
|
def log_file
|
198
183
|
@log_file
|
199
184
|
end
|
200
|
-
|
185
|
+
|
201
186
|
end
|
202
187
|
|
203
188
|
end
|
data/lib/aviator/core/session.rb
CHANGED
@@ -83,6 +83,13 @@ module Aviator
|
|
83
83
|
end
|
84
84
|
|
85
85
|
|
86
|
+
def load(session_dump)
|
87
|
+
initialize_with_dump(session_dump)
|
88
|
+
update_services_session_data
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
|
86
93
|
def method_missing(name, *args, &block)
|
87
94
|
service_name_parts = name.to_s.match(/^(\w+)_service$/)
|
88
95
|
|
data/lib/aviator/core.rb
CHANGED
@@ -1,49 +1,58 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
1
|
+
module Aviator
|
2
|
+
|
3
|
+
define_request :list_images do
|
4
|
+
|
5
|
+
meta :provider, :openstack
|
6
|
+
meta :service, :compute
|
7
|
+
meta :api_version, :v2
|
8
|
+
meta :endpoint_type, :public
|
9
|
+
|
10
|
+
link 'documentation',
|
11
|
+
'http://docs.openstack.org/api/openstack-compute/2/content/List_Images-d1e4435.html'
|
12
|
+
|
13
|
+
param :details, required: false
|
14
|
+
param :server, required: false
|
15
|
+
param :name, required: false
|
16
|
+
param :status, required: false
|
17
|
+
param 'changes-since', required: false
|
18
|
+
param :marker, required: false
|
19
|
+
param :limit, required: false
|
20
|
+
param :type, required: false
|
21
|
+
|
22
|
+
|
23
|
+
def headers
|
24
|
+
h = {}
|
25
|
+
|
26
|
+
unless self.anonymous?
|
27
|
+
h['X-Auth-Token'] = session_data[:access][:token][:id]
|
28
|
+
end
|
29
|
+
|
30
|
+
h
|
31
31
|
end
|
32
|
-
|
33
|
-
str += "?#{ filters.join('&') }" unless filters.empty?
|
34
|
-
|
35
|
-
str
|
36
|
-
end
|
37
32
|
|
38
33
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
def http_method
|
35
|
+
:get
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def url
|
40
|
+
service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' }
|
41
|
+
|
42
|
+
str = "#{ service_spec[:endpoints][0][:publicURL] }/images"
|
43
|
+
str += "/detail" if params[:details]
|
44
|
+
|
45
|
+
filters = []
|
46
|
+
|
47
|
+
(optional_params + required_params - [:details]).each do |param_name|
|
48
|
+
filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
|
49
|
+
end
|
50
|
+
|
51
|
+
str += "?#{ filters.join('&') }" unless filters.empty?
|
52
|
+
|
53
|
+
str
|
44
54
|
end
|
45
55
|
|
46
|
-
h
|
47
56
|
end
|
48
57
|
|
49
|
-
end
|
58
|
+
end
|