aviator 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|