misty 0.3.2 → 0.4.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 +55 -7
- data/lib/misty/auth.rb +15 -9
- data/lib/misty/auth/auth_v2.rb +34 -10
- data/lib/misty/auth/auth_v3.rb +33 -26
- data/lib/misty/auth/name.rb +53 -0
- data/lib/misty/cloud.rb +1 -1
- data/lib/misty/http/client.rb +3 -11
- data/lib/misty/http/net_http.rb +15 -0
- data/lib/misty/misty.rb +3 -0
- data/lib/misty/version.rb +1 -1
- data/test/unit/auth/name_test.rb +112 -0
- data/test/unit/auth_test.rb +8 -8
- data/test/unit/http/client_test.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8871dd676eb4b94f5ba8c83606aa8c058b3308bd
|
4
|
+
data.tar.gz: 1189ed46c9ff27f495195777eab3738e868c19c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94215114f14ce374973f08066ec787156b7863740ba85c748cfb7d5c2d29552996ca47d433b893ec3c17c585ec5fa8fc0a46d6a298913db76203ca29b529166f
|
7
|
+
data.tar.gz: 740e770a49088a9a7c86b8bbc54e8b576837932fcb546ee99da12f67566a977632c282039c56e127ff70135458c77bb7976af57c92dc4e151c8653584d8420fb
|
data/README.md
CHANGED
@@ -122,18 +122,66 @@ openstack.compute.requests
|
|
122
122
|
### Authentication information parameter
|
123
123
|
The URL and credentials details are necessary to authenticate with the identity server (Keystone).
|
124
124
|
|
125
|
-
|
125
|
+
The credentials are a combination of "id" and "name" used to uniquely identify projects, users and their domains.
|
126
|
+
When using only the name, a domain must be specified to guarantee a unique record from the Identity service.
|
127
|
+
|
128
|
+
The following parameters can be used:
|
129
|
+
* `:domain_id`
|
130
|
+
Domain id used for authentication scope
|
131
|
+
Default: `"default"`
|
132
|
+
* `:domain`
|
133
|
+
Domain name used for authentication scope
|
134
|
+
Default: `"Default"`
|
135
|
+
* `:project_id`
|
136
|
+
Project id
|
137
|
+
* `:project`
|
138
|
+
Project name
|
139
|
+
* `:project_domain_id`
|
140
|
+
Project domain id
|
141
|
+
* `:project_domain`
|
142
|
+
Project domain name
|
143
|
+
* `:tenant_id`
|
144
|
+
Tenant id, used only for Keystone v2.0
|
145
|
+
* `:tenant`
|
146
|
+
Tenant name, used only for Keystone v2.0
|
147
|
+
* `:user_id`
|
148
|
+
User id
|
149
|
+
* `:user`
|
150
|
+
User name
|
151
|
+
* `:user_domain_id`
|
152
|
+
User domain id
|
153
|
+
* `:user_domain`
|
154
|
+
User domain name
|
155
|
+
|
156
|
+
#### Keystone v3
|
157
|
+
Keystone v3 is default recommended version:
|
158
|
+
|
126
159
|
```ruby
|
127
160
|
auth = {
|
128
|
-
:url
|
129
|
-
:user
|
130
|
-
:
|
131
|
-
:
|
132
|
-
:
|
161
|
+
:url => "http://localhost:5000",
|
162
|
+
:user => "admin",
|
163
|
+
:user_domain => "default",
|
164
|
+
:password => "secret",
|
165
|
+
:project => "admin",
|
166
|
+
:project_domain => "default"
|
167
|
+
}
|
168
|
+
}
|
169
|
+
```
|
170
|
+
|
171
|
+
Alternatively, using IDs:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
auth = {
|
175
|
+
:url => "http://localhost:5000",
|
176
|
+
:user_id => "48985e6b8da145699d411f12a3459fca",
|
177
|
+
:password => "secret",
|
178
|
+
:project_id => "8e1e232f6cbb4116bbef715d8a0afe6e",
|
133
179
|
}
|
134
180
|
}
|
135
181
|
```
|
136
|
-
|
182
|
+
#### Keystone v2.0
|
183
|
+
Provide the tenant details, Misty will detect it's using v2.0 for authentication:
|
184
|
+
|
137
185
|
```ruby
|
138
186
|
auth = {
|
139
187
|
:url => "http://localhost:5000",
|
data/lib/misty/auth.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'misty/http/net_http'
|
2
|
+
require 'misty/auth/name'
|
3
|
+
|
1
4
|
module Misty
|
2
5
|
class Auth
|
3
6
|
class AuthenticationError < StandardError; end
|
@@ -9,11 +12,13 @@ module Misty
|
|
9
12
|
class InitError < RuntimeError; end
|
10
13
|
class URLError < RuntimeError; end
|
11
14
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
return Misty::
|
15
|
+
include Misty::HTTP::NetHTTP
|
16
|
+
|
17
|
+
def self.factory(options, *args)
|
18
|
+
if options[:project_id] || options[:project]
|
19
|
+
return Misty::AuthV3.new(options, *args)
|
20
|
+
elsif options[:tenant_id] || options[:tenant]
|
21
|
+
return Misty::AuthV2.new(options, *args)
|
17
22
|
else
|
18
23
|
raise CredentialsError, "Cannot identify version from credentials"
|
19
24
|
end
|
@@ -21,9 +26,10 @@ module Misty
|
|
21
26
|
|
22
27
|
attr_reader :catalog
|
23
28
|
|
24
|
-
def initialize(options)
|
25
|
-
|
26
|
-
@credentials =
|
29
|
+
def initialize(options, ssl_verify_mode, log)
|
30
|
+
@ssl_verify_mode, @log = ssl_verify_mode, log
|
31
|
+
@credentials = scoped_authentication
|
32
|
+
|
27
33
|
raise URLError, "No URL provided" unless options[:url] && !options[:url].empty?
|
28
34
|
@uri = URI.parse(options[:url])
|
29
35
|
@token = nil
|
@@ -32,7 +38,7 @@ module Misty
|
|
32
38
|
end
|
33
39
|
|
34
40
|
def authenticate
|
35
|
-
http =
|
41
|
+
http = net_http(@uri, @ssl_verify_mode, @log)
|
36
42
|
response = http.post(self.class.path, @credentials.to_json, Misty::HEADER_JSON)
|
37
43
|
raise AuthenticationError, "Response code=#{response.code}, Msg=#{response.msg}" unless response.code =~ /200|201/
|
38
44
|
response
|
data/lib/misty/auth/auth_v2.rb
CHANGED
@@ -6,6 +6,13 @@ module Misty
|
|
6
6
|
"/v2.0/tokens"
|
7
7
|
end
|
8
8
|
|
9
|
+
def initialize(options, *args)
|
10
|
+
@user = Misty::Auth::User.new(options[:user_id], options[:user])
|
11
|
+
@user.password = options[:password]
|
12
|
+
@tenant = Misty::Auth::Name.new(options[:tenant_id], options[:tenant])
|
13
|
+
super(options, *args)
|
14
|
+
end
|
15
|
+
|
9
16
|
def catalog_endpoints(endpoints, region, interface)
|
10
17
|
endpoints.each do |endpoint|
|
11
18
|
if endpoint["region"] == region && endpoint["#{interface}URL"]
|
@@ -14,10 +21,6 @@ module Misty
|
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
17
|
-
def credentials_valid?(creds)
|
18
|
-
true if creds[:user] && creds[:password] && creds[:tenant]
|
19
|
-
end
|
20
|
-
|
21
24
|
def get_endpoint_url(endpoints, region, interface)
|
22
25
|
endpoint = endpoints.select { |ep| !ep[interface].empty? }
|
23
26
|
raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
|
@@ -31,16 +34,37 @@ module Misty
|
|
31
34
|
@expires = payload["access"]["token"]["expires"]
|
32
35
|
end
|
33
36
|
|
34
|
-
def
|
37
|
+
def scoped_authentication
|
38
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: User name is required" if @user.name.nil?
|
39
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: User password is required" if @user.password.nil?
|
40
|
+
return auth_by_id if @tenant.id
|
41
|
+
return auth_by_name if @tenant.name
|
42
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: No tenant available"
|
43
|
+
end
|
44
|
+
|
45
|
+
def auth_by_name
|
46
|
+
{
|
47
|
+
"auth": {
|
48
|
+
"passwordCredentials": credentials,
|
49
|
+
"tenantName": @tenant.name
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def auth_by_id
|
35
55
|
{
|
36
56
|
"auth": {
|
37
|
-
"passwordCredentials":
|
38
|
-
|
39
|
-
"password": creds[:password]
|
40
|
-
},
|
41
|
-
"tenantName": creds[:tenant]
|
57
|
+
"passwordCredentials": credentials,
|
58
|
+
"tenantId": @tenant.id
|
42
59
|
}
|
43
60
|
}
|
44
61
|
end
|
62
|
+
|
63
|
+
def credentials
|
64
|
+
{
|
65
|
+
"username": @user.name,
|
66
|
+
"password": @user.password
|
67
|
+
}
|
68
|
+
end
|
45
69
|
end
|
46
70
|
end
|
data/lib/misty/auth/auth_v3.rb
CHANGED
@@ -2,6 +2,23 @@ require 'misty/auth'
|
|
2
2
|
|
3
3
|
module Misty
|
4
4
|
class AuthV3 < Misty::Auth
|
5
|
+
def initialize(options, *args)
|
6
|
+
domain_id = options[:domain_id] ? options[:domain_id] : Misty::DOMAIN_ID
|
7
|
+
project_domain_id = options[:project_domain_id] ? options[:project_domain_id] : Misty::DOMAIN_ID
|
8
|
+
user_domain_id = options[:user_domain_id] ? options[:user_domain_id] : Misty::DOMAIN_ID
|
9
|
+
|
10
|
+
@domain = Misty::Auth::Name.new(domain_id, options[:domain])
|
11
|
+
|
12
|
+
@user = Misty::Auth::User.new(options[:user_id], options[:user])
|
13
|
+
@user.password = options[:password]
|
14
|
+
@user.domain = Misty::Auth::Name.new(user_domain_id, options[:user_domain])
|
15
|
+
|
16
|
+
@project = Misty::Auth::Project.new(options[:project_id], options[:project])
|
17
|
+
@project.domain = Misty::Auth::Name.new(project_domain_id, options[:user_domain])
|
18
|
+
|
19
|
+
super(options, *args)
|
20
|
+
end
|
21
|
+
|
5
22
|
def self.path
|
6
23
|
"/v3/auth/tokens"
|
7
24
|
end
|
@@ -14,45 +31,35 @@ module Misty
|
|
14
31
|
end
|
15
32
|
end
|
16
33
|
|
17
|
-
def credentials_valid?(creds)
|
18
|
-
true if creds[:user] && creds[:password] && creds[:project]
|
19
|
-
end
|
20
|
-
|
21
34
|
def get_endpoint_url(endpoints, region, interface)
|
22
35
|
endpoint = endpoints.select { |ep| ep["region_id"] == region && ep["interface"] == interface }
|
23
36
|
raise CatalogError, "No endpoint available for region '#{region}' and interface '#{interface}'" unless endpoint
|
24
37
|
endpoint[0]["url"]
|
25
38
|
end
|
26
39
|
|
27
|
-
def
|
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"
|
40
|
+
def scoped_authentication
|
36
41
|
{
|
37
42
|
"auth": {
|
38
43
|
"identity": {
|
39
44
|
"methods": ["password"],
|
40
|
-
"password":
|
41
|
-
"user": {
|
42
|
-
"name": creds[:user],
|
43
|
-
"domain": { "id": "default" },
|
44
|
-
"password": creds[:password]
|
45
|
-
}
|
46
|
-
}
|
45
|
+
"password": @user.identity
|
47
46
|
},
|
48
|
-
"scope":
|
49
|
-
"project": {
|
50
|
-
"name": creds[:project],
|
51
|
-
"domain": { "id": creds[:domain] }
|
52
|
-
}
|
53
|
-
}
|
47
|
+
"scope": scope
|
54
48
|
}
|
55
49
|
}
|
56
50
|
end
|
51
|
+
|
52
|
+
def scope
|
53
|
+
return @project.identity if @project
|
54
|
+
return @domain.identity if @domain
|
55
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: No scope available"
|
56
|
+
end
|
57
|
+
|
58
|
+
def setup(response)
|
59
|
+
payload = JSON.load(response.body)
|
60
|
+
@token = response["x-subject-token"]
|
61
|
+
@catalog = payload["token"]["catalog"]
|
62
|
+
@expires = payload["token"]["expires_at"]
|
63
|
+
end
|
57
64
|
end
|
58
65
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Misty
|
2
|
+
class Auth
|
3
|
+
module Domain
|
4
|
+
attr_accessor :domain
|
5
|
+
|
6
|
+
def identity
|
7
|
+
data = {}
|
8
|
+
if !id.nil?
|
9
|
+
data.merge!(to_h(:id))
|
10
|
+
elsif !name.nil? && !domain.nil?
|
11
|
+
data.merge!(to_h(:name))
|
12
|
+
data.merge!({ :domain => @domain.identity })
|
13
|
+
else
|
14
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: An Id, or a name with its domain, must be provided"
|
15
|
+
end
|
16
|
+
data
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Name < Struct.new(:id, :name)
|
21
|
+
def identity
|
22
|
+
return to_h(:id) unless id.nil?
|
23
|
+
return to_h(:name) unless name.nil?
|
24
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: No available id or name"
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_h(var)
|
28
|
+
{ var => self.send(var) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Project < Name
|
33
|
+
include Misty::Auth::Domain
|
34
|
+
|
35
|
+
def identity
|
36
|
+
{ :project => super }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class User < Name
|
41
|
+
include Misty::Auth::Domain
|
42
|
+
|
43
|
+
attr_accessor :password
|
44
|
+
|
45
|
+
def identity
|
46
|
+
data = super
|
47
|
+
raise Misty::Auth::CredentialsError, "#{self.class}: No password available" if password.nil?
|
48
|
+
data.merge!(to_h(:password))
|
49
|
+
{ :user => data }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/misty/cloud.rb
CHANGED
@@ -19,13 +19,13 @@ module Misty
|
|
19
19
|
|
20
20
|
def self.setup(params)
|
21
21
|
setup = Setup.new
|
22
|
-
setup.auth = Misty::Auth.factory(params[:auth])
|
23
22
|
setup.content_type = params[:content_type] ? params[:content_type] : Misty::CONTENT_TYPE
|
24
23
|
setup.interface = params[:interface] ? params[:interface] : Misty::INTERFACE
|
25
24
|
setup.log = Logger.new(params[:log_file] ? params[:log_file] : Misty::LOG_FILE)
|
26
25
|
setup.log.level = params[:log_level] ? params[:log_level] : Misty::LOG_LEVEL
|
27
26
|
setup.region_id = params[:region_id] ? params[:region_id] : Misty::REGION_ID
|
28
27
|
setup.ssl_verify_mode = params[:ssl_verify_mode] ? params[:ssl_verify_mode] : Misty::SSL_VERIFY_MODE
|
28
|
+
setup.auth = Misty::Auth.factory(params[:auth], setup.ssl_verify_mode, setup.log)
|
29
29
|
setup
|
30
30
|
end
|
31
31
|
|
data/lib/misty/http/client.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'misty/http/net_http'
|
1
2
|
require 'misty/http/method_builder'
|
2
3
|
require 'misty/http/request'
|
3
4
|
require 'misty/http/direct'
|
@@ -7,6 +8,7 @@ module Misty
|
|
7
8
|
class Client
|
8
9
|
class InvalidDataError < StandardError; end
|
9
10
|
|
11
|
+
include Misty::HTTP::NetHTTP
|
10
12
|
include Misty::HTTP::MethodBuilder
|
11
13
|
include Misty::HTTP::Request
|
12
14
|
include Misty::HTTP::Direct
|
@@ -49,7 +51,7 @@ module Misty
|
|
49
51
|
@uri = URI.parse(@setup.auth.get_endpoint(@options.service_names, @options.region_id, @options.interface))
|
50
52
|
@base_path = @options.base_path ? @options.base_path : @uri.path
|
51
53
|
@base_path = @base_path.chomp("/")
|
52
|
-
@http = net_http(@uri)
|
54
|
+
@http = net_http(@uri, @options[:ssl_verify_mode], @setup.log)
|
53
55
|
@version = nil
|
54
56
|
@microversion = false
|
55
57
|
end
|
@@ -81,16 +83,6 @@ module Misty
|
|
81
83
|
self.class.to_s.split('::')[-1]
|
82
84
|
end
|
83
85
|
|
84
|
-
def net_http(uri)
|
85
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
86
|
-
http.set_debug_output($stdout) if @setup.log.level == Logger::DEBUG
|
87
|
-
if uri.scheme == "https"
|
88
|
-
http.use_ssl = true
|
89
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @options[:ssl_verify_mode]
|
90
|
-
end
|
91
|
-
http
|
92
|
-
end
|
93
|
-
|
94
86
|
def setup(params)
|
95
87
|
options = Options.new()
|
96
88
|
options.base_path = params[:base_path] ? params[:base_path] : nil
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Misty
|
2
|
+
module HTTP
|
3
|
+
module NetHTTP
|
4
|
+
def net_http(uri, ssl_verify_mode, log)
|
5
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
6
|
+
http.set_debug_output(log) if log.level == Logger::DEBUG
|
7
|
+
if uri.scheme == "https"
|
8
|
+
http.use_ssl = true
|
9
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless ssl_verify_mode
|
10
|
+
end
|
11
|
+
http
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/misty/misty.rb
CHANGED
data/lib/misty/version.rb
CHANGED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'misty/auth/name'
|
3
|
+
|
4
|
+
describe Misty::Auth::Name do
|
5
|
+
describe "creates" do
|
6
|
+
it "when id and name are provided" do
|
7
|
+
name = Misty::Auth::Name.new("default", "Default")
|
8
|
+
name.id.must_equal "default"
|
9
|
+
name.name.must_equal "Default"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "when id is null" do
|
13
|
+
name = Misty::Auth::Name.new(nil, "Default")
|
14
|
+
name.id.must_be_nil
|
15
|
+
name.name.must_equal "Default"
|
16
|
+
end
|
17
|
+
|
18
|
+
name = Misty::Auth::Name.new(nil, nil)
|
19
|
+
it "when name is null" do
|
20
|
+
name = Misty::Auth::Name.new("default", nil)
|
21
|
+
name.id.must_equal "default"
|
22
|
+
name.name.must_be_nil
|
23
|
+
end
|
24
|
+
|
25
|
+
it "when both id and name is null" do
|
26
|
+
name = Misty::Auth::Name.new(nil, nil)
|
27
|
+
name.name.must_be_nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#to_h" do
|
32
|
+
it "returns the hash of provided attribute" do
|
33
|
+
name = Misty::Auth::Name.new("default", "Default")
|
34
|
+
name.to_h(:id).must_equal ({:id => "default"})
|
35
|
+
name.to_h(:name).must_equal ({:name => "Default"})
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe Misty::Auth::User do
|
41
|
+
describe "#password" do
|
42
|
+
it "set/get password" do
|
43
|
+
user = Misty::Auth::User.new("user_id", "User")
|
44
|
+
user.password = "secret"
|
45
|
+
user.identity.must_equal ({:user=>{:id=>"user_id", :password=>"secret"}})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#identity" do
|
50
|
+
it "raises an error when password is missing" do
|
51
|
+
proc do
|
52
|
+
user = Misty::Auth::User.new("user_id", "User")
|
53
|
+
user.identity
|
54
|
+
end.must_raise Misty::Auth::CredentialsError
|
55
|
+
end
|
56
|
+
|
57
|
+
it "when id is provided it doesn't require domain" do
|
58
|
+
user = Misty::Auth::User.new("user_id", "User")
|
59
|
+
user.password = "secret"
|
60
|
+
user.identity.must_equal ({:user=>{:id=>"user_id", :password=>"secret"}})
|
61
|
+
end
|
62
|
+
|
63
|
+
it "when id is nul and name is provided it uses domain id" do
|
64
|
+
user = Misty::Auth::User.new(nil, "User")
|
65
|
+
user.password = "secret"
|
66
|
+
user.domain = Misty::Auth::Name.new("default", nil)
|
67
|
+
user.identity.must_equal ({:user=>{:name=>"User", :domain=>{:id=>"default"}, :password=>"secret"}})
|
68
|
+
end
|
69
|
+
|
70
|
+
it "when id is nul and name is provided it uses domain name" do
|
71
|
+
user = Misty::Auth::User.new(nil, "User")
|
72
|
+
user.password = "secret"
|
73
|
+
user.domain = Misty::Auth::Name.new(nil, "Default")
|
74
|
+
user.identity.must_equal ({:user=>{:name=>"User", :domain=>{:name=>"Default"}, :password=>"secret"}})
|
75
|
+
end
|
76
|
+
|
77
|
+
it "raises an error with no user id and no domain are provided" do
|
78
|
+
proc do
|
79
|
+
user = Misty::Auth::User.new(nil, "User")
|
80
|
+
user.identity
|
81
|
+
end.must_raise Misty::Auth::CredentialsError
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe Misty::Auth::Project do
|
87
|
+
describe "#identity" do
|
88
|
+
it "when id is provided it doesn't require domain" do
|
89
|
+
project = Misty::Auth::Project.new("project_id", "Project")
|
90
|
+
project.identity.must_equal ({:project=>{:id=>"project_id"}})
|
91
|
+
end
|
92
|
+
|
93
|
+
it "when id is nul and name is provided it uses domain id" do
|
94
|
+
project = Misty::Auth::Project.new(nil, "Project")
|
95
|
+
project.domain = Misty::Auth::Name.new("default", nil)
|
96
|
+
project.identity.must_equal ({:project=>{:name=>"Project", :domain=>{:id=>"default"}}})
|
97
|
+
end
|
98
|
+
|
99
|
+
it "when id is nul and name is provided it uses domain name" do
|
100
|
+
project = Misty::Auth::Project.new(nil, "Project")
|
101
|
+
project.domain = Misty::Auth::Name.new(nil, "Default")
|
102
|
+
project.identity.must_equal ({:project=>{:name=>"Project", :domain=>{:name=>"Default"}}})
|
103
|
+
end
|
104
|
+
|
105
|
+
it "raises an error with no project id and no domain are provided" do
|
106
|
+
proc do
|
107
|
+
project = Misty::Auth::Project.new(nil, "Project")
|
108
|
+
project.identity
|
109
|
+
end.must_raise Misty::Auth::CredentialsError
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/test/unit/auth_test.rb
CHANGED
@@ -28,7 +28,7 @@ describe Misty::Auth do
|
|
28
28
|
to_return(:status => 200, :body => "{\"token\":{\"catalog\":[]}}", :headers => {"x-subject-token"=>"token_data"})
|
29
29
|
|
30
30
|
proc do
|
31
|
-
Misty::AuthV3.new({})
|
31
|
+
Misty::AuthV3.new({}, false, Logger.new('/dev/null'))
|
32
32
|
end.must_raise Misty::Auth::CredentialsError
|
33
33
|
end
|
34
34
|
|
@@ -36,7 +36,7 @@ describe Misty::Auth do
|
|
36
36
|
stub_request(:post, "http://localhost:5000/v3/auth/tokens").
|
37
37
|
to_return(:status => 200, :body => "{\"token\":{\"catalog\":[\"catalog_data\"]}}", :headers => {"x-subject-token"=>"token_data"})
|
38
38
|
|
39
|
-
auth = Misty::AuthV3.new(authv3_creds)
|
39
|
+
auth = Misty::AuthV3.new(authv3_creds, false, Logger.new('/dev/null'))
|
40
40
|
auth.stub :expired?, false do
|
41
41
|
auth.get_token.must_equal "token_data"
|
42
42
|
end
|
@@ -46,7 +46,7 @@ describe Misty::Auth do
|
|
46
46
|
stub_request(:post, "http://localhost:5000/v3/auth/tokens").
|
47
47
|
to_return(:status => 200, :body => "{\"token\":{\"catalog\":[\"catalog_data\"]}}", :headers => {"x-subject-token"=>"token_data"})
|
48
48
|
|
49
|
-
auth = Misty::AuthV3.new(authv3_creds)
|
49
|
+
auth = Misty::AuthV3.new(authv3_creds, false, Logger.new('/dev/null'))
|
50
50
|
auth.catalog.must_equal ["catalog_data"]
|
51
51
|
end
|
52
52
|
|
@@ -54,7 +54,7 @@ describe Misty::Auth do
|
|
54
54
|
stub_request(:post, "http://localhost:5000/v3/auth/tokens").
|
55
55
|
to_return(:status => 200, :body => JSON.dump(auth_response_v3("identity", "keystone")), :headers => {"x-subject-token"=>"token_data"})
|
56
56
|
|
57
|
-
auth = Misty::AuthV3.new(authv3_creds)
|
57
|
+
auth = Misty::AuthV3.new(authv3_creds, false, Logger.new('/dev/null'))
|
58
58
|
auth.get_endpoint(%w{identity}, "regionOne", "public").must_equal "http://localhost"
|
59
59
|
end
|
60
60
|
end
|
@@ -65,7 +65,7 @@ describe Misty::Auth do
|
|
65
65
|
to_return(:status => 200, :body => "{\"access\":{\"token\":{\"id\":\"token_data\"}}}", :headers => {})
|
66
66
|
|
67
67
|
proc do
|
68
|
-
Misty::AuthV2.new({})
|
68
|
+
Misty::AuthV2.new({}, false, Logger.new('/dev/null'))
|
69
69
|
end.must_raise Misty::Auth::CredentialsError
|
70
70
|
end
|
71
71
|
|
@@ -73,7 +73,7 @@ describe Misty::Auth do
|
|
73
73
|
stub_request(:post, "http://localhost:5000/v2.0/tokens").
|
74
74
|
to_return(:status => 200, :body => "{\"access\":{\"token\":{\"id\":\"token_data\"},\"serviceCatalog\":[\"catalog_data\"]}}", :headers => {})
|
75
75
|
|
76
|
-
auth = Misty::AuthV2.new(authv2_creds)
|
76
|
+
auth = Misty::AuthV2.new(authv2_creds, false, Logger.new('/dev/null'))
|
77
77
|
auth.stub :expired?, false do
|
78
78
|
auth.get_token.must_equal "token_data"
|
79
79
|
end
|
@@ -83,7 +83,7 @@ describe Misty::Auth do
|
|
83
83
|
stub_request(:post, "http://localhost:5000/v2.0/tokens").
|
84
84
|
to_return(:status => 200, :body => "{\"access\":{\"token\":{\"id\":\"token_data\"},\"serviceCatalog\":[\"catalog_data\"]}}", :headers => {})
|
85
85
|
|
86
|
-
auth = Misty::AuthV2.new(authv2_creds)
|
86
|
+
auth = Misty::AuthV2.new(authv2_creds, false, Logger.new('/dev/null'))
|
87
87
|
auth.catalog.must_equal ["catalog_data"]
|
88
88
|
end
|
89
89
|
|
@@ -91,7 +91,7 @@ describe Misty::Auth do
|
|
91
91
|
stub_request(:post, "http://localhost:5000/v2.0/tokens").
|
92
92
|
to_return(:status => 200, :body => JSON.dump(auth_response_v2("identity", "keystone")), :headers => {"x-subject-token"=>"token_data"})
|
93
93
|
|
94
|
-
auth = Misty::AuthV2.new(authv2_creds)
|
94
|
+
auth = Misty::AuthV2.new(authv2_creds, false, Logger.new('/dev/null'))
|
95
95
|
auth.get_endpoint(%w{identity}, "regionOne", "public").must_equal "http://localhost"
|
96
96
|
end
|
97
97
|
end
|
@@ -42,7 +42,7 @@ describe Misty::HTTP::Client do
|
|
42
42
|
describe "#net_http" do
|
43
43
|
it "returns a Net/http instance" do
|
44
44
|
uri = URI.parse("http://localhost")
|
45
|
-
service.send(:net_http, uri).must_be_instance_of Net::HTTP
|
45
|
+
service.send(:net_http, uri, false, Logger.new("/dev/null")).must_be_instance_of Net::HTTP
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
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.
|
4
|
+
version: 0.4.0
|
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-03-
|
11
|
+
date: 2017-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -124,11 +124,13 @@ files:
|
|
124
124
|
- lib/misty/auth.rb
|
125
125
|
- lib/misty/auth/auth_v2.rb
|
126
126
|
- lib/misty/auth/auth_v3.rb
|
127
|
+
- lib/misty/auth/name.rb
|
127
128
|
- lib/misty/autoload.rb
|
128
129
|
- lib/misty/cloud.rb
|
129
130
|
- lib/misty/http/client.rb
|
130
131
|
- lib/misty/http/direct.rb
|
131
132
|
- lib/misty/http/method_builder.rb
|
133
|
+
- lib/misty/http/net_http.rb
|
132
134
|
- lib/misty/http/request.rb
|
133
135
|
- lib/misty/misty.rb
|
134
136
|
- lib/misty/openstack/aodh/aodh_v2.rb
|
@@ -186,6 +188,7 @@ files:
|
|
186
188
|
- test/integration/vcr/compute_using_nova_v2_1.yml
|
187
189
|
- test/integration/vcr/network_using_neutron_v2_0.yml
|
188
190
|
- test/integration/vcr/orchestration_using_heat_v1.yml
|
191
|
+
- test/unit/auth/name_test.rb
|
189
192
|
- test/unit/auth_helper.rb
|
190
193
|
- test/unit/auth_test.rb
|
191
194
|
- test/unit/cloud/requests_test.rb
|