openstack_activeresource 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/hot_fixes.rb +4 -1
- data/lib/open_stack/base.rb +5 -0
- data/lib/open_stack/keystone/admin/role.rb +10 -3
- data/lib/open_stack/keystone/admin/tenant.rb +44 -13
- data/lib/open_stack/keystone/admin/user.rb +33 -6
- data/lib/open_stack/keystone/admin/user_role.rb +15 -0
- data/lib/open_stack/keystone/public/auth.rb +22 -7
- data/lib/open_stack/keystone/public/base.rb +2 -0
- data/lib/open_stack/keystone/public/tenant.rb +17 -3
- data/lib/open_stack/nova/compute/base.rb +2 -0
- data/lib/open_stack/nova/compute/base_detail.rb +1 -1
- data/lib/open_stack/nova/compute/flavor.rb +35 -7
- data/lib/open_stack/nova/compute/floating_ip.rb +28 -9
- data/lib/open_stack/nova/compute/floating_ip_pool.rb +5 -0
- data/lib/open_stack/nova/compute/image.rb +34 -4
- data/lib/open_stack/nova/compute/key_pair.rb +17 -4
- data/lib/open_stack/nova/compute/network.rb +10 -0
- data/lib/open_stack/nova/compute/security_group.rb +31 -6
- data/lib/open_stack/nova/compute/server.rb +118 -43
- data/lib/open_stack/nova/compute/simple_tenant_usage.rb +49 -13
- data/lib/open_stack/nova/compute/volume_attachment.rb +20 -6
- data/lib/open_stack/nova/volume/volume.rb +14 -5
- data/openstack_activeresource.gemspec +2 -2
- data/test/test_openstack-activeresource.rb +3 -5
- metadata +3 -3
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
data/lib/hot_fixes.rb
CHANGED
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
# Reopens ActiveResource::Base to fix "ActiveResource nested resources not being persisted"
|
|
19
19
|
# See https://github.com/rails/rails/pull/3107
|
|
20
|
-
module ActiveResource
|
|
20
|
+
module ActiveResource #:nodoc:
|
|
21
21
|
class Base
|
|
22
|
+
|
|
22
23
|
def load(attributes, remove_root = false)
|
|
23
24
|
raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
|
|
24
25
|
@prefix_options, attributes = split_options(attributes)
|
|
@@ -49,7 +50,9 @@ module ActiveResource
|
|
|
49
50
|
value.duplicable? ? value.dup : value
|
|
50
51
|
end
|
|
51
52
|
end
|
|
53
|
+
|
|
52
54
|
self
|
|
53
55
|
end
|
|
56
|
+
|
|
54
57
|
end
|
|
55
58
|
end
|
data/lib/open_stack/base.rb
CHANGED
|
@@ -26,6 +26,7 @@ module OpenStack
|
|
|
26
26
|
self.format = :json
|
|
27
27
|
self.timeout = 5
|
|
28
28
|
|
|
29
|
+
# Set the X-Auth-Token header if the OpenStack authentication token is present
|
|
29
30
|
def self.headers
|
|
30
31
|
if defined?(@headers)
|
|
31
32
|
_headers = @headers
|
|
@@ -44,11 +45,15 @@ module OpenStack
|
|
|
44
45
|
|
|
45
46
|
protected
|
|
46
47
|
|
|
48
|
+
# Set the authentication token
|
|
47
49
|
def self.token=(token)
|
|
50
|
+
# Trying to be thread safe here...
|
|
48
51
|
Thread.current[:open_stack_token] = token.is_a?(OpenStack::Keystone::Public::Auth::Token) ? token.id : token
|
|
49
52
|
end
|
|
50
53
|
|
|
54
|
+
# Get the current authentication token
|
|
51
55
|
def self.token
|
|
56
|
+
# Trying to be thread safe here...
|
|
52
57
|
Thread.current[:open_stack_token]
|
|
53
58
|
end
|
|
54
59
|
|
|
@@ -19,13 +19,20 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Admin
|
|
21
21
|
|
|
22
|
+
# An OpenStack Role ("admin view")
|
|
23
|
+
#
|
|
24
|
+
# ==== Attributes
|
|
25
|
+
# * +name+ - The name of this role
|
|
22
26
|
class Role < Base
|
|
23
27
|
self.element_name = "OS-KSADM/role"
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
schema do
|
|
30
|
+
attribute :name, :string
|
|
31
|
+
end
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
# List Roles with a given name
|
|
34
|
+
def self.find_by_name(name)
|
|
35
|
+
all.detect { |role| role.name == name }
|
|
29
36
|
end
|
|
30
37
|
|
|
31
38
|
end
|
|
@@ -19,6 +19,12 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Admin
|
|
21
21
|
|
|
22
|
+
# An OpenStack Tenant ("admin view")
|
|
23
|
+
#
|
|
24
|
+
# ==== Attributes
|
|
25
|
+
# * +name+ - The name of this tenant
|
|
26
|
+
# * +description+ - A description of this tenant
|
|
27
|
+
# * +enabled+ - True if this tenant is enabled
|
|
22
28
|
class Tenant < Base
|
|
23
29
|
|
|
24
30
|
schema do
|
|
@@ -31,7 +37,13 @@ module OpenStack
|
|
|
31
37
|
validates :name, :format => {:with => /\A\w[\w\s]+\w\Z/}
|
|
32
38
|
validates :description, :format => {:with => /\A[\w\s\.\-:@+,'"]+\Z/}
|
|
33
39
|
|
|
34
|
-
def
|
|
40
|
+
def initialize(params = {}, persisted = false) #:notnew:
|
|
41
|
+
super(params, persisted)
|
|
42
|
+
|
|
43
|
+
self.description = description
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.find_every(options) #:nodoc:
|
|
35
47
|
class_name = self.name.split('::').last.downcase
|
|
36
48
|
begin
|
|
37
49
|
case from = options[:from]
|
|
@@ -52,29 +64,46 @@ module OpenStack
|
|
|
52
64
|
end
|
|
53
65
|
end
|
|
54
66
|
|
|
67
|
+
# List of tenant with a given name
|
|
68
|
+
#
|
|
69
|
+
# ==== Attributes
|
|
70
|
+
# * +name+ - A string
|
|
55
71
|
def self.find_by_name(name)
|
|
56
72
|
all.detect { |x| x.name == name }
|
|
57
73
|
end
|
|
58
74
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
|
|
75
|
+
# List of Users (instances of OpenStack::Keystone::Admin::User) in this tenant
|
|
76
|
+
#
|
|
77
|
+
# ==== Attributes
|
|
78
|
+
# * +scope+ - An ActiveResource scope (defaults to :all)
|
|
66
79
|
def users(scope = :all)
|
|
67
80
|
User.find(scope, :params => {:tenant_id => self.id})
|
|
68
81
|
end
|
|
69
82
|
|
|
83
|
+
# Returns the instance of OpenStack::Keystone::Admin::User with the given id
|
|
84
|
+
#
|
|
85
|
+
# ==== Attributes
|
|
86
|
+
# * +id+ - A string
|
|
70
87
|
def user(id)
|
|
71
88
|
users(id)
|
|
72
89
|
end
|
|
73
90
|
|
|
91
|
+
# List if roles in this tenant for a given instance of OpenStack::Keystone::Admin::User or user id
|
|
92
|
+
#
|
|
93
|
+
# ==== Attributes
|
|
94
|
+
# * +user+ - A string
|
|
95
|
+
# * +scope+ - An ActiveResource scope (defaults to :all)
|
|
74
96
|
def user_roles(user, scope = :all)
|
|
75
|
-
|
|
97
|
+
user_id = user.is_a?(OpenStack::Keystone::Admin::User) ? user.id : user
|
|
98
|
+
|
|
99
|
+
Role.find(scope, :params => {:tenant_id => self.id, :user_id => user_id})
|
|
76
100
|
end
|
|
77
101
|
|
|
102
|
+
# Adds a role to a user in this tenant
|
|
103
|
+
#
|
|
104
|
+
# ==== Attributes
|
|
105
|
+
# * +role+ - Instance of OpenStack::Keystone::Admin::Role or a role id
|
|
106
|
+
# * +user+ - Instance of OpenStack::Keystone::Admin::User or a user id
|
|
78
107
|
def add_role_to_user(role, user)
|
|
79
108
|
role_id = role.is_a?(OpenStack::Keystone::Admin::Role) ? role.id : role
|
|
80
109
|
user_id = user.is_a?(OpenStack::Keystone::Admin::User) ? user.id : user
|
|
@@ -82,6 +111,11 @@ module OpenStack
|
|
|
82
111
|
put("users/#{user_id}/roles/OS-KSADM/#{role_id}", {}, "null")
|
|
83
112
|
end
|
|
84
113
|
|
|
114
|
+
# Removes a role to a user in this tenant
|
|
115
|
+
#
|
|
116
|
+
# ==== Attributes
|
|
117
|
+
# * +role+ - Instance of OpenStack::Keystone::Admin::Role or a role id
|
|
118
|
+
# * +user+ - Instance of OpenStack::Keystone::Admin::User or a user id
|
|
85
119
|
def delete_role_from_user(role, user)
|
|
86
120
|
role_id = role.is_a?(OpenStack::Keystone::Admin::Role) ? role.id : role
|
|
87
121
|
user_id = user.is_a?(OpenStack::Keystone::Admin::User) ? user.id : user
|
|
@@ -89,10 +123,7 @@ module OpenStack
|
|
|
89
123
|
delete("users/#{user_id}/roles/OS-KSADM/#{role_id}")
|
|
90
124
|
end
|
|
91
125
|
|
|
92
|
-
|
|
93
|
-
users(user)
|
|
94
|
-
end
|
|
95
|
-
|
|
126
|
+
# Returns a filtered description for this tenant
|
|
96
127
|
def description=(description)
|
|
97
128
|
@attributes[:description] = description.gsub /[^\w\s\.\-:@+,'"]/, '_' if description
|
|
98
129
|
|
|
@@ -19,6 +19,14 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Admin
|
|
21
21
|
|
|
22
|
+
# An OpenStack User ("admin view")
|
|
23
|
+
#
|
|
24
|
+
# ==== Attributes
|
|
25
|
+
# * +name+ - The name of this user
|
|
26
|
+
# * +password+ - Password (possibly encrypted) of this user
|
|
27
|
+
# * +email+ - E-mail address of this user
|
|
28
|
+
# * +enabled+ - True if this user is enabled
|
|
29
|
+
# * +tenant_id+ - Default (i.e. primary) tenant for this user
|
|
22
30
|
class User < Base
|
|
23
31
|
|
|
24
32
|
schema do
|
|
@@ -37,7 +45,7 @@ module OpenStack
|
|
|
37
45
|
validates_format_of :email, :with => /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\Z/i
|
|
38
46
|
validates :enabled, :presence => true, :inclusion => {:in => [true, false]}
|
|
39
47
|
|
|
40
|
-
def initialize(attributes = {}, persisted = false)
|
|
48
|
+
def initialize(attributes = {}, persisted = false) #:notnew:
|
|
41
49
|
attributes = attributes.with_indifferent_access
|
|
42
50
|
|
|
43
51
|
if attributes[:tenant].present?
|
|
@@ -51,9 +59,8 @@ module OpenStack
|
|
|
51
59
|
super(attributes, persisted)
|
|
52
60
|
end
|
|
53
61
|
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
def encode(options={})
|
|
62
|
+
# Overloads ActiveRecord::encode method
|
|
63
|
+
def encode(options={}) #:nodoc: Custom encoding to deal with openstack API
|
|
57
64
|
to_encode = {
|
|
58
65
|
:user => {
|
|
59
66
|
:name => name,
|
|
@@ -68,12 +75,21 @@ module OpenStack
|
|
|
68
75
|
to_encode.send("to_#{self.class.format.extension}", options)
|
|
69
76
|
end
|
|
70
77
|
|
|
78
|
+
# List of users in a given tenant
|
|
79
|
+
#
|
|
80
|
+
# ==== Attributes
|
|
81
|
+
# * +tenant+ - An instance of OpenStack::Keystone::Admin::Tenant or a tenant id
|
|
71
82
|
def self.all_by_tenant(tenant)
|
|
72
83
|
tenant_id = tenant.is_a?(OpenStack::Keystone::Admin::Tenant) ? tenant.id : tenant
|
|
73
84
|
|
|
74
85
|
all.select { |user| user.tenant_id == tenant_id }
|
|
75
86
|
end
|
|
76
87
|
|
|
88
|
+
# Find a user in a given tenant
|
|
89
|
+
#
|
|
90
|
+
# ==== Attributes
|
|
91
|
+
# * +id+ - The user id
|
|
92
|
+
# * +tenant+ - An instance of OpenStack::Keystone::Admin::Tenant or a tenant id
|
|
77
93
|
def self.find_by_tenant(id, tenant)
|
|
78
94
|
tenant_id = tenant.is_a?(OpenStack::Keystone::Admin::Tenant) ? tenant.id : tenant
|
|
79
95
|
|
|
@@ -81,17 +97,28 @@ module OpenStack
|
|
|
81
97
|
user.tenant_id == tenant_id ? user : nil
|
|
82
98
|
end
|
|
83
99
|
|
|
100
|
+
# List of user with a given name
|
|
101
|
+
#
|
|
102
|
+
# ==== Attributes
|
|
103
|
+
# * +name+ - A string
|
|
84
104
|
def self.find_by_name(name)
|
|
85
105
|
all.detect { |user| user.name == name }
|
|
86
106
|
end
|
|
87
|
-
|
|
107
|
+
|
|
108
|
+
# The primary (default) tenant (i.e. an instance of OpenStack::Keystone::Admin::Tenant) associated with this user
|
|
88
109
|
def tenant
|
|
89
110
|
OpenStack::Keystone::Admin::Tenant.find tenant_id
|
|
90
111
|
end
|
|
91
112
|
|
|
113
|
+
# File role(s) (i.e. instances of OpenStack::Keystone::Admin::UserRole) for this user in a given tenant
|
|
114
|
+
#
|
|
115
|
+
# ==== Attributes
|
|
116
|
+
# * +scope+ - The ActiveResource scope (defaults to :all)
|
|
117
|
+
# * +tenant+ - An optional instance of OpenStack::Keystone::Admin::Tenant (or a tenant id). Defaults to the primary tenant for this user
|
|
92
118
|
def roles(scope = :all, tenant = nil)
|
|
93
119
|
tenant_id = tenant.is_a?(OpenStack::Keystone::Admin::Tenant) ? tenant.id : (tenant || self.tenant_id)
|
|
94
|
-
|
|
120
|
+
|
|
121
|
+
OpenStack::Keystone::Admin::UserRole.find(scope, :params => {:tenant_id => tenant_id, :user_id => self.id})
|
|
95
122
|
end
|
|
96
123
|
|
|
97
124
|
end
|
|
@@ -19,10 +19,25 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Admin
|
|
21
21
|
|
|
22
|
+
# User Role ("admin view") (\*Warning:* incomplete)
|
|
23
|
+
#
|
|
24
|
+
# ==== Attributes
|
|
25
|
+
# * +name+ - The name of the Role
|
|
26
|
+
# * +description+ - A description of the role
|
|
22
27
|
class UserRole < Base
|
|
23
28
|
self.element_name = "role"
|
|
24
29
|
self.site = superclass.site + "tenants/:tenant_id/users/:user_id"
|
|
25
30
|
|
|
31
|
+
schema do
|
|
32
|
+
attribute :name, :string
|
|
33
|
+
attribute :description, :string
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Return the associated instance of OpenStack::Keystone::Admin::Role
|
|
37
|
+
def role
|
|
38
|
+
OpenStack::Keystone::Admin::Role.find(self.id) if persisted?
|
|
39
|
+
end
|
|
40
|
+
|
|
26
41
|
end
|
|
27
42
|
|
|
28
43
|
end
|
|
@@ -19,6 +19,7 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Public
|
|
21
21
|
|
|
22
|
+
# End user authentication
|
|
22
23
|
class Auth < Base
|
|
23
24
|
self.element_name = "token"
|
|
24
25
|
|
|
@@ -31,7 +32,7 @@ module OpenStack
|
|
|
31
32
|
validates :username, :presence => true, :unless => Proc.new { token.present? }
|
|
32
33
|
validates :password, :presence => true, :unless => Proc.new { token.present? }
|
|
33
34
|
|
|
34
|
-
def initialize(attributes = {}, persisted = false)
|
|
35
|
+
def initialize(attributes = {}, persisted = false) #:notnew:
|
|
35
36
|
attributes[:username] ||= ""
|
|
36
37
|
attributes[:password] ||= ""
|
|
37
38
|
|
|
@@ -44,9 +45,8 @@ module OpenStack
|
|
|
44
45
|
super(attributes, persisted)
|
|
45
46
|
end
|
|
46
47
|
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
def encode(options={})
|
|
48
|
+
# Overloads ActiveRecord::encode method
|
|
49
|
+
def encode(options={}) #:nodoc: Custom encoding to deal with openstack API
|
|
50
50
|
to_encode = {}
|
|
51
51
|
if token.present?
|
|
52
52
|
to_encode[:auth] = {
|
|
@@ -68,26 +68,33 @@ module OpenStack
|
|
|
68
68
|
to_encode.send("to_#{self.class.format.extension}", options)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
def save
|
|
71
|
+
def save #:nodoc: Catch some exceptions to perform "remote validation" of this resource
|
|
73
72
|
super
|
|
74
73
|
rescue ActiveResource::UnauthorizedAccess
|
|
75
74
|
errors.add :password, I18n.t(:is_invalid)
|
|
76
75
|
return false
|
|
77
76
|
end
|
|
78
77
|
|
|
78
|
+
# Returns the service catalog for current authentication
|
|
79
79
|
def service_catalog
|
|
80
80
|
@attributes[:serviceCatalog].is_a?(Array) ? @attributes[:serviceCatalog] : []
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
+
# Returns the OpenStack::Keystone::Public::Auth::Token instance for current authentication
|
|
83
84
|
def token
|
|
84
85
|
@attributes[:token]
|
|
85
86
|
end
|
|
86
87
|
|
|
88
|
+
# Returns the token_id (string) for current authentication
|
|
87
89
|
def token_id
|
|
88
90
|
token.id if token.present?
|
|
89
91
|
end
|
|
90
92
|
|
|
93
|
+
# Returns the list of endpoint for current authentication and for a given endpoint_type and region
|
|
94
|
+
#
|
|
95
|
+
# ==== Attributes
|
|
96
|
+
# * +endpoint_type+ - The type of endpoint. Currently valid values are: "Compute", "Volume"
|
|
97
|
+
# * +region+ - Restrict the search to given a region (can be omitted)
|
|
91
98
|
def endpoints_for(endpoint_type, region=nil)
|
|
92
99
|
return [] unless service_catalog.present?
|
|
93
100
|
|
|
@@ -105,18 +112,24 @@ module OpenStack
|
|
|
105
112
|
endpoints
|
|
106
113
|
end
|
|
107
114
|
|
|
115
|
+
# Returns the first endpoint for current authentication and for a given endpoint_type and region
|
|
116
|
+
#
|
|
117
|
+
# ==== Attributes
|
|
118
|
+
# * +endpoint_type+ - The type of endpoint. Currently valid values are: "Compute", "Volume"
|
|
119
|
+
# * +region+ - Restrict the search to given a region (can be omitted)
|
|
108
120
|
def endpoint_for(endpoint_type, region=nil)
|
|
109
121
|
endpoints_for(endpoint_type, region)[0]
|
|
110
122
|
end
|
|
111
123
|
|
|
112
124
|
end
|
|
113
125
|
|
|
126
|
+
# Authentication Token
|
|
114
127
|
class Auth::Token < Base
|
|
115
128
|
schema do
|
|
116
129
|
attribute :expires, :string
|
|
117
130
|
end
|
|
118
131
|
|
|
119
|
-
def initialize(attributes = {}, persisted = false)
|
|
132
|
+
def initialize(attributes = {}, persisted = false) #:notnew:
|
|
120
133
|
attributes = attributes.with_indifferent_access
|
|
121
134
|
new_attributes = {
|
|
122
135
|
:id => attributes[:id],
|
|
@@ -126,10 +139,12 @@ module OpenStack
|
|
|
126
139
|
super(new_attributes, persisted)
|
|
127
140
|
end
|
|
128
141
|
|
|
142
|
+
# Expiration date and time for this token
|
|
129
143
|
def expires_at
|
|
130
144
|
DateTime.strptime(attributes[:expires], OpenStack::DATETIME_FORMAT)
|
|
131
145
|
end
|
|
132
146
|
|
|
147
|
+
# True if the token is expired
|
|
133
148
|
def expired?
|
|
134
149
|
DateTime.strptime(attributes[:expires], OpenStack::DATETIME_FORMAT) < DateTime.now.utc
|
|
135
150
|
end
|
|
@@ -21,6 +21,7 @@ module OpenStack
|
|
|
21
21
|
|
|
22
22
|
class Base < OpenStack::Common
|
|
23
23
|
|
|
24
|
+
# Get the Keystone endpoint assigned to OpenStack::Keystone::Public classes
|
|
24
25
|
def self.site
|
|
25
26
|
if self == OpenStack::Keystone::Public::Base
|
|
26
27
|
Thread.current[:open_stack_keystone_public_site]
|
|
@@ -29,6 +30,7 @@ module OpenStack
|
|
|
29
30
|
end
|
|
30
31
|
end
|
|
31
32
|
|
|
33
|
+
# Set the Keystone endpoint assigned to OpenStack::Keystone::Public classes
|
|
32
34
|
def self.site=(site)
|
|
33
35
|
super(site)
|
|
34
36
|
Thread.current[:open_stack_keystone_public_site] = @site
|
|
@@ -19,6 +19,12 @@ module OpenStack
|
|
|
19
19
|
module Keystone
|
|
20
20
|
module Public
|
|
21
21
|
|
|
22
|
+
# An OpenStack Tenant ("public view")
|
|
23
|
+
#
|
|
24
|
+
# ==== Attributes
|
|
25
|
+
# * +name+ - The name of the tenant
|
|
26
|
+
# * +description+ - A description of the tenant
|
|
27
|
+
# * +enabled+ - True if the tenant is enabled
|
|
22
28
|
class Tenant < Base
|
|
23
29
|
|
|
24
30
|
schema do
|
|
@@ -28,7 +34,7 @@ module OpenStack
|
|
|
28
34
|
|
|
29
35
|
end
|
|
30
36
|
|
|
31
|
-
def self.find_every(options)
|
|
37
|
+
def self.find_every(options) #:nodoc:
|
|
32
38
|
class_name = self.name.split('::').last.downcase
|
|
33
39
|
begin
|
|
34
40
|
case from = options[:from]
|
|
@@ -49,12 +55,20 @@ module OpenStack
|
|
|
49
55
|
end
|
|
50
56
|
end
|
|
51
57
|
|
|
58
|
+
# List of tenants with a given name (accessible by the current authenticated user...)
|
|
59
|
+
#
|
|
60
|
+
# ==== Attributes
|
|
61
|
+
# * +name+ - A string
|
|
52
62
|
def self.find_by_name(name)
|
|
53
|
-
|
|
63
|
+
all.detect { |tenant| tenant.name == name }
|
|
54
64
|
end
|
|
55
65
|
|
|
66
|
+
# The first tenant with a given name (accessible by the current authenticated user...)
|
|
67
|
+
#
|
|
68
|
+
# ==== Attributes
|
|
69
|
+
# * +name+ - A string
|
|
56
70
|
def self.find_all_by_name(name)
|
|
57
|
-
|
|
71
|
+
all.reject! { |tenant| tenant.name != name }
|
|
58
72
|
end
|
|
59
73
|
|
|
60
74
|
end
|