misty 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +222 -1
- data/lib/misty.rb +8 -0
- data/lib/misty/auth.rb +60 -0
- data/lib/misty/auth/auth_v2.rb +46 -0
- data/lib/misty/auth/auth_v3.rb +58 -0
- data/lib/misty/autoload.rb +82 -0
- data/lib/misty/cloud.rb +133 -0
- data/lib/misty/http/client.rb +115 -0
- data/lib/misty/http/direct.rb +26 -0
- data/lib/misty/http/method_builder.rb +96 -0
- data/lib/misty/http/request.rb +75 -0
- data/lib/misty/misty.rb +51 -0
- data/lib/misty/openstack/aodh/aodh_v2.rb +12 -0
- data/lib/misty/openstack/aodh/v2.rb +20 -0
- data/lib/misty/openstack/ceilometer/ceilometer_v2.rb +13 -0
- data/lib/misty/openstack/ceilometer/v2.rb +20 -0
- data/lib/misty/openstack/cinder/cinder_v1.rb +35 -0
- data/lib/misty/openstack/cinder/cinder_v3.rb +148 -0
- data/lib/misty/openstack/cinder/v1.rb +24 -0
- data/lib/misty/openstack/cinder/v3.rb +24 -0
- data/lib/misty/openstack/designate/designate_v2.rb +69 -0
- data/lib/misty/openstack/designate/v2.rb +20 -0
- data/lib/misty/openstack/glance/glance_v1.rb +16 -0
- data/lib/misty/openstack/glance/glance_v2.rb +29 -0
- data/lib/misty/openstack/glance/v1.rb +20 -0
- data/lib/misty/openstack/glance/v2.rb +20 -0
- data/lib/misty/openstack/heat/heat_v1.rb +85 -0
- data/lib/misty/openstack/heat/v1.rb +24 -0
- data/lib/misty/openstack/ironic/ironic_v1.rb +71 -0
- data/lib/misty/openstack/ironic/v1.rb +26 -0
- data/lib/misty/openstack/karbor/karbor_v1.rb +32 -0
- data/lib/misty/openstack/karbor/v1.rb +20 -0
- data/lib/misty/openstack/keystone/keystone_v2_0.rb +11 -0
- data/lib/misty/openstack/keystone/keystone_v2_0_ext.rb +32 -0
- data/lib/misty/openstack/keystone/keystone_v3.rb +147 -0
- data/lib/misty/openstack/keystone/keystone_v3_ext.rb +124 -0
- data/lib/misty/openstack/keystone/v2_0.rb +23 -0
- data/lib/misty/openstack/keystone/v3.rb +23 -0
- data/lib/misty/openstack/magnum/magnum_v1.rb +41 -0
- data/lib/misty/openstack/magnum/v1.rb +26 -0
- data/lib/misty/openstack/manila/manila_v2.rb +143 -0
- data/lib/misty/openstack/manila/v2.rb +26 -0
- data/lib/misty/openstack/microversion.rb +62 -0
- data/lib/misty/openstack/neutron/neutron_v2_0.rb +205 -0
- data/lib/misty/openstack/neutron/v2_0.rb +20 -0
- data/lib/misty/openstack/nova/nova_v2_1.rb +269 -0
- data/lib/misty/openstack/nova/v2_1.rb +40 -0
- data/lib/misty/openstack/sahara/sahara_v1_1.rb +77 -0
- data/lib/misty/openstack/sahara/v1_1.rb +20 -0
- data/lib/misty/openstack/searchlight/searchlight_v1.rb +15 -0
- data/lib/misty/openstack/searchlight/v1.rb +20 -0
- data/lib/misty/openstack/senlin/senlin_v1.rb +66 -0
- data/lib/misty/openstack/senlin/v1.rb +20 -0
- data/lib/misty/openstack/swift/swift_v1.rb +23 -0
- data/lib/misty/openstack/swift/v1.rb +20 -0
- data/lib/misty/openstack/trove/trove_v1_0.rb +51 -0
- data/lib/misty/openstack/trove/v1_0.rb +20 -0
- data/lib/misty/openstack/zaqar/v2.rb +20 -0
- data/lib/misty/openstack/zaqar/zaqar_v2.rb +46 -0
- data/lib/misty/version.rb +2 -2
- data/test/integration/compute_test.rb +35 -0
- data/test/integration/network_test.rb +34 -0
- data/test/integration/orchestration_test.rb +92 -0
- data/test/integration/test_helper.rb +19 -0
- data/test/integration/vcr/compute_using_nova_v2_1.yml +1107 -0
- data/test/integration/vcr/network_using_neutron_v2_0.yml +1029 -0
- data/test/integration/vcr/orchestration_using_heat_v1.yml +1457 -0
- data/test/unit/auth_helper.rb +52 -0
- data/test/unit/auth_test.rb +99 -0
- data/test/unit/cloud/requests_test.rb +113 -0
- data/test/unit/cloud/services_test.rb +171 -0
- data/test/unit/cloud_test.rb +145 -0
- data/test/unit/http/client_test.rb +74 -0
- data/test/unit/http/direct_test.rb +103 -0
- data/test/unit/http/method_builder_test.rb +133 -0
- data/test/unit/http/request_test.rb +123 -0
- data/test/unit/misty_test.rb +36 -0
- data/test/unit/openstack/APIs_test.rb +40 -0
- data/test/unit/openstack/microversion_test.rb +70 -0
- data/test/unit/service_helper.rb +25 -0
- data/test/unit/test_helper.rb +8 -0
- metadata +170 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad9014122c54bf48aae6d26bfc8056ba3eca7e40
|
4
|
+
data.tar.gz: f0e8ad48f12c7011f84f83b460bef8651fdc0eb7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f59bba8de14cd8657b22db9eff2b63e9ee08abe4f65fba9b8e15015547a5e4d3d3032143389b44cd6c029eb3911a2a9b66056f77445b1860674456d2a72c9c2
|
7
|
+
data.tar.gz: 024efa940ad8cb5ec44ed28effd7fc7a399225a3a7fa592341def537d64492ac24911d480bc3e3351bd389a4ac19a75ae8a71b898e6a00edfdb24a5d9b04849d
|
data/README.md
CHANGED
@@ -1 +1,222 @@
|
|
1
|
-
#
|
1
|
+
# Introduction
|
2
|
+
Misty is a HTTP client for OpenStack APIs, aiming to be fast and to provide a flexible and at same time exhaustive
|
3
|
+
APIs experience.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
* Exhaustive and latest Openstack APIs
|
7
|
+
* Multiple Service versions
|
8
|
+
* Microversions
|
9
|
+
* Based upon Net/HTTP
|
10
|
+
* Minimalistic gem dependencies - Only json is required
|
11
|
+
* Dynamic services by autoloading only required service's version
|
12
|
+
* Token automatically refreshed when expired
|
13
|
+
* Raw JSON or Ruby format for queries and responses
|
14
|
+
* Persistent HTTP connections (default since HTTP 1.1 anyway) but for the authentication bootstrapping
|
15
|
+
* Direct HTTP Methods for custom needs
|
16
|
+
|
17
|
+
## A solid KISS
|
18
|
+
For REST transactions, Misty uses only Net/HTTP from the Ruby Standard Library. So besides 'json', no other gem are
|
19
|
+
required.
|
20
|
+
Because OpenStack authentication and Service Catalog management are very specific and shared by all the APIs, once taken
|
21
|
+
care of, there is no need for a complex HTTP framework.
|
22
|
+
This offers a solid foundation with reduced dependencies.
|
23
|
+
|
24
|
+
## APIs Definitions
|
25
|
+
The rich variety of OpenStack projects requires lots of Application Program Interfaces to handle.
|
26
|
+
Maintaining and extending those APIs is a structural complexity challenge.
|
27
|
+
Therefore the more automated the process, the better.
|
28
|
+
Thanks to the help of Phoenix project, the OpenStack API-ref [1] provides standardization of the OpenStack APIs.
|
29
|
+
The APIs can be processed almost automatically from the API-ref reference manuals (misty-builder).
|
30
|
+
This allows:
|
31
|
+
* More consistent APIs using automated control
|
32
|
+
* More recent APIs definitions
|
33
|
+
* Easier to add APIs
|
34
|
+
|
35
|
+
[1] https://developer.openstack.org/api-guide/quick-start/
|
36
|
+
|
37
|
+
# Install & Use
|
38
|
+
|
39
|
+
## Fetch and install
|
40
|
+
``` ruby
|
41
|
+
gem install misty
|
42
|
+
```
|
43
|
+
|
44
|
+
## Quick start
|
45
|
+
```ruby
|
46
|
+
require 'misty'
|
47
|
+
|
48
|
+
auth_v3 = {
|
49
|
+
:url => "http://localhost:5000",
|
50
|
+
:user => "admin",
|
51
|
+
:password => "secret",
|
52
|
+
:project => "admin",
|
53
|
+
:domain => "default"
|
54
|
+
}
|
55
|
+
|
56
|
+
openstack = Misty::Cloud.new(:auth => auth_v3)
|
57
|
+
|
58
|
+
puts openstack.compute.list_servers.body
|
59
|
+
puts openstack.compute.list_flavors.body
|
60
|
+
networks = openstack.network.list_networks
|
61
|
+
network_id = networks.body["networks"][0]['id']
|
62
|
+
network = openstack.network.show_network_details(network_id)
|
63
|
+
puts network.body
|
64
|
+
```
|
65
|
+
|
66
|
+
## Services
|
67
|
+
Once the Misty::Cloud object is created, the Openstack services can be used.
|
68
|
+
|
69
|
+
The Cloud object authenticates against the identity server (bootstrap process) and obtains the service catalog.
|
70
|
+
When an OpenStack API service is used, its endpoint is determined from the catalog and the service is dynamically called
|
71
|
+
by Misty so only the services used are loaded.
|
72
|
+
|
73
|
+
The service generic name, such as `compute`, is used to submit requests with an OpenStack service API.
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
openstack = Misty::Cloud.new(:auth => { ... })
|
77
|
+
openstack.compute.list_servers
|
78
|
+
openstack.network.list_networks
|
79
|
+
openstack.network.create_network("network": {"name": "my-network"})
|
80
|
+
```
|
81
|
+
|
82
|
+
To obtain the list of supported services:
|
83
|
+
```ruby
|
84
|
+
require 'misty'
|
85
|
+
puts Misty.services
|
86
|
+
```
|
87
|
+
|
88
|
+
Which produces the equivalent of the following:
|
89
|
+
|
90
|
+
name | project | versions
|
91
|
+
--- | --- | ---
|
92
|
+
alarming | aodh | ["v2"]
|
93
|
+
baremetal | ironic | ["v1"]
|
94
|
+
block_storage | cinder | ["v3", "v1"]
|
95
|
+
clustering | senlin | ["v1"]
|
96
|
+
compute | nova | ["v2.1"]
|
97
|
+
container | magnum | ["v1"]
|
98
|
+
data_processing | sahara | ["v1.1"]
|
99
|
+
data_protection | karbor | ["v1"]
|
100
|
+
database | trove | ["v1.0"]
|
101
|
+
dns | designate | ["v2"]
|
102
|
+
identity | keystone | ["v3", "v2.0"]
|
103
|
+
image | glance | ["v2", "v1"]
|
104
|
+
messaging | zaqar | ["v2"]
|
105
|
+
metering | ceilometer | ["v2"]
|
106
|
+
network | neutron | ["v2.0"]
|
107
|
+
object_storage | swift | ["v1"]
|
108
|
+
orchestration | heat | ["v1"]
|
109
|
+
search | searchlight | ["v1"]
|
110
|
+
shared_file_systems | manila | ["v2"]
|
111
|
+
|
112
|
+
* Notes
|
113
|
+
When an Openstack service requires a different service name, the :service_names option can be used (see below).
|
114
|
+
|
115
|
+
The #requests method provides the available requests for a service, for example:
|
116
|
+
```ruby
|
117
|
+
openstack.compute.requests
|
118
|
+
```
|
119
|
+
|
120
|
+
## Setup
|
121
|
+
|
122
|
+
### Authentication
|
123
|
+
The URL and credentials details are necessary to authenticate with the identity server (Keystone).
|
124
|
+
|
125
|
+
To provide a Keystone V3, which is the default recommended version:
|
126
|
+
```ruby
|
127
|
+
auth = {
|
128
|
+
:url => "http://localhost:5000",
|
129
|
+
:user => "admin",
|
130
|
+
:password => "secret",
|
131
|
+
:project => "admin",
|
132
|
+
:domain => "default"
|
133
|
+
}
|
134
|
+
}
|
135
|
+
```
|
136
|
+
Alternatively, for Keystone V2, just provide the tenant details, Misty will detect it's using Keystone V2:
|
137
|
+
```ruby
|
138
|
+
auth = {
|
139
|
+
:url => "http://localhost:5000",
|
140
|
+
:user => "admin",
|
141
|
+
:password => "secret",
|
142
|
+
:tenant => "admin",
|
143
|
+
}
|
144
|
+
```
|
145
|
+
|
146
|
+
### Global options
|
147
|
+
Besides the authentication details, the following options which apply for the whole cloud
|
148
|
+
|
149
|
+
* :content_type
|
150
|
+
Format of the body of the successful HTTP responses to be JSON or Ruby structures.
|
151
|
+
Value is symbol. Allowed value is `:json`.
|
152
|
+
By default response body are converted to Ruby structures.
|
153
|
+
* :log_file
|
154
|
+
File name and path for log file.
|
155
|
+
Value is file path or IO object - Default is `./misty.log`.
|
156
|
+
For example: use STDOUT for terminal output or alternatively use '/dev/null' to avoid the logs entirely.
|
157
|
+
* :log_level
|
158
|
+
Value is Fixnum - Default is 1 (Logger::INFO) - See Logger from Ruby standard Library
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
openstack = Misty::Cloud.new(:auth => auth, :content_type => :ruby, :log_file => STDOUT)
|
162
|
+
```
|
163
|
+
|
164
|
+
### Services Options
|
165
|
+
Each service can get options specifically:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
openstack = Misty::Cloud.new(:auth => auth, :identity => {}, :compute => {})
|
169
|
+
```
|
170
|
+
|
171
|
+
The following options are available:
|
172
|
+
* :api_version
|
173
|
+
The latest supported version is used by default. See Misty.services to use another version.
|
174
|
+
Value is a STRING
|
175
|
+
* :base_path
|
176
|
+
Allows to force the base path for every URL requests.
|
177
|
+
Value is a STRING
|
178
|
+
* :base_url
|
179
|
+
Allows to force the base URL for every requests.
|
180
|
+
Value is a STRING
|
181
|
+
* :interface
|
182
|
+
Allows to provide an alternate interface. Allowed values are "public", "internal" or "admin"
|
183
|
+
Value is a STRING - Default = "public"
|
184
|
+
* :region_id
|
185
|
+
Value is a STRING
|
186
|
+
Default "regionOne"
|
187
|
+
* :service_names
|
188
|
+
Value is a STRING - Default is defined by Misty.services
|
189
|
+
Allows to use a difference name for the service. For instance "identity3" for the identity service.
|
190
|
+
* :ssl_verify_mode
|
191
|
+
Used in SSL mode (detected from the URI)
|
192
|
+
Value is a BOOLEAN - Default is `true`
|
193
|
+
* :version
|
194
|
+
Version to be used when microversion is supported by the service.
|
195
|
+
Value is a STRING - Default is `"CURRENT"`
|
196
|
+
Allowed values are "CURRENT", "LATEST", "SUPPORTED", or a version number such as "2.0" or "3"
|
197
|
+
|
198
|
+
Example:
|
199
|
+
```ruby
|
200
|
+
openstack = Misty::Cloud.new(:auth => auth, :log_level => 0, :identity => {:region_id => "regionTwo"}, :compute => {:version => "2.27", :interface => "admin"})
|
201
|
+
```
|
202
|
+
|
203
|
+
## Direct REST HTTP Methods
|
204
|
+
To send requests directly use the 'get', 'delete', 'post' and 'put' methods directly:
|
205
|
+
```ruby
|
206
|
+
openstack.network.post("/v2.0/qos/policies/48985e6b8da145699d411f12a3459fca/dscp_marking_rules", data)
|
207
|
+
```
|
208
|
+
# Requirements
|
209
|
+
|
210
|
+
## Ruby versions tested
|
211
|
+
* Ruby 2.4.0
|
212
|
+
* Ruby 2.3.3
|
213
|
+
* Ruby 2.3.0
|
214
|
+
* Ruby 2.2.0
|
215
|
+
|
216
|
+
# Contributing
|
217
|
+
Contributors are welcome and must adhere to the [Contributor covenant code of conduct](http://contributor-covenant.org/).
|
218
|
+
|
219
|
+
Please submit issues/bugs and patches on the [Misty repository](https://github.com/flystack/misty).
|
220
|
+
|
221
|
+
# Copyright
|
222
|
+
Copyright © 2007 Free Software Foundation, Inc. See [LICENSE](LICENSE.md) for details.
|
data/lib/misty.rb
ADDED
data/lib/misty/auth.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Misty
|
2
|
+
class Auth
|
3
|
+
class AuthenticationError < StandardError; end
|
4
|
+
class CatalogError < StandardError; end
|
5
|
+
class TokenError < StandardError; end
|
6
|
+
|
7
|
+
class ExpiryError < RuntimeError; end
|
8
|
+
class CredentialsError < RuntimeError; end
|
9
|
+
class InitError < RuntimeError; end
|
10
|
+
class URLError < RuntimeError; end
|
11
|
+
|
12
|
+
def self.factory(options = {})
|
13
|
+
if options[:project]
|
14
|
+
return Misty::AuthV3.new(options)
|
15
|
+
elsif options[:tenant]
|
16
|
+
return Misty::AuthV2.new(options)
|
17
|
+
else
|
18
|
+
raise CredentialsError, "Cannot identify version from credentials"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :catalog
|
23
|
+
|
24
|
+
def initialize(options)
|
25
|
+
raise CredentialsError unless credentials_valid?(options)
|
26
|
+
@credentials = scoped_credentials(options)
|
27
|
+
raise URLError, "No URL provided" unless options[:url] && !options[:url].empty?
|
28
|
+
@uri = URI.parse(options[:url])
|
29
|
+
@token = nil
|
30
|
+
setup(authenticate)
|
31
|
+
raise CatalogError, "No catalog provided during authentication" if @catalog.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def authenticate
|
35
|
+
http = Net::HTTP.new(@uri.host, @uri.port)
|
36
|
+
response = http.post(self.class.path, @credentials.to_json, Misty::HEADER_JSON)
|
37
|
+
raise AuthenticationError, "Response code=#{response.code}, Msg=#{response.msg}" unless response.code =~ /200|201/
|
38
|
+
response
|
39
|
+
end
|
40
|
+
|
41
|
+
def expired?
|
42
|
+
raise ExpiryError, "Missing token expiration data" if @expires.nil? || @expires.empty?
|
43
|
+
Time.parse(@expires) < Time.now.utc
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_endpoint(service_names, region, interface)
|
47
|
+
@catalog.each do |catalog|
|
48
|
+
if service_names.include? catalog["type"]
|
49
|
+
return catalog_endpoints(catalog["endpoints"], region, interface)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
raise CatalogError, "No service found with either #{service_names} name, region #{region}, interface #{interface}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_token
|
56
|
+
authenticate if expired?
|
57
|
+
@token
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'misty/auth'
|
2
|
+
|
3
|
+
module Misty
|
4
|
+
class AuthV2 < Misty::Auth
|
5
|
+
def self.path
|
6
|
+
"/v2.0/tokens"
|
7
|
+
end
|
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
|
15
|
+
end
|
16
|
+
|
17
|
+
def credentials_valid?(creds)
|
18
|
+
true if creds[:user] && creds[:password] && creds[:tenant]
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_endpoint_url(endpoints, region, interface)
|
22
|
+
endpoint = endpoints.select { |ep| !ep[interface].empty? }
|
23
|
+
raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
|
24
|
+
endpoint[0][interface]
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup(response)
|
28
|
+
payload = JSON.load(response.body)
|
29
|
+
@token = payload["access"]["token"]["id"]
|
30
|
+
@catalog = payload["access"]["serviceCatalog"]
|
31
|
+
@expires = payload["access"]["token"]["expires"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def scoped_credentials(creds)
|
35
|
+
{
|
36
|
+
"auth": {
|
37
|
+
"passwordCredentials": {
|
38
|
+
"username": creds[:user],
|
39
|
+
"password": creds[:password]
|
40
|
+
},
|
41
|
+
"tenantName": creds[:tenant]
|
42
|
+
}
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'misty/auth'
|
2
|
+
|
3
|
+
module Misty
|
4
|
+
class AuthV3 < Misty::Auth
|
5
|
+
def self.path
|
6
|
+
"/v3/auth/tokens"
|
7
|
+
end
|
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
|
15
|
+
end
|
16
|
+
|
17
|
+
def credentials_valid?(creds)
|
18
|
+
true if creds[:user] && creds[:password] && creds[:project]
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_endpoint_url(endpoints, region, interface)
|
22
|
+
endpoint = endpoints.select { |ep| ep["region_id"] == region && ep["interface"] == interface }
|
23
|
+
raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
|
24
|
+
endpoint[0]["url"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup(response)
|
28
|
+
payload = JSON.load(response.body)
|
29
|
+
@token = response["x-subject-token"]
|
30
|
+
@catalog = payload["token"]["catalog"]
|
31
|
+
@expires = payload["token"]["expires_at"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def scoped_credentials(creds)
|
35
|
+
creds[:domain] ||= "default"
|
36
|
+
{
|
37
|
+
"auth": {
|
38
|
+
"identity": {
|
39
|
+
"methods": ["password"],
|
40
|
+
"password": {
|
41
|
+
"user": {
|
42
|
+
"name": creds[:user],
|
43
|
+
"domain": { "id": "default" },
|
44
|
+
"password": creds[:password]
|
45
|
+
}
|
46
|
+
}
|
47
|
+
},
|
48
|
+
"scope": {
|
49
|
+
"project": {
|
50
|
+
"name": creds[:project],
|
51
|
+
"domain": { "id": creds[:domain] }
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Misty
|
2
|
+
module Openstack
|
3
|
+
module Aodh
|
4
|
+
autoload :V2, "misty/openstack/aodh/v2"
|
5
|
+
end
|
6
|
+
|
7
|
+
module Ceilometer
|
8
|
+
autoload :V2, "misty/openstack/ceilometer/v2"
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cinder
|
12
|
+
autoload :V1, "misty/openstack/cinder/v1"
|
13
|
+
autoload :V3, "misty/openstack/cinder/v3"
|
14
|
+
end
|
15
|
+
|
16
|
+
module Designate
|
17
|
+
autoload :V2, "misty/openstack/designate/v2"
|
18
|
+
end
|
19
|
+
|
20
|
+
module Glance
|
21
|
+
autoload :V1, "misty/openstack/glance/v1"
|
22
|
+
autoload :V2, "misty/openstack/glance/v2"
|
23
|
+
end
|
24
|
+
|
25
|
+
module Heat
|
26
|
+
autoload :V1, "misty/openstack/heat/v1"
|
27
|
+
end
|
28
|
+
|
29
|
+
module Ironic
|
30
|
+
autoload :V1, "misty/openstack/ironic/v1"
|
31
|
+
end
|
32
|
+
|
33
|
+
module Karbor
|
34
|
+
autoload :V1, "misty/openstack/karbor/v1"
|
35
|
+
end
|
36
|
+
|
37
|
+
module Keystone
|
38
|
+
autoload :V3, "misty/openstack/keystone/v3"
|
39
|
+
autoload :V2_0, "misty/openstack/keystone/v2_0"
|
40
|
+
end
|
41
|
+
|
42
|
+
module Magnum
|
43
|
+
autoload :V1, "misty/openstack/magnum/v1"
|
44
|
+
end
|
45
|
+
|
46
|
+
module Manila
|
47
|
+
autoload :V2, "misty/openstack/manila/v2"
|
48
|
+
end
|
49
|
+
|
50
|
+
module Neutron
|
51
|
+
autoload :V2_0, "misty/openstack/neutron/v2_0"
|
52
|
+
end
|
53
|
+
|
54
|
+
module Nova
|
55
|
+
autoload :V2_1, "misty/openstack/nova/v2_1"
|
56
|
+
end
|
57
|
+
|
58
|
+
module Sahara
|
59
|
+
autoload :V1_1, "misty/openstack/sahara/v1_1"
|
60
|
+
end
|
61
|
+
|
62
|
+
module Searchlight
|
63
|
+
autoload :V1, "misty/openstack/searchlight/v1"
|
64
|
+
end
|
65
|
+
|
66
|
+
module Senlin
|
67
|
+
autoload :V1, "misty/openstack/senlin/v1"
|
68
|
+
end
|
69
|
+
|
70
|
+
module Swift
|
71
|
+
autoload :V1, "misty/openstack/swift/v1"
|
72
|
+
end
|
73
|
+
|
74
|
+
module Trove
|
75
|
+
autoload :V1_0, "misty/openstack/trove/v1_0"
|
76
|
+
end
|
77
|
+
|
78
|
+
module Zaqar
|
79
|
+
autoload :V2, "misty/openstack/zaqar/v2"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|