ruby-keystone-client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +13 -0
  8. data/README.md +102 -0
  9. data/Rakefile +6 -0
  10. data/lib/keystone/v2_0/client.rb +89 -0
  11. data/lib/keystone/v2_0/manager/base.rb +63 -0
  12. data/lib/keystone/v2_0/manager/endpoint.rb +53 -0
  13. data/lib/keystone/v2_0/manager/role.rb +33 -0
  14. data/lib/keystone/v2_0/manager/service.rb +50 -0
  15. data/lib/keystone/v2_0/manager/tenant.rb +33 -0
  16. data/lib/keystone/v2_0/manager/user.rb +33 -0
  17. data/lib/keystone/v2_0/resource/base.rb +19 -0
  18. data/lib/keystone/v2_0/resource/endpoint.rb +29 -0
  19. data/lib/keystone/v2_0/resource/role.rb +23 -0
  20. data/lib/keystone/v2_0/resource/service.rb +25 -0
  21. data/lib/keystone/v2_0/resource/tenant.rb +23 -0
  22. data/lib/keystone/v2_0/resource/user.rb +25 -0
  23. data/lib/keystone/v2_0/version.rb +5 -0
  24. data/ruby-keystone-client.gemspec +28 -0
  25. data/spec/features/client_spec.rb +63 -0
  26. data/spec/features/manager/base_spec.rb +50 -0
  27. data/spec/features/manager/endpoint_spec.rb +120 -0
  28. data/spec/features/manager/role_spec.rb +44 -0
  29. data/spec/features/manager/service_spec.rb +91 -0
  30. data/spec/features/manager/tenant_spec.rb +42 -0
  31. data/spec/features/manager/user_spec.rb +43 -0
  32. data/spec/features/resource/endpoint_spec.rb +60 -0
  33. data/spec/features/resource/role_spec.rb +42 -0
  34. data/spec/features/resource/service_spec.rb +48 -0
  35. data/spec/features/resource/tenant_spec.rb +42 -0
  36. data/spec/features/resource/user_spec.rb +48 -0
  37. data/spec/spec_helper.rb +14 -0
  38. metadata +177 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 585a295cf2751dee490fe1956e44133bd8ac33e8
4
+ data.tar.gz: c281bd9a20458285b700319faa7ad3bf501820ea
5
+ SHA512:
6
+ metadata.gz: 69780b126eaae6bd00acced9a978e6a5601bdc469437cfd585849b1502edc5e8eded9077e79fd21a1ac9cdc44947ebb0063e386a6f2d7b4641d51c1427067667
7
+ data.tar.gz: ef7d55082aeeb0a962dbcea68f931084e730468dbc704118d827a6d7abbe9a0bc554f152e945c316b07dc37d70f81b75b208c28345cf528ffad799356acd6dfb
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ *.swp
15
+ *.swo
16
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ keystone-client
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby-keystone-client.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2015 Cimpress
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # Keystone::V2_0::Client
2
+
3
+ Ruby client to interact with the OpenStack Keystone identity and
4
+ service catalog service for Version 2.0 of the API.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'ruby-keystone-client'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ ```bash
17
+ bundle
18
+ ```
19
+
20
+ Or install it yourself as:
21
+
22
+ ```bash
23
+ gem install ruby-keystone-client
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ ### Initialization
29
+
30
+ To interface with a Keystone installation, start by requiring the Keystone library:
31
+
32
+ ```bash
33
+ require 'keystone/v2_0/client'
34
+
35
+ => true
36
+ ```
37
+
38
+ Then, establish a connection to the Keystone service with which you wish to interact. For example, this
39
+ Keystone service is installed on localhost running on port 35357, and we are connecting with the following:
40
+
41
+ - Username: admin
42
+ - Password adminpass
43
+ - Tenant: admin
44
+ - Auth URL: http://127.0.0.1:35357/v2.0/
45
+
46
+ ```bash
47
+ ks_client = Keystone::V2_0::Client.new("admin", "adminpass", "admin", "http://127.0.0.1:35357/v2.0/")
48
+
49
+ => #<Keystone::V2_0::Client:0x000000030715b8 @username="admin", @password="adminpass", @tenant_name="admin", @auth_url="http://127.0.0.1:35357/v2.0/", @user_manager=#<Keystone::V2_0::Manager::User:0x00000003071590 @auth_url="http://127.0.0.1:35357/v2.0/", @url_endpoint="users", @json_key="users">, @role_manager=#<Keystone::V2_0::Manager::Role:0x00000003071568 @auth_url="http://127.0.0.1:35357/v2.0/", @url_endpoint="OS-KSADM/roles", @json_key="roles">, @tenant_manager=#<Keystone::V2_0::Manager::Tenant:0x00000003071540 @auth_url="http://127.0.0.1:35357/v2.0/", @url_endpoint="tenants", @json_key="tenants">, @service_manager=#<Keystone::V2_0::Manager::Service:0x000000030714f0 @auth_url="http://127.0.0.1:35357/v2.0/", @url_endpoint="OS-KSADM/services", @json_key="OS-KSADM:services">, @endpoint_manager=#<Keystone::V2_0::Manager::Endpoint:0x000000030714c8 @auth_url="http://127.0.0.1:35357/v2.0/", @url_endpoint="endpoints", @json_key="endpoints">>
50
+ ```
51
+
52
+ Once you have your client "ks", you can continue to query for data within Keystone.
53
+
54
+ ### Tenants
55
+
56
+ To query for tenants within Keystone:
57
+
58
+ ```bash
59
+ ks_client.tenant_interface.list
60
+
61
+ => [#<Keystone::V2_0::Resource::Tenant:0x00000003007398 @description="Admin Tenant", @enabled=true, @id="9958cfb44628476b8f16996e76703292", @name="admin">]
62
+ ```
63
+
64
+ ### Users
65
+
66
+ To query for users within Keystone:
67
+
68
+ ```bash
69
+ ks_client.user_interface.list
70
+
71
+ => [#<Keystone::V2_0::Resource::User:0x0000000309e518 @username="admin", @name="admin", @enabled=true, @email=nil, @id="49f544c6b0d0403b97d90fe0ee0b585f">]
72
+ ```
73
+
74
+ ### Roles
75
+
76
+ To query for roles within Keystone:
77
+
78
+ ```bash
79
+ ks_client.role_interface.list
80
+
81
+ => [#<Keystone::V2_0::Resource::Role:0x0000000303e258 @enabled="True", @description="Default role for project membership", @name="_member_", @id="9fe2ff9ee4384b1894a90878d3e92bab">, #<Keystone::V2_0::Resource::Role:0x0000000303dfd8 @name="admin", @id="e409aeca08b548ceb94ced546e1a4a18">]
82
+ ```
83
+
84
+ ### Endpoints
85
+
86
+ To query for endpoints within Keystone:
87
+
88
+ ```bash
89
+ ks_client.endpoint_interface.list
90
+
91
+ => [#<Keystone::V2_0::Resource::Endpoint:0x000000032add90 @admin_url="http://127.0.0.1:35357/v2.0", @service_id="876fce0975f841fdbebd8352acda75f4", @region="regionOne", @public_url="http://10.11.13.10:5000/v2.0", @enabled=true, @id="a584ab022f0348ab9335fa2468960578", @internal_url="http://10.11.13.10:5000/v2.0">]
92
+ ```
93
+
94
+ ### Services
95
+
96
+ To query for services within Keystone:
97
+
98
+ ```bash
99
+ ks_client.service_interface.list
100
+
101
+ => [#<Keystone::V2_0::Resource::Service:0x00000002f9d628 @id="876fce0975f841fdbebd8352acda75f4", @enabled=true, @type="identity", @name="keystone", @description="Keystone Identity Service">]
102
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,89 @@
1
+ require "keystone/v2_0/version"
2
+ require "keystone/v2_0/manager/user"
3
+ require "keystone/v2_0/manager/role"
4
+ require "keystone/v2_0/manager/tenant"
5
+ require "keystone/v2_0/manager/service"
6
+ require "keystone/v2_0/manager/endpoint"
7
+ require "rest-client"
8
+ require "json"
9
+
10
+ module Keystone
11
+ module V2_0
12
+ class Client
13
+ # client specific attributes
14
+ attr_accessor :username
15
+ attr_accessor :password
16
+ attr_accessor :tenant_name
17
+ attr_accessor :auth_url
18
+
19
+ # query providers
20
+ attr_accessor :user_manager
21
+ attr_accessor :role_manager
22
+ attr_accessor :tenant_manager
23
+ attr_accessor :service_manager
24
+ attr_accessor :endpoint_manager
25
+
26
+ # create a new Keystone client instance with the given credentials
27
+ def initialize(username, password, tenant_name, auth_url)
28
+ # initialize the object
29
+ self.username = username
30
+ self.password = password
31
+ self.tenant_name = tenant_name
32
+ self.auth_url = auth_url
33
+
34
+ # create the initial query managers
35
+ self.user_manager = Keystone::V2_0::Manager::User.new auth_url
36
+ self.role_manager = Keystone::V2_0::Manager::Role.new auth_url
37
+ self.tenant_manager = Keystone::V2_0::Manager::Tenant.new auth_url
38
+ self.service_manager = Keystone::V2_0::Manager::Service.new auth_url
39
+ self.endpoint_manager = Keystone::V2_0::Manager::Endpoint.new auth_url
40
+
41
+ # create the manager methods through which queries will be performed
42
+ # using meta-programming to ensure DRY principle is followed
43
+ [ "users", "roles", "tenants", "services", "endpoints" ].each do |query|
44
+ singular_method = query.sub(/s$/, '')
45
+ self.class.send(:define_method, "#{singular_method}_interface") do
46
+ unless (token = get_token).nil?
47
+ self.send("#{singular_method}_manager").token = token
48
+ return self.send("#{singular_method}_manager")
49
+ else
50
+ raise "An exception has occurred attempting to invoke '#{query}'"
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ # obtain a token for the action being performed
59
+ def get_token
60
+ options = {}
61
+ options[:url] = self.auth_url + "/tokens"
62
+ options[:method] = :post
63
+ options[:headers] = {}
64
+ options[:headers]["User-Agent"] = "keystone-client"
65
+ options[:headers]["Accept"] = "application/json"
66
+ options[:headers]["Content-Type"] = "application/json"
67
+ options[:payload] = { "auth" =>
68
+ { "tenantName" => self.tenant_name,
69
+ "passwordCredentials" =>
70
+ {
71
+ "username" => self.username,
72
+ "password" => self.password
73
+ }
74
+ }
75
+ }.to_json
76
+
77
+ # provide a block to ensure the response is parseable rather than
78
+ # having RestClient throw an exception
79
+ RestClient::Request.execute(options) do |response, request, result|
80
+ if response and response.code == 200
81
+ return JSON.parse(response.body)["access"]["token"]["id"]
82
+ else
83
+ return nil
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,63 @@
1
+ require "rest-client"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Manager
6
+ class Base
7
+ attr_accessor :auth_url
8
+ attr_accessor :url_endpoint
9
+ attr_accessor :token
10
+
11
+ def initialize(auth_url, url_endpoint)
12
+ self.auth_url = auth_url
13
+ self.url_endpoint = url_endpoint
14
+ end
15
+
16
+ protected
17
+
18
+ def list
19
+ options = {}
20
+ options[:url] = "#{self.auth_url.sub(/\/$/, '')}/#{self.url_endpoint}"
21
+ options[:method] = :get
22
+ options[:headers] = {}
23
+ options[:headers]["X-Auth-Token"] = self.token
24
+ options[:headers]["User-Agent"] = "keystone-client"
25
+ options[:headers]["Accept"] = "application/json"
26
+ options[:headers]["Content-Type"] = "application/json"
27
+
28
+ # provide a block to ensure the response is parseable rather than
29
+ # having RestClient throw an exception
30
+ RestClient::Request.execute(options) do |response, request, result|
31
+ if response and response.code == 200
32
+ return JSON.parse(response.body)
33
+ else
34
+ return nil
35
+ end
36
+ end
37
+ end
38
+
39
+ def create(payload)
40
+ options = {}
41
+ options[:url] = "#{self.auth_url.sub(/\/$/, '')}/#{self.url_endpoint}"
42
+ options[:method] = :post
43
+ options[:headers] = {}
44
+ options[:headers]["X-Auth-Token"] = self.token
45
+ options[:headers]["User-Agent"] = "keystone-client"
46
+ options[:headers]["Accept"] = "application/json"
47
+ options[:headers]["Content-Type"] = "application/json"
48
+ options[:payload] = payload
49
+
50
+ # provide a block to ensure the response is parseable rather than
51
+ # having RestClient throw an exception
52
+ RestClient::Request.execute(options) do |response, request, result|
53
+ if response and response.code == 200
54
+ return JSON.parse(response.body)
55
+ else
56
+ return nil
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ require "keystone/v2_0/manager/base"
2
+ require "keystone/v2_0/resource/endpoint"
3
+
4
+ module Keystone
5
+ module V2_0
6
+ module Manager
7
+ class Endpoint < Keystone::V2_0::Manager::Base
8
+ @@url_endpoint = "endpoints"
9
+
10
+ def initialize(auth_url)
11
+ super auth_url, @@url_endpoint
12
+ end
13
+
14
+ def list
15
+ endpoints = super
16
+ endpoint_list = []
17
+
18
+ # map role hash to array of Endpoint objects
19
+ unless endpoints.nil?
20
+ endpoints["endpoints"].each do |endpoint_data|
21
+ endpoint_resource = Keystone::V2_0::Resource::Endpoint.new(endpoint_data)
22
+ endpoint_list << endpoint_resource
23
+ end
24
+
25
+ return endpoint_list
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+
31
+ def create(service_id: '', region: '', admin_url: '', internal_url: '', public_url: '', enabled: true)
32
+ create_key = "endpoint"
33
+ payload = { create_key =>
34
+ { "service_id" => service_id,
35
+ "region" => region,
36
+ "adminurl" => admin_url,
37
+ "internalurl" => internal_url,
38
+ "publicurl" => public_url,
39
+ "enabled" => enabled
40
+ }
41
+ }
42
+ endpoint_data = super(payload.to_json)
43
+
44
+ if endpoint_data and endpoint_data[create_key]
45
+ return Keystone::V2_0::Resource::Endpoint.new(endpoint_data[create_key])
46
+ else
47
+ return nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,33 @@
1
+ require "keystone/v2_0/manager/base"
2
+ require "keystone/v2_0/resource/role"
3
+
4
+ module Keystone
5
+ module V2_0
6
+ module Manager
7
+ class Role < Keystone::V2_0::Manager::Base
8
+ @@url_endpoint = "OS-KSADM/roles"
9
+
10
+ def initialize(auth_url)
11
+ super auth_url, @@url_endpoint
12
+ end
13
+
14
+ def list
15
+ roles = super
16
+ role_list = []
17
+
18
+ # map role hash to array of Role objects
19
+ unless roles.nil?
20
+ roles["roles"].each do |role_data|
21
+ role_resource = Keystone::V2_0::Resource::Role.new(role_data)
22
+ role_list << role_resource
23
+ end
24
+
25
+ return role_list
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,50 @@
1
+ require "keystone/v2_0/manager/base"
2
+ require "keystone/v2_0/resource/service"
3
+
4
+ module Keystone
5
+ module V2_0
6
+ module Manager
7
+ class Service < Keystone::V2_0::Manager::Base
8
+ @@url_endpoint = "OS-KSADM/services"
9
+
10
+ def initialize(auth_url)
11
+ super auth_url, @@url_endpoint
12
+ end
13
+
14
+ def list
15
+ services = super
16
+ service_list = []
17
+
18
+ # map role hash to array of Service objects
19
+ unless services.nil?
20
+ services["OS-KSADM:services"].each do |service_data|
21
+ service_resource = Keystone::V2_0::Resource::Service.new(service_data)
22
+ service_list << service_resource
23
+ end
24
+
25
+ return service_list
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+
31
+ def create(name: '', type: '', description: '')
32
+ create_key = "OS-KSADM:service"
33
+ payload = { create_key =>
34
+ { "name" => name,
35
+ "type" => type,
36
+ "description" => description
37
+ }
38
+ }
39
+ service_data = super(payload.to_json)
40
+
41
+ if service_data and service_data[create_key]
42
+ return Keystone::V2_0::Resource::Service.new(service_data[create_key])
43
+ else
44
+ return nil
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,33 @@
1
+ require "keystone/v2_0/manager/base"
2
+ require "keystone/v2_0/resource/tenant"
3
+
4
+ module Keystone
5
+ module V2_0
6
+ module Manager
7
+ class Tenant < Keystone::V2_0::Manager::Base
8
+ @@url_endpoint = "tenants"
9
+
10
+ def initialize(auth_url)
11
+ super auth_url, @@url_endpoint
12
+ end
13
+
14
+ def list
15
+ tenants = super
16
+ tenant_list = []
17
+
18
+ # map role hash to array of Tenant objects
19
+ unless tenants.nil?
20
+ tenants["tenants"].each do |tenant_data|
21
+ tenant_resource = Keystone::V2_0::Resource::Tenant.new(tenant_data)
22
+ tenant_list << tenant_resource
23
+ end
24
+
25
+ return tenant_list
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require "keystone/v2_0/manager/base"
2
+ require "keystone/v2_0/resource/user"
3
+
4
+ module Keystone
5
+ module V2_0
6
+ module Manager
7
+ class User < Keystone::V2_0::Manager::Base
8
+ @@url_endpoint = "users"
9
+
10
+ def initialize(auth_url)
11
+ super auth_url, @@url_endpoint
12
+ end
13
+
14
+ def list
15
+ users = super
16
+ user_list = []
17
+
18
+ # map user hash to array of User objects
19
+ unless users.nil?
20
+ users["users"].each do |user_data|
21
+ user_resource = Keystone::V2_0::Resource::User.new(user_data)
22
+ user_list << user_resource
23
+ end
24
+
25
+ return user_list
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ require "json"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class Base
7
+ def initialize(data)
8
+ # dynaically assign attributes based on the
9
+ # mappings provided by the subclass
10
+ data.each do |key, val|
11
+ if self.class.attr_mappings.keys.include?(key)
12
+ self.send("#{self.class.attr_mappings[key]}=", data[key])
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require "keystone/v2_0/resource/base"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class Endpoint < Keystone::V2_0::Resource::Base
7
+ attr_accessor :id
8
+ attr_accessor :service_id
9
+ attr_accessor :region
10
+ attr_accessor :admin_url
11
+ attr_accessor :internal_url
12
+ attr_accessor :public_url
13
+ attr_accessor :enabled
14
+
15
+ @@attr_mappings = { "id" => :id,
16
+ "service_id" => :service_id,
17
+ "region" => :region,
18
+ "adminurl" => :admin_url,
19
+ "internalurl" => :internal_url,
20
+ "publicurl" => :public_url,
21
+ "enabled" => :enabled }
22
+
23
+ def self.attr_mappings
24
+ @@attr_mappings
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ require "keystone/v2_0/resource/base"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class Role < Keystone::V2_0::Resource::Base
7
+ attr_accessor :id
8
+ attr_accessor :name
9
+ attr_accessor :description
10
+ attr_accessor :enabled
11
+
12
+ @@attr_mappings = { "id" => :id,
13
+ "name" => :name,
14
+ "description" => :description,
15
+ "enabled" => :enabled }
16
+
17
+ def self.attr_mappings
18
+ @@attr_mappings
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require "keystone/v2_0/resource/base"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class Service < Keystone::V2_0::Resource::Base
7
+ attr_accessor :id
8
+ attr_accessor :name
9
+ attr_accessor :type
10
+ attr_accessor :description
11
+ attr_accessor :enabled
12
+
13
+ @@attr_mappings = { "id" => :id,
14
+ "name" => :name,
15
+ "type" => :type,
16
+ "description" => :description,
17
+ "enabled" => :enabled }
18
+
19
+ def self.attr_mappings
20
+ @@attr_mappings
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ require "keystone/v2_0/resource/base"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class Tenant < Keystone::V2_0::Resource::Base
7
+ attr_accessor :id
8
+ attr_accessor :name
9
+ attr_accessor :description
10
+ attr_accessor :enabled
11
+
12
+ @@attr_mappings = { "id" => :id,
13
+ "name" => :name,
14
+ "description" => :description,
15
+ "enabled" => :enabled }
16
+
17
+ def self.attr_mappings
18
+ @@attr_mappings
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require "keystone/v2_0/resource/base"
2
+
3
+ module Keystone
4
+ module V2_0
5
+ module Resource
6
+ class User < Keystone::V2_0::Resource::Base
7
+ attr_accessor :id
8
+ attr_accessor :username
9
+ attr_accessor :name
10
+ attr_accessor :enabled
11
+ attr_accessor :email
12
+
13
+ @@attr_mappings = { "id" => :id,
14
+ "username" => :username,
15
+ "name" => :name,
16
+ "enabled" => :enabled,
17
+ "email" => :email }
18
+
19
+ def self.attr_mappings
20
+ @@attr_mappings
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end