k2hr3-api 1.0.42 → 2.0.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.
Files changed (149) hide show
  1. package/config/k2hr3-init.sh.templ +2 -2
  2. package/dist/.gitkeep +0 -0
  3. package/dist/src/app.js +262 -0
  4. package/{bin → dist/src/bin}/run.sh +1 -1
  5. package/dist/src/bin/watcher.js +113 -0
  6. package/dist/src/bin/www.js +217 -0
  7. package/dist/src/lib/basicipcheck.js +392 -0
  8. package/dist/src/lib/cacerts.js +106 -0
  9. package/dist/src/lib/dbglogging.js +190 -0
  10. package/dist/src/lib/dummyuserapi.js +719 -0
  11. package/dist/src/lib/ipwatch.js +354 -0
  12. package/dist/src/lib/k2hr3acrutil.js +532 -0
  13. package/dist/src/lib/k2hr3apiutil.js +1444 -0
  14. package/dist/src/lib/k2hr3cliutil.js +183 -0
  15. package/dist/src/lib/k2hr3config.js +832 -0
  16. package/dist/src/lib/k2hr3cryptutil.js +258 -0
  17. package/dist/src/lib/k2hr3dkc.js +12121 -0
  18. package/dist/src/lib/k2hr3extdata.js +198 -0
  19. package/dist/src/lib/k2hr3keys.js +207 -0
  20. package/dist/src/lib/k2hr3resutil.js +111 -0
  21. package/dist/src/lib/k2hr3template.js +6546 -0
  22. package/dist/src/lib/k2hr3tokens.js +2643 -0
  23. package/dist/src/lib/k2hr3userdata.js +296 -0
  24. package/dist/src/lib/k8soidc.js +1000 -0
  25. package/dist/src/lib/openstackapiv2.js +695 -0
  26. package/dist/src/lib/openstackapiv3.js +932 -0
  27. package/dist/src/lib/openstackep.js +667 -0
  28. package/{tests/auto_common.js → dist/src/lib/types.js} +4 -38
  29. package/dist/src/routes/acr.js +704 -0
  30. package/dist/src/routes/debugVerify.js +294 -0
  31. package/dist/src/routes/extdata.js +219 -0
  32. package/dist/src/routes/list.js +264 -0
  33. package/dist/src/routes/policy.js +840 -0
  34. package/dist/src/routes/resource.js +1489 -0
  35. package/dist/src/routes/role.js +2627 -0
  36. package/dist/src/routes/service.js +908 -0
  37. package/dist/src/routes/tenant.js +1141 -0
  38. package/dist/src/routes/userTokens.js +482 -0
  39. package/dist/src/routes/userdata.js +212 -0
  40. package/dist/src/routes/version.js +103 -0
  41. package/package.json +152 -121
  42. package/ChangeLog +0 -378
  43. package/app.js +0 -292
  44. package/bin/watcher +0 -122
  45. package/bin/www +0 -180
  46. package/eslint.config.mjs +0 -68
  47. package/lib/basicipcheck.js +0 -376
  48. package/lib/cacerts.js +0 -71
  49. package/lib/dbglogging.js +0 -151
  50. package/lib/dummyuserapi.js +0 -766
  51. package/lib/ipwatch.js +0 -379
  52. package/lib/k2hr3acrutil.js +0 -516
  53. package/lib/k2hr3apiutil.js +0 -1494
  54. package/lib/k2hr3cliutil.js +0 -191
  55. package/lib/k2hr3config.js +0 -826
  56. package/lib/k2hr3cryptutil.js +0 -254
  57. package/lib/k2hr3dkc.js +0 -12632
  58. package/lib/k2hr3extdata.js +0 -198
  59. package/lib/k2hr3keys.js +0 -234
  60. package/lib/k2hr3resutil.js +0 -100
  61. package/lib/k2hr3template.js +0 -6925
  62. package/lib/k2hr3tokens.js +0 -2799
  63. package/lib/k2hr3userdata.js +0 -312
  64. package/lib/k8soidc.js +0 -1012
  65. package/lib/openstackapiv2.js +0 -764
  66. package/lib/openstackapiv3.js +0 -1032
  67. package/lib/openstackep.js +0 -553
  68. package/routes/acr.js +0 -738
  69. package/routes/debugVerify.js +0 -263
  70. package/routes/extdata.js +0 -232
  71. package/routes/list.js +0 -270
  72. package/routes/policy.js +0 -869
  73. package/routes/resource.js +0 -1441
  74. package/routes/role.js +0 -2664
  75. package/routes/service.js +0 -894
  76. package/routes/tenant.js +0 -1095
  77. package/routes/userTokens.js +0 -511
  78. package/routes/userdata.js +0 -218
  79. package/routes/version.js +0 -108
  80. package/templ/Dockerfile.templ +0 -71
  81. package/tests/auto_acr.js +0 -1101
  82. package/tests/auto_acr_spec.js +0 -79
  83. package/tests/auto_all_spec.js +0 -142
  84. package/tests/auto_control_subprocess.sh +0 -243
  85. package/tests/auto_extdata.js +0 -220
  86. package/tests/auto_extdata_spec.js +0 -79
  87. package/tests/auto_init_config_json.sh +0 -275
  88. package/tests/auto_k2hdkc_server.ini +0 -109
  89. package/tests/auto_k2hdkc_slave.ini +0 -83
  90. package/tests/auto_list.js +0 -439
  91. package/tests/auto_list_spec.js +0 -79
  92. package/tests/auto_policy.js +0 -1579
  93. package/tests/auto_policy_spec.js +0 -79
  94. package/tests/auto_resource.js +0 -10956
  95. package/tests/auto_resource_spec.js +0 -79
  96. package/tests/auto_role.js +0 -6150
  97. package/tests/auto_role_spec.js +0 -79
  98. package/tests/auto_service.js +0 -770
  99. package/tests/auto_service_spec.js +0 -79
  100. package/tests/auto_subprocesses.js +0 -114
  101. package/tests/auto_template.sh +0 -126
  102. package/tests/auto_tenant.js +0 -1100
  103. package/tests/auto_tenant_spec.js +0 -79
  104. package/tests/auto_token_util.js +0 -219
  105. package/tests/auto_userdata.js +0 -292
  106. package/tests/auto_userdata_spec.js +0 -79
  107. package/tests/auto_usertokens.js +0 -565
  108. package/tests/auto_usertokens_spec.js +0 -79
  109. package/tests/auto_version.js +0 -127
  110. package/tests/auto_version_spec.js +0 -79
  111. package/tests/auto_watcher.js +0 -157
  112. package/tests/auto_watcher_spec.js +0 -79
  113. package/tests/k2hdkc_test.data +0 -986
  114. package/tests/k2hdkc_test_load.sh +0 -255
  115. package/tests/k2hr3template_test.js +0 -187
  116. package/tests/k2hr3template_test.sh +0 -339
  117. package/tests/k2hr3template_test_async.js +0 -216
  118. package/tests/k2hr3template_test_template.result +0 -7117
  119. package/tests/k2hr3template_test_template.txt +0 -3608
  120. package/tests/k2hr3template_test_vars.js +0 -194
  121. package/tests/manual_acr_delete.js +0 -143
  122. package/tests/manual_acr_get.js +0 -297
  123. package/tests/manual_acr_postput.js +0 -215
  124. package/tests/manual_allusertenant_get.js +0 -113
  125. package/tests/manual_extdata_get.js +0 -191
  126. package/tests/manual_k2hr3keys_get.js +0 -84
  127. package/tests/manual_list_gethead.js +0 -230
  128. package/tests/manual_policy_delete.js +0 -132
  129. package/tests/manual_policy_gethead.js +0 -275
  130. package/tests/manual_policy_postput.js +0 -297
  131. package/tests/manual_resource_delete.js +0 -433
  132. package/tests/manual_resource_gethead.js +0 -423
  133. package/tests/manual_resource_postput.js +0 -487
  134. package/tests/manual_role_delete.js +0 -404
  135. package/tests/manual_role_gethead.js +0 -547
  136. package/tests/manual_role_postput.js +0 -544
  137. package/tests/manual_service_delete.js +0 -153
  138. package/tests/manual_service_gethead.js +0 -178
  139. package/tests/manual_service_postput.js +0 -348
  140. package/tests/manual_tenant_delete.js +0 -186
  141. package/tests/manual_tenant_gethead.js +0 -268
  142. package/tests/manual_tenant_postput.js +0 -293
  143. package/tests/manual_test.sh +0 -352
  144. package/tests/manual_userdata_get.js +0 -173
  145. package/tests/manual_usertoken_gethead.js +0 -136
  146. package/tests/manual_usertoken_postput.js +0 -310
  147. package/tests/manual_version_get.js +0 -127
  148. package/tests/run_local_test_k2hdkc.sh +0 -174
  149. package/tests/test.sh +0 -333
package/routes/tenant.js DELETED
@@ -1,1095 +0,0 @@
1
- /*
2
- * K2HR3 REST API
3
- *
4
- * Copyright 2023 Yahoo Japan Corporation.
5
- *
6
- * K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
7
- * common management information for the cloud.
8
- * K2HR3 can dynamically manage information as "who", "what", "operate".
9
- * These are stored as roles, resources, policies in K2hdkc, and the
10
- * client system can dynamically read and modify these information.
11
- *
12
- * For the full copyright and license information, please view
13
- * the license file that was distributed with this source code.
14
- *
15
- * AUTHOR: Takeshi Nakatani
16
- * CREATE: Mon Sep 3 2023
17
- * REVISION:
18
- *
19
- */
20
-
21
- 'use strict';
22
-
23
- var express = require('express');
24
- var router = express.Router();
25
-
26
- var r3token = require('../lib/k2hr3tokens');
27
- var apiutil = require('../lib/k2hr3apiutil');
28
- var resutil = require('../lib/k2hr3resutil');
29
- var k2hr3 = require('../lib/k2hr3dkc');
30
- var r3keys = require('../lib/k2hr3keys').getK2hr3Keys;
31
-
32
- // Debug logging objects
33
- var r3logger = require('../lib/dbglogging');
34
-
35
- //=========================================================
36
- // CAUTION
37
- //---------------------------------------------------------
38
- // This note is common to the TENANT API.
39
- //
40
- // TENANT API requires User Unscoped Token or User Scoped
41
- // Token.
42
- // Note that even if a User Scoped Token is specified, that
43
- // scoped Tenant will be ignored.
44
- // To specify the tenant of each API, use URI path or parameter
45
- // instead of Token.
46
- // Specify the tenant only by the tenant name, not by the YRN
47
- // full path.
48
- //
49
- //---------------------------------------------------------
50
-
51
- //=========================================================
52
- // Common Utility function
53
- //=========================================================
54
- //
55
- // Utility for parsing common input parameters
56
- //
57
- // This function parse token(user or role or not have this) from HTTP request(req),
58
- // and tenant name, etc.
59
- //
60
- // return {
61
- // result: true/false
62
- // message: null or error message
63
- // status_code: status code(default 200)
64
- // parameters: {
65
- // token_type: null or 'user' or 'role'
66
- // token_str: token string(if user token or role token)
67
- // token_info: null or object(returned from checkToken)
68
- // user_name: null or user name(if user token)
69
- // tenant_name: null or tenant name in request uri path
70
- // keys: k2hr3keys object
71
- // }
72
- // }
73
- //
74
- function rawParseBaseParamInRequest(req)
75
- {
76
- var result = {
77
- result: true,
78
- message: null,
79
- status_code: 200
80
- };
81
- var parameters = {
82
- token_type: null,
83
- token_str: null,
84
- token_info: null,
85
- token_tenant: null,
86
- user_name: null,
87
- tenant_name: null,
88
- keys: r3keys() // temporary
89
- };
90
-
91
- //
92
- // check token for API mode
93
- //
94
- if(r3token.hasAuthTokenHeader(req)){
95
- var token_result = r3token.checkToken(req, false, true); // (un)scoped, user
96
- if(!token_result.result){
97
- result.result = token_result.result;
98
- result.message = token_result.message;
99
- result.status_code = token_result.status;
100
- r3logger.elog(result.message);
101
- return result;
102
- }
103
- parameters.token_str = token_result.token;
104
- parameters.token_type = token_result.token_type;
105
- parameters.token_info = token_result.token_info;
106
- parameters.user_name = apiutil.getSafeString(parameters.token_info.user);
107
- }
108
-
109
- //
110
- // get tenant name from uri
111
- //
112
- var requestptn = new RegExp('^/v1/tenant/(.*)'); // regex = /^\/v1\/tenant\/(.*)/
113
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
114
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
115
- parameters.tenant_name = null;
116
- }else{
117
- // check tenant name
118
- if(0 !== reqmatchs[1].indexOf(parameters.keys.VALUE_PREFIX_LOCAL_TENANT)){
119
- // Not have prefix("local@")
120
- parameters.tenant_name = parameters.keys.VALUE_PREFIX_LOCAL_TENANT + reqmatchs[1];
121
- parameters.tenant_name = parameters.tenant_name.toLowerCase();
122
- }else{
123
- parameters.tenant_name = reqmatchs[1].toLowerCase();
124
- }
125
- }
126
-
127
- // keys
128
- parameters.keys = r3keys(parameters.user_name, parameters.tenant_name);
129
-
130
- // no error
131
- result.parameters = parameters;
132
-
133
- return result;
134
- }
135
-
136
- //
137
- // Utility for Create/Update tenant for POST/PUT
138
- //
139
- // is_create : true/false
140
- // user_name : add main user name for tenant
141
- // tenant_name : tenant name
142
- // tenant_id : tenant id
143
- // tenant_desc : tenant description
144
- // tenant_display : tenant display name
145
- // tenant_users : other tenant user names
146
- //
147
- // result {
148
- // result: true/false
149
- // message: error message
150
- // rescode: 200/201/4xx/5xx
151
- // }
152
- //
153
- function rawCreateUpdateTenant(is_create, user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users)
154
- {
155
- var result = {result: true, message: null, rescode: 200};
156
- var resobj;
157
-
158
- if(is_create){
159
- //
160
- // Create tenant
161
- //
162
- resobj = k2hr3.findTenant(tenant_name);
163
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.result) && true === resobj.result){
164
- result.result = false;
165
- result.message = 'failed to create tenant by already tenant(' + tenant_name + ') existed';
166
- result.rescode = 400;
167
- r3logger.elog(result.message);
168
- return result;
169
- }
170
- result.rescode = 201; // 201: Created
171
- }else{
172
- //
173
- // Update tenant
174
- //
175
- resobj = k2hr3.findTenant(tenant_name, user_name, tenant_id);
176
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
177
- result.result = false;
178
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
179
- result.message = 'failed to update tenant by ' + resobj.message;
180
- }else{
181
- result.message = 'failed to update tenant by unknown reason';
182
- }
183
- result.rescode = 400;
184
- r3logger.elog(result.message);
185
- return result;
186
- }
187
- result.rescode = 200; // 200: OK
188
- }
189
-
190
- //
191
- // Create/Update tenant
192
- //
193
- resobj = k2hr3.initTenant(tenant_name, tenant_id, tenant_desc, tenant_display, user_name, tenant_users);
194
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
195
- result.result = false;
196
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
197
- result.message = 'failed to create tenant by ' + resobj.message;
198
- }else{
199
- result.message = 'failed to create tenant by unknown reason';
200
- }
201
- result.rescode = 400;
202
- r3logger.elog(result.message);
203
- return result;
204
- }
205
-
206
- return result;
207
- }
208
-
209
- //=========================================================
210
- // Router POST
211
- //=========================================================
212
- //
213
- // Mountpath : '/v1/tenant'
214
- //
215
- //---------------------------------------------------------
216
- // [POST] No tenant path
217
- //---------------------------------------------------------
218
- // POST '/v1/tenant' : create tenant version 1
219
- // HEADER : X-Auth-Token = <User token>
220
- // body : {
221
- // "tenant": {
222
- // "name": <tenant> => key is "yrn:yahoo:::<tenant>"
223
- // thix value type must be string.
224
- // "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
225
- // thix value type must be string.
226
- // "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
227
- // thix value type must be string.
228
- // "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
229
- // specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
230
- // }
231
- // }
232
- //
233
- // response status code : 201 or 4xx/5xx
234
- // response body : {
235
- // result: true/false
236
- // message: messages
237
- // }
238
- //
239
- // Create a tenant as <K2HR3 cluster LOCAL> tenant.
240
- //
241
- // [NOTE]
242
- // If the <K2HR3 cluster LOCAL> tenant already exists, this repsponses an error.
243
- //
244
- // Tenant names must start with "local@"(if not set it, this prefix adds automatically).
245
- // Specify the user by YRN full path or user name.
246
- // If the user indicated by <User Token> does not exist, it will be added.
247
- // New tenant id is set automatically.
248
- //
249
- //---------------------------------------------------------
250
- // [POST] With tenant path
251
- //---------------------------------------------------------
252
- // POST '/v1/tenant/tenant' : update tenant version 1
253
- // HEADER : X-Auth-Token = <User token>
254
- // body : {
255
- // "tenant": {
256
- // "id": <id> => key is "yrn:yahoo:::<tenant>:id"
257
- // this value type must be string.
258
- // "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
259
- // thix value type must be string.
260
- // "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
261
- // thix value type must be string.
262
- // "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
263
- // specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
264
- // }
265
- // }
266
- //
267
- // response status code : 200 or 4xx/5xx
268
- // response body : {
269
- // result: true/false
270
- // message: messages
271
- // }
272
- //
273
- // Update existed tenant as <K2HR3 cluster LOCAL> tenant.
274
- //
275
- // [NOTE]
276
- // If the <K2HR3 cluster LOCAL> tenant does not exist, this repsponses an error.
277
- // Tenant names must start with "local@"(if not set it, this prefix adds automatically for search).
278
- // The <User Token> user must be included in the tenant's user list.
279
- //
280
- // Specify the user by YRN full path or user name.
281
- // If the user indicated by <User Token> does not exist, it will be added.
282
- //
283
- router.post('/', function(req, res, next) // eslint-disable-line no-unused-vars
284
- {
285
- r3logger.dlog('CALL:', req.method, req.url);
286
-
287
- res.type('application/json; charset=utf-8');
288
-
289
- var result = {result: true, message: null};
290
-
291
- if( !apiutil.isSafeEntity(req) ||
292
- !apiutil.isSafeEntity(req.baseUrl) ||
293
- !apiutil.isSafeEntity(req.body) ||
294
- !apiutil.isSafeEntity(req.body.tenant) )
295
- {
296
- result.result = false;
297
- result.message = 'POST body does not have tenant data';
298
- r3logger.elog(result.message);
299
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
300
- return;
301
- }
302
-
303
- //------------------------------
304
- // check common parameters(token, tenant etc)
305
- //------------------------------
306
- var resobj = rawParseBaseParamInRequest(req);
307
- if(!resobj.result){
308
- result.result = resobj.result;
309
- result.message = resobj.message;
310
- r3logger.elog(resobj.message);
311
- resutil.errResponse(req, res, resobj.status_code, result);
312
- return;
313
- }
314
- var comparam = resobj.parameters;
315
-
316
- //------------------------------
317
- // check token type
318
- //------------------------------
319
- if('user' !== comparam.token_type){
320
- result.result = false;
321
- result.message = 'POST request tenant must specify <User Token>';
322
- r3logger.elog(result.message);
323
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
324
- return;
325
- }
326
-
327
- //------------------------------
328
- // check arguments
329
- //------------------------------
330
- var is_create = true;
331
- var tenant_name = null;
332
- var tenant_id = null;
333
- var tenant_desc = null;
334
- var tenant_display = null;
335
- var tenant_users = null;
336
-
337
- if(!apiutil.isSafeString(comparam.tenant_name)){
338
- //
339
- // Create mode
340
- //
341
- is_create = true;
342
- tenant_name = apiutil.getSafeString(req.body.tenant.name).toLowerCase();
343
- tenant_id = apiutil.getStrUuid4(); // Create new id here.
344
-
345
- if(!apiutil.isSafeString(tenant_name)){
346
- result.result = false;
347
- result.message = 'POST request tenant body does not have tenant.name string object.';
348
- r3logger.elog(result.message);
349
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
350
- return;
351
- }
352
- if(0 !== tenant_name.indexOf(comparam.keys.VALUE_PREFIX_LOCAL_TENANT)){
353
- // Not have prefix("local@")
354
- tenant_name = comparam.keys.VALUE_PREFIX_LOCAL_TENANT + tenant_name;
355
- }
356
- }else{
357
- //
358
- // Update mode
359
- //
360
- is_create = false;
361
- tenant_name = comparam.tenant_name;
362
- tenant_id = apiutil.getSafeString(req.body.tenant.id);
363
- if(!apiutil.isSafeString(tenant_id)){
364
- result.result = false;
365
- result.message = 'POST request tenant(' + tenant_name + ') body does not have tenant.id string object.';
366
- r3logger.elog(result.message);
367
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
368
- return;
369
- }
370
- }
371
-
372
- if(apiutil.isSafeString(req.body.tenant.desc)){
373
- tenant_desc = apiutil.getSafeString(req.body.tenant.desc);
374
- }else{
375
- tenant_desc = 'K2HR3 Cluster Local tenant';
376
- }
377
-
378
- if(apiutil.isSafeString(req.body.tenant.display)){
379
- tenant_display = apiutil.getSafeString(req.body.tenant.display);
380
- }else{
381
- tenant_display = tenant_name;
382
- }
383
-
384
- //
385
- // Check users
386
- //
387
- if(apiutil.getSafeString(req.body.tenant.users)){
388
- tenant_users = [req.body.tenant.users.trim()];
389
- }else{
390
- tenant_users = apiutil.getSafeArray(req.body.tenant.users);
391
- }
392
- if(is_create){
393
- // add own user
394
- apiutil.tryAddStringToArray(tenant_users, comparam.user_name);
395
- }else{
396
- if(apiutil.isEmptyArray(tenant_users)){
397
- result.result = false;
398
- result.message = 'POST request tenant(' + tenant_name + ') does not have any user list.';
399
- r3logger.elog(result.message);
400
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
401
- return;
402
- }
403
-
404
- var findobj = k2hr3.findTenant(tenant_name, comparam.user_name, tenant_id);
405
- if( !apiutil.isSafeEntity(findobj) ||
406
- !apiutil.isSafeEntity(findobj.result) ||
407
- false === findobj.result ||
408
- !apiutil.isSafeEntity(findobj.tenant) ||
409
- !apiutil.isSafeEntity(findobj.tenant.name) ||
410
- !apiutil.getSafeArray(findobj.tenant.users) ||
411
- !apiutil.findStringInArray(findobj.tenant.users, comparam.user_name) )
412
- {
413
- result.result = false;
414
- result.message = 'POST request tenant(' + tenant_name + ') does not allow user(' + comparam.user_name + ').';
415
- r3logger.elog(result.message);
416
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
417
- return;
418
- }
419
- }
420
- if(apiutil.isArray(tenant_users)){
421
- tenant_users.sort();
422
- }
423
-
424
- //------------------------------
425
- // Processing
426
- //------------------------------
427
- resobj = rawCreateUpdateTenant(is_create, comparam.user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users);
428
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.rescode) || false === resobj.result){
429
- result.result = false;
430
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
431
- result.message = 'POST request failed to update tenant by ' + resobj.message;
432
- }else{
433
- result.message = 'POST request failed to update tenant by unknown reason';
434
- }
435
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.rescode)){
436
- resutil.errResponse(req, res, resobj.rescode, result);
437
- }else{
438
- resutil.errResponse(req, res, 500, result); // 500: Internal error
439
- }
440
- r3logger.elog(result.message);
441
- return;
442
- }
443
-
444
- r3logger.dlog('succeed : create/update tenant(' + tenant_name + ') by user(' + comparam.user_name + ')');
445
- res.status(resobj.rescode); // 200 or 201
446
- res.send(JSON.stringify(result));
447
- });
448
-
449
- //=========================================================
450
- // Router PUT
451
- //=========================================================
452
- //
453
- // Mountpath : '/v1/tenant'
454
- //
455
- //---------------------------------------------------------
456
- // [PUT] No tenant path
457
- //---------------------------------------------------------
458
- // PUT '/v1/tenant' : create tenant version 1
459
- // HEADER : X-Auth-Token = <User token>
460
- // url argument :
461
- // "name": <tenant> => key is "yrn:yahoo:::<tenant>"
462
- // <tenant> must include the prefix "R3CLUSTERLOCAL-".
463
- // "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
464
- // thix value type must be string.
465
- // "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
466
- // thix value type must be string.
467
- // "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
468
- // specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
469
- //
470
- // response status code : 201 or 4xx/5xx
471
- // response body : {
472
- // result: true/false
473
- // message: messages
474
- // }
475
- //
476
- // Create a tenant as <K2HR3 cluster LOCAL> tenant.
477
- //
478
- // [NOTE]
479
- // If the <K2HR3 cluster LOCAL> tenant already exists, this repsponses an error.
480
- //
481
- // Tenant names must start with "R3CLUSTERLOCAL-".
482
- // Specify the user by YRN full path or user name.
483
- // If the user indicated by <User Token> does not exist, it will be added.
484
- // New tenant id("R3CLUSTERLOCAL-xxxxxx") is set automatically.
485
- //
486
- //---------------------------------------------------------
487
- // [PUT] With tenant path
488
- //---------------------------------------------------------
489
- // PUT '/v1/tenant/tenant' : update tenant version 1
490
- // HEADER : X-Auth-Token = <User token>
491
- // url argument :
492
- // "id": <id> => key is "yrn:yahoo:::<tenant>:id"
493
- // this value type must be string.
494
- // "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
495
- // thix value type must be string.
496
- // "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
497
- // thix value type must be string.
498
- // "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
499
- // specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
500
- //
501
- // response status code : 200 or 4xx/5xx
502
- // response body : {
503
- // result: true/false
504
- // message: messages
505
- // }
506
- //
507
- // Update existed tenant as <K2HR3 cluster LOCAL> tenant.
508
- //
509
- // [NOTE]
510
- // If the <K2HR3 cluster LOCAL> tenant does not exist, this repsponses an error.
511
- // The <User Token> user must be included in the tenant's user list.
512
- //
513
- // Specify the user by YRN full path or user name.
514
- // If the user indicated by <User Token> does not exist, it will be added.
515
- //
516
- router.put('/', function(req, res, next) // eslint-disable-line no-unused-vars
517
- {
518
- r3logger.dlog('CALL:', req.method, req.url);
519
-
520
- res.type('application/json; charset=utf-8');
521
-
522
- var result = {result: true, message: null};
523
-
524
- if( !apiutil.isSafeEntity(req) ||
525
- !apiutil.isSafeEntity(req.baseUrl) ||
526
- !apiutil.isSafeEntity(req.query) )
527
- {
528
- result.result = false;
529
- result.message = 'PUT request is something wrong';
530
- r3logger.elog(result.message);
531
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
532
- return;
533
- }
534
-
535
- //------------------------------
536
- // check common parameters(token, tenant etc)
537
- //------------------------------
538
- var resobj = rawParseBaseParamInRequest(req);
539
- if(!resobj.result){
540
- result.result = resobj.result;
541
- result.message = resobj.message;
542
- r3logger.elog(resobj.message);
543
- resutil.errResponse(req, res, resobj.status_code, result);
544
- return;
545
- }
546
- var comparam = resobj.parameters;
547
-
548
- //------------------------------
549
- // check token type
550
- //------------------------------
551
- if('user' !== comparam.token_type){
552
- result.result = false;
553
- result.message = 'PUT request tenant must specify <User Token>';
554
- r3logger.elog(result.message);
555
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
556
- return;
557
- }
558
-
559
- //------------------------------
560
- // check arguments
561
- //------------------------------
562
- var is_create = true;
563
- var tenant_name = null;
564
- var tenant_id = null;
565
- var tenant_desc = null;
566
- var tenant_display = null;
567
- var tenant_users = null;
568
-
569
- if(!apiutil.isSafeString(comparam.tenant_name)){
570
- //
571
- // Create mode
572
- //
573
- is_create = true;
574
- tenant_name = apiutil.getSafeString(req.query.name).toLowerCase();
575
- tenant_id = apiutil.getStrUuid4(); // Create new id here.
576
-
577
- if(!apiutil.isSafeString(tenant_name)){
578
- result.result = false;
579
- result.message = 'PUT request tenant body does not have tenant.name string object.';
580
- r3logger.elog(result.message);
581
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
582
- return;
583
- }
584
- if(0 !== tenant_name.indexOf(comparam.keys.VALUE_PREFIX_LOCAL_TENANT)){
585
- // Not have prefix("local@")
586
- tenant_name = comparam.keys.VALUE_PREFIX_LOCAL_TENANT + tenant_name;
587
- }
588
- }else{
589
- //
590
- // Update mode
591
- //
592
- is_create = false;
593
- tenant_name = comparam.tenant_name;
594
- tenant_id = apiutil.getSafeString(req.query.id);
595
- if(!apiutil.isSafeString(tenant_id)){
596
- result.result = false;
597
- result.message = 'PUT request tenant(' + tenant_name + ') body does not have tenant.id string object.';
598
- r3logger.elog(result.message);
599
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
600
- return;
601
- }
602
- }
603
-
604
- if(apiutil.isSafeString(req.query.desc)){
605
- tenant_desc = apiutil.getSafeString(req.query.desc);
606
- }else{
607
- tenant_desc = 'K2HR3 Cluster Local tenant';
608
- }
609
-
610
- if(apiutil.isSafeString(req.query.display)){
611
- tenant_display = apiutil.getSafeString(req.query.display);
612
- }else{
613
- tenant_display = tenant_name;
614
- }
615
-
616
- //
617
- // Check users
618
- //
619
- if(apiutil.checkSimpleJSON(req.query.users)){
620
- tenant_users = apiutil.parseJSON(req.query.users);
621
- if(!apiutil.isArray(tenant_users) && apiutil.isSafeString(tenant_users)){
622
- tenant_users = [tenant_users];
623
- }else{
624
- tenant_users = apiutil.getSafeArray(tenant_users);
625
- }
626
- }else if(!apiutil.isArray(req.query.users) && apiutil.isSafeString(req.query.users)){
627
- tenant_users = [req.query.users];
628
- }else{
629
- tenant_users = apiutil.getSafeArray(req.query.users);
630
- }
631
-
632
- if(is_create){
633
- // add own user
634
- apiutil.tryAddStringToArray(tenant_users, comparam.user_name);
635
- }else{
636
- // check user in current tenant users
637
- if(apiutil.isEmptyArray(tenant_users)){
638
- result.result = false;
639
- result.message = 'PUT request tenant(' + tenant_name + ') does not have any user list.';
640
- r3logger.elog(result.message);
641
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
642
- return;
643
- }
644
-
645
- var findobj = k2hr3.findTenant(tenant_name, comparam.user_name, tenant_id);
646
- if( !apiutil.isSafeEntity(findobj) ||
647
- !apiutil.isSafeEntity(findobj.result) ||
648
- false === findobj.result ||
649
- !apiutil.isSafeEntity(findobj.tenant) ||
650
- !apiutil.isSafeEntity(findobj.tenant.name) ||
651
- !apiutil.getSafeArray(findobj.tenant.users) ||
652
- !apiutil.findStringInArray(findobj.tenant.users, comparam.user_name) )
653
- {
654
- result.result = false;
655
- result.message = 'PUT request tenant(' + tenant_name + ') does not allow user(' + comparam.user_name + ').';
656
- r3logger.elog(result.message);
657
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
658
- return;
659
- }
660
- }
661
- if(apiutil.isArray(tenant_users)){
662
- tenant_users.sort();
663
- }
664
-
665
- //------------------------------
666
- // Processing
667
- //------------------------------
668
- resobj = rawCreateUpdateTenant(is_create, comparam.user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users);
669
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.rescode) || false === resobj.result){
670
- result.result = false;
671
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
672
- result.message = 'PUT request failed to update tenant by ' + resobj.message;
673
- }else{
674
- result.message = 'PUT request failed to update tenant by unknown reason';
675
- }
676
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.rescode)){
677
- resutil.errResponse(req, res, resobj.rescode, result);
678
- }else{
679
- resutil.errResponse(req, res, 500, result); // 500: Internal error
680
- }
681
- r3logger.elog(result.message);
682
- return;
683
- }
684
-
685
- r3logger.dlog('succeed : create/update tenant(' + tenant_name + ') by user(' + comparam.user_name + ')');
686
- res.status(resobj.rescode); // 200 or 201
687
- res.send(JSON.stringify(result));
688
- });
689
-
690
- //=========================================================
691
- // Router GET
692
- //=========================================================
693
- //
694
- // Mountpath : '/v1/tenant{/tenant}'
695
- //
696
- //---------------------------------------------------------
697
- // [GET] No tenant path
698
- //---------------------------------------------------------
699
- // GET '/v1/tenant' : get tenant list version 1
700
- // HEADER : X-Auth-Token = <User token>
701
- // URL arguments : expand = "true"(default) or "false"
702
- // response status code : 200 or 4xx/5xx
703
- // response : nothing
704
- // response body : {
705
- // result: true/false,
706
- // message: null or error message string
707
- // tenants: [
708
- // {
709
- // name: "string",
710
- // id: "string",
711
- // desc: "string",
712
- // display: "string",
713
- // user: array[users...]
714
- // },
715
- // ...
716
- // ]
717
- // }
718
- // or
719
- // {
720
- // result: true/false,
721
- // message: null or error message string
722
- // tenants: [
723
- // "tenant",
724
- // ...
725
- // ]
726
- // }
727
- //
728
- // This mount point retrieves a list of tenants and information about each.
729
- //
730
- //---------------------------------------------------------
731
- // [GET] With tenant path
732
- //---------------------------------------------------------
733
- // GET '/v1/tenant/<tenant>' : get tenant information on version 1
734
- // HEADER : X-Auth-Token = <User token>
735
- // URL arguments : nothing
736
- // response status code : 200 or 4xx/5xx
737
- // response : nothing
738
- // response body : {
739
- // result: true/false,
740
- // message: null or error message string
741
- // tenant: {
742
- // name: "string",
743
- // id: "string",
744
- // desc: "string",
745
- // display: "string",
746
- // user: array[users...]
747
- // }
748
- // }
749
- //
750
- router.get('/', function(req, res, next)
751
- {
752
- r3logger.dlog('CALL:', req.method, req.url);
753
-
754
- if('GET' !== req.method){
755
- // HEAD request comes here, so it should be routed to head function.
756
- next();
757
- return;
758
- }
759
-
760
- res.type('application/json; charset=utf-8');
761
-
762
- var result = {result: true, message: null};
763
-
764
- if( !apiutil.isSafeEntity(req) ||
765
- !apiutil.isSafeEntity(req.baseUrl) )
766
- {
767
- result.result = false;
768
- result.message = 'GET request is something wrong';
769
- r3logger.elog(result.message);
770
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
771
- return;
772
- }
773
-
774
- //------------------------------
775
- // check common parameters(token, tenant etc)
776
- //------------------------------
777
- var resobj = rawParseBaseParamInRequest(req);
778
- if(!resobj.result){
779
- result.result = resobj.result;
780
- result.message = resobj.message;
781
- r3logger.elog(resobj.message);
782
- resutil.errResponse(req, res, resobj.status_code, result);
783
- return;
784
- }
785
- var comparam = resobj.parameters;
786
-
787
- //------------------------------
788
- // check token type
789
- //------------------------------
790
- if('user' !== comparam.token_type){
791
- result.result = false;
792
- result.message = 'GET request tenant must specify <User Token>';
793
- r3logger.elog(result.message);
794
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
795
- return;
796
- }
797
-
798
- //------------------------------
799
- // Processing
800
- //------------------------------
801
- if(!apiutil.isSafeString(comparam.tenant_name)){
802
- //
803
- // List mode
804
- //
805
- var keys = r3keys(comparam.user_name);
806
-
807
- //
808
- // Check expand type
809
- //
810
- var is_expand = true;
811
- if(apiutil.isSafeEntity(req.query) && apiutil.isSafeString(req.query.expand)){
812
- if(apiutil.compareCaseString(keys.VALUE_TRUE, req.query.expand)){
813
- is_expand = true;
814
- }else if(apiutil.compareCaseString(keys.VALUE_FALSE, req.query.expand)){
815
- is_expand = false;
816
- }else{
817
- result.result = false;
818
- result.message = 'GET expand url argument parameter(' + JSON.stringify(req.query.expand) + ') is wrong, it must be ' + keys.VALUE_TRUE + ' or ' + keys.VALUE_FALSE + '.';
819
- r3logger.elog(result.message);
820
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
821
- return;
822
- }
823
- }
824
-
825
- //
826
- // Get list
827
- //
828
- resobj = k2hr3.listLocalTenant(comparam.user_name, is_expand);
829
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isArray(resobj.tenants) || false === resobj.result){
830
- result.result = false;
831
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
832
- result.message = 'GET request failed to update tenant by ' + resobj.message;
833
- }else{
834
- result.message = 'GET request failed to update tenant by unknown reason';
835
- }
836
- r3logger.elog(result.message);
837
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
838
- return;
839
- }
840
- result.tenants = resobj.tenants;
841
-
842
- }else{
843
- //
844
- // One tenant
845
- //
846
- resobj = k2hr3.findTenant(comparam.tenant_name);
847
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.tenant) || false === resobj.result){
848
- result.result = false;
849
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
850
- result.message = 'GET request failed to update tenant by ' + resobj.message;
851
- }else{
852
- result.message = 'GET request failed to update tenant by unknown reason';
853
- }
854
- r3logger.elog(result.message);
855
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
856
- return;
857
- }
858
- result.tenant = resobj.tenant;
859
- }
860
-
861
- r3logger.dlog('succeed : get tenant(s) by user(' + comparam.user_name + ')');
862
- res.status(200); // 200: OK
863
- res.send(JSON.stringify(result));
864
- });
865
-
866
- //=========================================================
867
- // Router HEAD
868
- //=========================================================
869
- //
870
- // Mountpath : '/v1/tenant/tenant'
871
- //
872
- // HEAD '/v1/tenant/<tenant>' : head tenant on version 1
873
- // HEADER : X-Auth-Token = <User token>
874
- // response status code : 204 or 4xx/5xx
875
- // response body : nothing
876
- //
877
- // This mount point is an API for checking the existence of a tenant.
878
- // If the tenant is given, this returns a 204 if that tenant exists and is allowed to be seen.
879
- // If no tenant is given, returns 204 if at least one target tenant exists.
880
- //
881
- router.head('/', function(req, res, next)
882
- {
883
- r3logger.dlog('CALL:', req.method, req.url);
884
-
885
- if('HEAD' !== req.method){
886
- // If other method request comes here, so it should be routed another function.
887
- next();
888
- return;
889
- }
890
- res.type('application/json; charset=utf-8');
891
-
892
- if( !apiutil.isSafeEntity(req) ||
893
- !apiutil.isSafeEntity(req.baseUrl) )
894
- {
895
- r3logger.elog('HEAD request is something wrong');
896
- resutil.errResponse(req, res, 400); // 400: Bad Request
897
- return;
898
- }
899
-
900
- //------------------------------
901
- // check common parameters(token, tenant etc)
902
- //------------------------------
903
- var resobj = rawParseBaseParamInRequest(req);
904
- if(!resobj.result){
905
- r3logger.elog(resobj.message);
906
- resutil.errResponse(req, res, resobj.status_code);
907
- return;
908
- }
909
- var comparam = resobj.parameters;
910
-
911
- //------------------------------
912
- // check token type
913
- //------------------------------
914
- if('user' !== comparam.token_type){
915
- r3logger.elog('HEAD request tenant must specify <User Token>');
916
- resutil.errResponse(req, res, 400); // 400: Bad Request
917
- return;
918
- }
919
-
920
- //------------------------------
921
- // Check uri paths(tenant name)
922
- //------------------------------
923
- if(!apiutil.isSafeString(comparam.tenant_name)){
924
- r3logger.elog('HEAD request tenant must specify <tenant> path');
925
- resutil.errResponse(req, res, 400); // 400: Bad Request
926
- return;
927
- }
928
-
929
- //------------------------------
930
- // Processing
931
- //------------------------------
932
- resobj = k2hr3.findTenant(comparam.tenant_name);
933
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.tenant) || false === resobj.result){
934
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
935
- r3logger.elog('HEAD request failed to update tenant by ' + resobj.message);
936
- }else{
937
- r3logger.elog('HEAD request failed to update tenant by unknown reason');
938
- }
939
- resutil.errResponse(req, res, 400); // 400: Bad Request
940
- return;
941
- }
942
-
943
- r3logger.dlog('HEAD request succeed - check tenant(' + comparam.tenant_name + ') exists');
944
- res.status(204); // 204: No Content
945
- res.send();
946
- });
947
-
948
- //=========================================================
949
- // Router DELETE
950
- //=========================================================
951
- //
952
- // Mountpath : '/v1/tenant'
953
- //
954
- //---------------------------------------------------------
955
- // [DELETE] No tenant path
956
- //---------------------------------------------------------
957
- // DELETE '/v1/tenant' : delete tenant version 1
958
- // HEADER : X-Auth-Token = <User token>
959
- // url argument : "tenant" = <tenant name>
960
- // url argument : "id" = <id> => key is "yrn:yahoo:::<tenant>:id"
961
- // response status code : 204 or 4xx/5xx
962
- // response body : nothing
963
- //
964
- // This mount point deletes the specified <K2HR3 cluster LOCAL> tenant.
965
- //
966
- //---------------------------------------------------------
967
- // [DELETE] With tenant path
968
- //---------------------------------------------------------
969
- // DELETE '/v1/tenant/tenant' : delete tenant version 1
970
- // HEADER : X-Auth-Token = <User token>
971
- // url argument : "id" = <id> => key is "yrn:yahoo:::<tenant>:id"
972
- // response status code : 204 or 4xx/5xx
973
- // response body : nothing
974
- //
975
- // This mount point deletes the specified <K2HR3 cluster LOCAL> tenant.
976
- //
977
- // [NOTE]
978
- // Only users registered in the tenant to be deleted can delete this tenant.
979
- //
980
- router.delete('/', function(req, res, next) // eslint-disable-line no-unused-vars
981
- {
982
- r3logger.dlog('CALL:', req.method, req.url);
983
-
984
- res.type('application/json; charset=utf-8');
985
-
986
- if( !apiutil.isSafeEntity(req) ||
987
- !apiutil.isSafeEntity(req.baseUrl) )
988
- {
989
- r3logger.elog('DELETE request or url or query is wrong');
990
- resutil.errResponse(req, res, 400); // 400: Bad Request
991
- return;
992
- }
993
-
994
- //------------------------------
995
- // check common parameters(token, tenant etc)
996
- //------------------------------
997
- var resobj = rawParseBaseParamInRequest(req);
998
- if(!resobj.result){
999
- r3logger.elog(resobj.message);
1000
- resutil.errResponse(req, res, resobj.status_code);
1001
- return;
1002
- }
1003
- var comparam = resobj.parameters;
1004
-
1005
- //------------------------------
1006
- // check token type
1007
- //------------------------------
1008
- if('user' !== comparam.token_type){
1009
- r3logger.elog('DELETE request tenant must specify <User Token>');
1010
- resutil.errResponse(req, res, 400); // 400: Bad Request
1011
- return;
1012
- }
1013
-
1014
- //------------------------------
1015
- // Check uri paths
1016
- //------------------------------
1017
- var tenant_name;
1018
- var tenant_id;
1019
- if(!apiutil.isSafeString(comparam.tenant_name)){
1020
- //------------------------------
1021
- // Check argments(tenant)
1022
- //------------------------------
1023
- tenant_name = apiutil.getSafeString(req.query.tenant);
1024
- if(!apiutil.isSafeString(tenant_name)){
1025
- r3logger.elog('DELETE request tenant must specify in argument');
1026
- resutil.errResponse(req, res, 400); // 400: Bad Request
1027
- return;
1028
- }
1029
-
1030
- //------------------------------
1031
- // Check argments(id)
1032
- //------------------------------
1033
- tenant_id = apiutil.getSafeString(req.query.id);
1034
- if(!apiutil.isSafeString(tenant_id)){
1035
- r3logger.elog('DELETE request id must specify in argument');
1036
- resutil.errResponse(req, res, 400); // 400: Bad Request
1037
- return;
1038
- }
1039
-
1040
- //------------------------------
1041
- // Processing
1042
- //------------------------------
1043
- resobj = k2hr3.removeLocalTenant(tenant_name, comparam.user_name, tenant_id);
1044
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
1045
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
1046
- r3logger.elog('DELETE request failed to remove user from tenant by ' + resobj.message);
1047
- }else{
1048
- r3logger.elog('DELETE request failed to remove user from tenant by unknown reason');
1049
- }
1050
- resutil.errResponse(req, res, 400); // 400: Bad Request
1051
- return;
1052
- }
1053
- r3logger.dlog('DELETE request succeed - remove tenant');
1054
-
1055
- }else{
1056
- //------------------------------
1057
- // Check argments(id)
1058
- //------------------------------
1059
- tenant_id = apiutil.getSafeString(req.query.id);
1060
- if(!apiutil.isSafeString(tenant_id)){
1061
- r3logger.elog('DELETE request id must specify in argument');
1062
- resutil.errResponse(req, res, 400); // 400: Bad Request
1063
- return;
1064
- }
1065
-
1066
- //------------------------------
1067
- // Processing
1068
- //------------------------------
1069
- resobj = k2hr3.removeUserFromLocalTenant(comparam.tenant_name, comparam.user_name, tenant_id);
1070
- if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
1071
- if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
1072
- r3logger.elog('DELETE request failed to remove user from tenant by ' + resobj.message);
1073
- }else{
1074
- r3logger.elog('DELETE request failed to remove user from tenant by unknown reason');
1075
- }
1076
- resutil.errResponse(req, res, 400); // 400: Bad Request
1077
- return;
1078
- }
1079
- r3logger.dlog('DELETE request succeed - remove user from tenant');
1080
- }
1081
-
1082
- res.status(204); // 204: No Content
1083
- res.send();
1084
- });
1085
-
1086
- module.exports = router;
1087
-
1088
- /*
1089
- * Local variables:
1090
- * tab-width: 4
1091
- * c-basic-offset: 4
1092
- * End:
1093
- * vim600: noexpandtab sw=4 ts=4 fdm=marker
1094
- * vim<600: noexpandtab sw=4 ts=4
1095
- */