td-client 0.8.20 → 0.8.21

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/ChangeLog CHANGED
@@ -1,4 +1,10 @@
1
1
 
2
+ == 2012-08-06 version 0.8.21
3
+
4
+ * Added multiuser features: organizations, users, roles
5
+ * Added access control
6
+
7
+
2
8
  == 2012-07-23 version 0.8.20
3
9
 
4
10
  * Implemented Zlib::GzipReader#readpartial for compatibility with ruby 1.8
@@ -285,6 +285,118 @@ class Client
285
285
  @api.delete_result(name)
286
286
  end
287
287
 
288
+ # => [Organization]
289
+ def organizations
290
+ list = @api.list_organizations
291
+ list.map {|name|
292
+ Organization.new(self, name)
293
+ }
294
+ end
295
+
296
+ # => true
297
+ def create_organization(organization)
298
+ @api.create_organization(organization)
299
+ end
300
+
301
+ # => true
302
+ def delete_organization(organization)
303
+ @api.delete_organization(organization)
304
+ end
305
+
306
+ # => [Role]
307
+ def roles
308
+ list = @api.list_roles
309
+ list.map {|name,org,users|
310
+ Role.new(self, name, org, users)
311
+ }
312
+ end
313
+
314
+ # => true
315
+ def create_role(role, org)
316
+ @api.create_role(role, org)
317
+ end
318
+
319
+ # => true
320
+ def delete_role(role)
321
+ @api.delete_role(role)
322
+ end
323
+
324
+ # => true
325
+ def grant_role(role, user)
326
+ @api.grant_role(role, user)
327
+ end
328
+
329
+ # => true
330
+ def revoke_role(role, user)
331
+ @api.revoke_role(role, user)
332
+ end
333
+
334
+ # => [User]
335
+ def users
336
+ list = @api.list_users
337
+ list.map {|name,org,roles,email|
338
+ User.new(self, name, org, roles, email)
339
+ }
340
+ end
341
+
342
+ # => true
343
+ def add_user(user, org)
344
+ @api.add_user(user, org)
345
+ end
346
+
347
+ # => true
348
+ def remove_user(user)
349
+ @api.remove_user(user)
350
+ end
351
+
352
+ # => true
353
+ def change_email(user, email)
354
+ @api.change_email(user, email)
355
+ end
356
+
357
+ # => [apikey:String]
358
+ def list_apikeys(user)
359
+ @api.list_apikeys(user)
360
+ end
361
+
362
+ # => true
363
+ def add_apikey(user)
364
+ @api.add_apikey(user)
365
+ end
366
+
367
+ # => true
368
+ def remove_apikey(user, apikey)
369
+ @api.remove_apikey(user, apikey)
370
+ end
371
+
372
+ # => true
373
+ def change_password(user, password)
374
+ @api.change_password(user, password)
375
+ end
376
+
377
+ # => [User]
378
+ def access_controls
379
+ list = @api.list_access_controls
380
+ list.map {|subject,action,scope,grant_option|
381
+ AccessControl.new(self, subject, action, scope, grant_option)
382
+ }
383
+ end
384
+
385
+ # => true
386
+ def grant_access_control(subject, action, scope, grant_option)
387
+ @api.grant_access_control(subject, action, scope, grant_option)
388
+ end
389
+
390
+ # => true
391
+ def revoke_access_control(subject, action, scope)
392
+ @api.revoke_access_control(subject, action, scope)
393
+ end
394
+
395
+ # => true
396
+ def test_access_control(user, action, scope)
397
+ @api.test_access_control(user, action, scope)
398
+ end
399
+
288
400
  # => [AggregationSchema]
289
401
  def aggregation_schemas
290
402
  list = @api.list_aggregation_schema
@@ -852,6 +852,101 @@ class API
852
852
  end
853
853
 
854
854
 
855
+ ####
856
+ ## Organization API
857
+ ##
858
+
859
+ # => [name:String]
860
+ def list_organizations
861
+ code, body, res = get("/v3/organization/list")
862
+ if code != "200"
863
+ raise_error("List aggregation schema failed", res)
864
+ end
865
+ js = checked_json(body, %w[organizations])
866
+ result = js["organizations"].map {|orginfo|
867
+ name = orginfo['name'].to_s
868
+ name
869
+ }
870
+ return result
871
+ end
872
+
873
+ # => true
874
+ def create_organization(org)
875
+ code, body, res = post("/v3/organization/create/#{e org}")
876
+ if code != "200"
877
+ raise_error("Creating organization failed", res)
878
+ end
879
+ return true
880
+ end
881
+
882
+ # => true
883
+ def delete_organization(org)
884
+ code, body, res = post("/v3/organization/delete/#{e org}")
885
+ if code != "200"
886
+ raise_error("Deleting organization failed", res)
887
+ end
888
+ return true
889
+ end
890
+
891
+
892
+ ####
893
+ ## Role API
894
+ ##
895
+
896
+ # => [[name:String,organization:String,[user:String]]]
897
+ def list_roles
898
+ code, body, res = get("/v3/role/list")
899
+ if code != "200"
900
+ raise_error("List roles failed", res)
901
+ end
902
+ js = checked_json(body, %w[roles])
903
+ result = js["roles"].map {|roleinfo|
904
+ name = roleinfo['name']
905
+ organization = roleinfo['organization']
906
+ users = roleinfo['users']
907
+ [name, organization, users]
908
+ }
909
+ return result
910
+ end
911
+
912
+ # => true
913
+ def create_role(role, org)
914
+ params = {'organization'=>org}
915
+ code, body, res = post("/v3/role/create/#{e role}", params)
916
+ if code != "200"
917
+ raise_error("Creating role failed", res)
918
+ end
919
+ return true
920
+ end
921
+
922
+ # => true
923
+ def delete_role(role)
924
+ code, body, res = post("/v3/role/delete/#{e role}")
925
+ if code != "200"
926
+ raise_error("Creating role failed", res)
927
+ end
928
+ return true
929
+ end
930
+
931
+ # => true
932
+ def grant_role(role, user)
933
+ code, body, res = post("/v3/role/grant/#{e role}/#{e user}")
934
+ if code != "200"
935
+ raise_error("Granting role failed", res)
936
+ end
937
+ return true
938
+ end
939
+
940
+ # => true
941
+ def revoke_role(role, user)
942
+ code, body, res = post("/v3/role/revoke/#{e role}/#{e user}")
943
+ if code != "200"
944
+ raise_error("Revoking role failed", res)
945
+ end
946
+ return true
947
+ end
948
+
949
+
855
950
  ####
856
951
  ## User API
857
952
  ##
@@ -871,6 +966,150 @@ class API
871
966
  return apikey
872
967
  end
873
968
 
969
+ # => [[name:String,organization:String,[user:String]]
970
+ def list_users
971
+ code, body, res = get("/v3/user/list")
972
+ if code != "200"
973
+ raise_error("List aggregation schema failed", res)
974
+ end
975
+ js = checked_json(body, %w[users])
976
+ result = js["users"].map {|roleinfo|
977
+ name = roleinfo['name']
978
+ organization = roleinfo['organization']
979
+ roles = roleinfo['roles']
980
+ email = roleinfo['email']
981
+ [name, organization, roles, email]
982
+ }
983
+ return result
984
+ end
985
+
986
+ # => true
987
+ def add_user(user, org)
988
+ params = {'organization'=>org}
989
+ code, body, res = post("/v3/user/add/#{e user}", params)
990
+ if code != "200"
991
+ raise_error("Adding user failed", res)
992
+ end
993
+ return true
994
+ end
995
+
996
+ # => true
997
+ def remove_user(user)
998
+ code, body, res = post("/v3/user/remove/#{e user}")
999
+ if code != "200"
1000
+ raise_error("Removing user failed", res)
1001
+ end
1002
+ return true
1003
+ end
1004
+
1005
+ # => true
1006
+ def change_email(user, email)
1007
+ params = {'email' => email}
1008
+ code, body, res = post("/v3/user/email/change/#{e user}", params)
1009
+ if code != "200"
1010
+ raise_error("Changing email failed", res)
1011
+ end
1012
+ return true
1013
+ end
1014
+
1015
+ # => [apikey:String]
1016
+ def list_apikeys(user)
1017
+ code, body, res = get("/v3/user/apikey/list/#{e user}")
1018
+ if code != "200"
1019
+ raise_error("List API keys failed", res)
1020
+ end
1021
+ js = checked_json(body, %w[apikeys])
1022
+ return js['apikeys']
1023
+ end
1024
+
1025
+ # => true
1026
+ def add_apikey(user)
1027
+ code, body, res = post("/v3/user/apikey/add/#{e user}")
1028
+ if code != "200"
1029
+ raise_error("Adding API key failed", res)
1030
+ end
1031
+ return true
1032
+ end
1033
+
1034
+ # => true
1035
+ def remove_apikey(user, apikey)
1036
+ params = {'apikey' => apikey}
1037
+ code, body, res = post("/v3/user/apikey/remove/#{e user}", params)
1038
+ if code != "200"
1039
+ raise_error("Removing API key failed", res)
1040
+ end
1041
+ return true
1042
+ end
1043
+
1044
+ # => true
1045
+ def change_password(user, password)
1046
+ params = {'password' => password}
1047
+ code, body, res = post("/v3/user/password/change/#{e user}", params)
1048
+ if code != "200"
1049
+ raise_error("Changing password failed", res)
1050
+ end
1051
+ return true
1052
+ end
1053
+
1054
+
1055
+ ####
1056
+ ## Access Control API
1057
+ ##
1058
+
1059
+ def grant_access_control(subject, action, scope, grant_option)
1060
+ params = {'subject'=>subject, 'action'=>action, 'scope'=>scope, 'grant_option'=>grant_option.to_s}
1061
+ code, body, res = post("/v3/acl/grant", params)
1062
+ if code != "200"
1063
+ raise_error("Granting access control failed", res)
1064
+ end
1065
+ return true
1066
+ end
1067
+
1068
+ def revoke_access_control(subject, action, scope)
1069
+ params = {'subject'=>subject, 'action'=>action, 'scope'=>scope}
1070
+ code, body, res = post("/v3/acl/revoke", params)
1071
+ if code != "200"
1072
+ raise_error("Revoking access control failed", res)
1073
+ end
1074
+ return true
1075
+ end
1076
+
1077
+ # [true, [{subject:String,action:String,scope:String}]]
1078
+ def test_access_control(user, action, scope)
1079
+ params = {'user'=>user, 'action'=>action, 'scope'=>scope}
1080
+ code, body, res = get("/v3/acl/test", params)
1081
+ if code != "200"
1082
+ raise_error("Testing access control failed", res)
1083
+ end
1084
+ js = checked_json(body, %w[permission access_controls])
1085
+ perm = js["permission"]
1086
+ acl = js["access_controls"].map {|roleinfo|
1087
+ subject = roleinfo['subject']
1088
+ action = roleinfo['action']
1089
+ scope = roleinfo['scope']
1090
+ [name, action, scope]
1091
+ }
1092
+ return perm, acl
1093
+ end
1094
+
1095
+ # [{subject:String,action:String,scope:String}]
1096
+ def list_access_controls
1097
+ code, body, res = get("/v3/acl/list")
1098
+ if code != "200"
1099
+ raise_error("Listing access control failed", res)
1100
+ end
1101
+ js = checked_json(body, %w[access_controls])
1102
+ acl = js["access_controls"].map {|roleinfo|
1103
+ subject = roleinfo['subject']
1104
+ action = roleinfo['action']
1105
+ scope = roleinfo['scope']
1106
+ grant_option = roleinfo['grant_option']
1107
+ [subject, action, scope, grant_option]
1108
+ }
1109
+ return acl
1110
+ end
1111
+
1112
+
874
1113
  ####
875
1114
  ## Server Status API
876
1115
  ##
@@ -886,6 +1125,7 @@ class API
886
1125
  return status
887
1126
  end
888
1127
 
1128
+
889
1129
  private
890
1130
  def get(url, params=nil, &block)
891
1131
  http, header = new_http
@@ -376,6 +376,54 @@ class BulkImport < Model
376
376
  end
377
377
 
378
378
 
379
+ class Organization < Model
380
+ def initialize(client, name)
381
+ super(client)
382
+ @name = name
383
+ end
384
+
385
+ attr_reader :client, :name
386
+ end
387
+
388
+
389
+ class Role < Model
390
+ def initialize(client, name, org_name, user_names)
391
+ super(client)
392
+ @name = name
393
+ @org_name = org_name
394
+ @user_names = user_names
395
+ end
396
+
397
+ attr_reader :client, :name, :org_name, :user_names
398
+ end
399
+
400
+
401
+ class User < Model
402
+ def initialize(client, name, org_name, role_names, email)
403
+ super(client)
404
+ @name = name
405
+ @org_name = org_name
406
+ @role_names = role_names
407
+ @email = email
408
+ end
409
+
410
+ attr_reader :client, :name, :org_name, :role_names, :email
411
+ end
412
+
413
+
414
+ class AccessControl < Model
415
+ def initialize(client, subject, action, scope, grant_option)
416
+ super(client)
417
+ @subject = subject
418
+ @action = action
419
+ @scope = scope
420
+ @grant_option = grant_option
421
+ end
422
+
423
+ attr_reader :subject, :action, :scope, :grant_option
424
+ end
425
+
426
+
379
427
  class AggregationSchema < Model
380
428
  def initialize(client, name, relation_key, logs=nil, attributes=nil, timezone=nil)
381
429
  super(client)
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.8.20'
3
+ VERSION = '0.8.21'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.20
4
+ version: 0.8.21
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-24 00:00:00.000000000 Z
12
+ date: 2012-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack