Compare commits

...

374 Commits

Author SHA1 Message Date
Marco Lettere eda7375677 enable deploy of user-group-role-created 2024-04-03 10:34:16 +02:00
Marco Lettere d43557f275 remove array accessor 2024-04-03 10:32:38 +02:00
Marco Lettere 88ac5e5233 fixed typo 2023-12-06 19:21:43 +01:00
Marco Lettere 9efc8caabe re-enable all workflows 2023-12-02 19:33:07 +01:00
Marco Lettere e5fe4ee663 translated policy_perm script to ansible 2023-11-22 17:20:51 +01:00
Marco Lettere 037a06cbb1 fixed JS bugs 2023-10-18 16:45:53 +02:00
Marco Lettere a60d6e2e41 fixed typo 2023-10-18 15:58:19 +02:00
Marco Lettere bfaf8ebabb fixed typo 2023-10-18 15:55:59 +02:00
Marco Lettere 0e2b9ef289 added one more check to avoid loosing data 2023-10-18 15:11:07 +02:00
Marco Lettere 0181349228 fixed transformation to array 2023-10-18 14:18:27 +02:00
Marco Lettere 9c22c6f617 modernized create_vre, create_vre_folder_for_context, record_context_to_is 2023-10-13 12:14:18 +02:00
Marco Lettere 6fbdb2d7bb modernized create_vre, create_vre_folder_for_context, record_context_to_is 2023-10-13 12:11:41 +02:00
Marco Lettere 900fa993ba modernized all the ghn workflows 2023-10-13 11:24:19 +02:00
Marco Lettere ab1010c417 modernized create_workspace_client and add_workspace_clients_tocontext 2023-10-13 10:26:34 +02:00
Marco Lettere e0028de1f0 modernized system_service workflows 2023-10-13 10:11:34 +02:00
Marco Lettere 2d953718c0 modernized system_service workflows 2023-10-13 09:58:38 +02:00
Marco Lettere 3febc0751b modernized group_created, group_deleted, jupyterhub_add_resources and enable_workspace_clients_for_context 2023-10-12 19:55:46 +02:00
Marco Lettere d775a774f9 modernize group_created and deleted 2023-10-12 18:49:07 +02:00
Marco Lettere 584b3ef940 modernize add_all_member_roles 2023-10-12 18:27:37 +02:00
Marco Lettere e648baf5bd modernize delete-user-account 2023-10-12 18:19:14 +02:00
Marco Lettere 35ce4dc32e modernize create-user-add-to-vre 2023-10-12 18:10:44 +02:00
Marco Lettere 021304f651 modernize create-user-add-to-vre 2023-10-12 18:07:10 +02:00
Marco Lettere 6599eca219 modernize create-user-add-to-vre 2023-10-12 18:00:15 +02:00
Marco Lettere 4e046ad847 modernize role_created and role_deleted workflows and add_role_policy_permission 2023-10-12 17:03:41 +02:00
Marco Lettere 746998fafd modernize role_created and role_deleted workflows and add_role_policy_permission 2023-10-12 17:02:35 +02:00
Marco Lettere cb677a7924 modernize role_created and role_deleted workflows and add_role_policy_permission 2023-10-12 17:00:28 +02:00
Marco Lettere 09494eb668 modernize role_created and role_deleted workflows 2023-10-12 16:43:37 +02:00
Marco Lettere f6e3e0f250 modernize group_add/delete and invitation accepted 2023-10-12 16:21:59 +02:00
Marco Lettere 730c7f7f43 modernize group_add/delete and invitation accepted 2023-10-12 16:19:02 +02:00
Marco Lettere 488fa4bff7 modernize group_add/delete and invitation accepted 2023-10-12 16:17:14 +02:00
Marco Lettere 4ac9f1189b modernize group_add/delete and invitation accepted 2023-10-12 16:12:04 +02:00
Marco Lettere 8196cf0cc6 modernize group_add/delete and invitation accepted 2023-10-12 16:08:29 +02:00
Marco Lettere 0a54a69bda modernize group_add/delete and invitation accepted 2023-10-12 15:54:44 +02:00
Marco Lettere 4f6b9698f5 modernize group_add/delete and invitation accepted 2023-10-12 15:45:11 +02:00
Marco Lettere 1927fe6df8 modernize group_add/delete and invitation accepted 2023-10-12 15:36:39 +02:00
Marco Lettere 8a798e72d5 modernize group_add/delete and invitation accepted 2023-10-12 15:35:23 +02:00
Marco Lettere 6514aa22f6 modernize group_add/delete and invitation accepted 2023-10-12 15:34:08 +02:00
Marco Lettere b1e27b9891 modernize group_add/delete and invitation accepted 2023-10-12 15:32:32 +02:00
Marco Lettere e0a5c8beac moved from decision to switch for compatibility with new conductor 2023-10-12 15:14:30 +02:00
Marco Lettere 1ed26efdb8 moved from decision to switch for compatibility with new conductor 2023-10-12 15:09:59 +02:00
Marco Lettere 8c032509b2 moved from decision to switch for compatibility with new conductor 2023-10-12 15:04:07 +02:00
Marco Lettere 47a09e155d moved from decision to switch for compatibility with new conductor 2023-10-12 15:01:51 +02:00
Marco Lettere 7ca6e1e022 moved from decision to switch for compatibility with new conductor 2023-10-12 14:43:17 +02:00
Marco Lettere 7dadef708e moved from decision to switch for compatibility with new conductor 2023-10-12 14:15:42 +02:00
Marco Lettere 347476e792 moved from decision to switch for compatibility with new conductor 2023-10-12 14:13:43 +02:00
Marco Lettere 787d1d7272 moved from decision to switch for compatibility with new conductor 2023-10-12 14:12:18 +02:00
Marco Lettere f0c3e9ab12 moved from decision to switch for compatibility with new conductor 2023-10-12 14:08:23 +02:00
Marco Lettere d61e893a8b moved from decision to switch for compatibility with new conductor 2023-10-12 13:33:11 +02:00
Marco Lettere bd35f5aded moved from decision to switch for compatibility with new conductor 2023-10-12 13:20:45 +02:00
Marco Lettere 20025bad84 moved from decision to switch for compatibility with new conductor 2023-10-12 12:55:23 +02:00
Marco Lettere 0f593d5b8d moved from decision to switch for compatibility with new conductor 2023-10-12 12:49:36 +02:00
Marco Lettere de4416c842 moved from decision to switch for compatibility with new conductor 2023-10-12 12:48:22 +02:00
Marco Lettere b6b49d4500 moved from decision to switch for compatibility with new conductor 2023-10-12 12:44:51 +02:00
Marco Lettere 2cf8a62be4 enable publish of all wfs 2023-10-10 13:32:52 +02:00
Marco Lettere a719a05734 fixed 2023-07-24 15:44:34 +02:00
Marco Lettere 064c554c25 fixed issues and add first member additions 2023-07-24 15:37:45 +02:00
Marco Lettere c8ba9dc1cc correctly renamed workflow 2023-07-24 15:13:38 +02:00
Marco Lettere 8f3901216a enable deployment of create_vre 2023-07-24 15:11:17 +02:00
Marco Lettere ce3ef27b17 added new workflow create_vre and modified create_vre_folder to set also admins 2023-07-24 15:10:36 +02:00
Marco Lettere 94c9eeeda7 fixed query to extract correct infrastructure id 2023-07-18 16:38:49 +02:00
Marco Lettere 5b308bf8cd fixed url to IS 2023-07-18 14:56:46 +02:00
Marco Lettere f54792e117 fixed ET find and corrected validation code 2023-07-18 13:19:47 +02:00
Marco Lettere 1306b1bdfe added ID extraction and check 2023-07-18 12:33:27 +02:00
Marco Lettere 2cc42d9e6d fix minor issues 2023-07-18 12:13:58 +02:00
Marco Lettere ce66259343 added queries to IC proxy 2023-07-18 11:02:42 +02:00
Marco Lettere 517ced19c6 new taskdef for multipart/form-data 2023-07-17 17:41:52 +02:00
Marco Lettere 66d00bd06b added back root_vo 2023-07-14 16:15:07 +02:00
Marco Lettere 00782d90e1 fixed workflow 2023-07-14 16:11:13 +02:00
Marco Lettere 0846edfb75 added missing comma 2023-07-13 17:30:47 +02:00
Marco Lettere 9dc0af9e73 enable deploy of only new workflows 2023-07-13 17:22:29 +02:00
Marco Lettere 6a6fbca118 added two new subworkflows of group_created 2023-07-13 17:20:01 +02:00
Marco Lettere ec6969f626 enabled all workflows 2023-06-19 18:23:59 +02:00
Marco Lettere 4d1021f699 upload only invitation accepted 2023-05-16 18:44:22 +02:00
Marco Lettere 5a01d339ca accept 409 for avoiding unnecessary reexecutions 2023-05-16 18:40:28 +02:00
Marco Lettere 46234973e8 deploy all 2023-03-02 18:18:03 +01:00
Marco Lettere e66f146432 replaced hardcoded value with variable 2023-01-13 12:23:33 +01:00
Marco Lettere 37c7bdb070 anticipated group creation even more 2023-01-12 18:05:39 +01:00
Marco Lettere c0a770c864 anticipated group creation even more 2023-01-12 18:04:49 +01:00
Marco Lettere 6f94ff6125 anticipated group creation even more 2023-01-12 18:03:39 +01:00
Marco Lettere 5d6a17d2f5 multiple reinforced authorize for reducing expiration risks 2023-01-12 17:33:38 +01:00
Marco Lettere be6a71b283 multiple reinforced authorize for reducing expiration risks 2023-01-12 17:29:36 +01:00
Marco Lettere ad0c83c83c anticipated reinforced authorize for reducing expiration risks 2023-01-12 16:28:10 +01:00
Marco Lettere d53ad6b8fe reinforced authorize for reducing expiration risks 2023-01-12 16:21:38 +01:00
Marco Lettere 3409b5f392 reinforced authorize for reducing expiration risks 2023-01-12 16:20:24 +01:00
Marco Lettere 49f80b4cc6 fixed JS code 2023-01-12 16:10:39 +01:00
Marco Lettere 13bb81a85c sequenzialed to complete group creation asap 2023-01-12 15:40:02 +01:00
Marco Lettere cea8698929 sequenzialed to complete group creation asap 2023-01-12 15:00:03 +01:00
Marco Lettere 51be38cd57 create group directly under parent 2023-01-12 13:34:45 +01:00
Marco Lettere 72d4ba9799 patched according to new API requirements 2022-12-20 18:01:13 +01:00
Marco Lettere 887bf83277 removed unnecessary and wrong tasks at the end of workflow 2022-11-23 11:41:58 +01:00
Marco Lettere b88837df53 reenabled all workflows' deployment 2022-10-21 16:01:18 +02:00
Marco Lettere b9807d1450 removed task as per https://support.d4science.org/issues/23886 2022-10-21 11:03:10 +02:00
Marco Lettere 4cf2610cdd disable all workflows from deployment 2022-10-06 19:16:28 +02:00
Marco Lettere 1ab8b20811 renabled deploy for all workflows 2022-08-30 12:57:22 +02:00
Marco Lettere 2d8c576160 added scope link to Member role of context 2022-07-22 14:55:55 +02:00
Marco Lettere 362ab27344 added jupyterhub related workflow to group created 2022-07-14 14:42:59 +02:00
Marco Lettere 82b4d2ecf2 added jupyterhub related workflow to group created 2022-07-14 14:41:00 +02:00
Marco Lettere b0e83cc47d added jupyterhub related workflow to group created 2022-07-14 14:39:44 +02:00
Marco Lettere 18cb707053 reconfigured for jupyterhub-prod 2022-07-14 12:41:24 +02:00
Marco Lettere ee85e5cfd8 fix 2022-07-13 15:44:13 +02:00
Marco Lettere 8081b9ecf0 prepared for prod 2022-07-13 14:14:36 +02:00
Marco Lettere 38f48f558e authorization is required on master 2022-07-12 18:18:44 +02:00
Marco Lettere a5599b4311 authorization is required on master 2022-07-12 18:16:57 +02:00
Marco Lettere ac6b325486 added workflow for jh resource enablement 2022-07-12 18:10:11 +02:00
Marco Lettere 3bd3eefd4b removed dangerous role_deletion before addition 2022-07-05 16:44:40 +02:00
Marco Lettere e68a2845b5 disabled group_deleted 2022-06-16 10:21:01 +02:00
Marco Lettere 069ac7295e enabled all workflow for upload 2022-06-16 10:11:15 +02:00
Marco Lettere d4b94a2bc6 recommit 2022-05-19 12:35:11 +02:00
Marco Lettere 430047d4c5 reenabled all workflows 2022-05-19 12:27:57 +02:00
Marco Lettere dffdeeaa94 expect 204 on make-admin task 2022-03-22 17:31:19 +01:00
Marco Lettere 25bbf13a24 enable deploy for workspace clients 2022-03-22 14:48:22 +01:00
Marco Lettere 757b03003c undo emergency fix 2022-03-22 14:47:27 +01:00
Marco Lettere 2bc1d78b9c temporarily remove last task because not supported on prod 2022-03-22 12:54:43 +01:00
Marco Lettere 22fc70aec2 name fixed 2022-03-17 15:44:20 +01:00
Marco Lettere dc323102a2 name fixed 2022-03-17 15:40:36 +01:00
Marco Lettere 9ca9ad4e54 refactoring plus addition of delete ghn from contexts 2022-03-17 15:39:02 +01:00
Marco Lettere 65e1c2709e added ghn_client delete 2022-03-17 14:58:59 +01:00
Marco Lettere ff546c3405 improved join 2022-03-17 13:45:46 +01:00
Marco Lettere 83724be1ab remove wrongly named 2022-03-17 13:23:08 +01:00
Marco Lettere bb729c86d6 remove wrongly named 2022-03-17 13:21:24 +01:00
Marco Lettere bdfb3f2ca9 remove wrongly named 2022-03-17 13:17:15 +01:00
Marco Lettere 39eab850e4 fix 2022-03-17 12:57:59 +01:00
Marco Lettere 210482df25 added first ghn workflows 2022-03-17 12:53:50 +01:00
Marco Lettere 87af670d4f removed paging from add role 2022-03-16 09:55:08 +01:00
Marco Lettere fbfac80eb8 deploy workflows for gateway related support 2022-03-11 14:21:22 +01:00
Marco Lettere a4807d24e8 early termination when no user found 2022-03-11 12:52:07 +01:00
Marco Lettere 67435074ad handle gateway 2022-03-01 16:49:37 +01:00
Marco Lettere 04c7bb0ba6 handle gateway 2022-03-01 16:40:48 +01:00
Marco Lettere a03e924045 handle gateway 2022-03-01 16:39:07 +01:00
Marco Lettere 9e8e374f6d handle gateway 2022-03-01 16:36:01 +01:00
Marco Lettere 8805ceb944 adapted delete user from group to also handle gateways 2022-03-01 16:09:27 +01:00
Marco Lettere 0f2023bb62 adapted delete user from group to also handle gateways 2022-03-01 16:01:44 +01:00
Marco Lettere 24e190c957 adapted delete user from group to also handle gateways 2022-03-01 15:58:52 +01:00
Marco Lettere 3b6c49edce rewriting to manage also gateways 2022-03-01 15:34:54 +01:00
Marco Lettere 36026d6a4f rewriting to manage also gateways 2022-03-01 15:31:52 +01:00
Marco Lettere eb93fe1421 rewriting to manage also gateways 2022-03-01 15:24:04 +01:00
Marco Lettere 264aee6580 rewriting to manage also gateways 2022-03-01 15:18:15 +01:00
Marco Lettere 14a4698a92 rewriting to manage also gateways 2022-03-01 15:16:56 +01:00
Marco Lettere 2a790c7233 rewriting to manage also gateways 2022-03-01 12:43:30 +01:00
Marco Lettere 079eaaf63c rewriting to manage also gateways 2022-03-01 12:33:31 +01:00
Marco Lettere 2b85ac6e7c enabled workspace client workflows 2022-02-08 09:33:51 +01:00
Marco Lettere 64cb191730 added task for making ws client also admin of its workspace folder 2022-01-31 10:32:44 +01:00
Marco Lettere bd895d4583 removed regression 2022-01-26 11:42:21 +01:00
Marco Lettere 5685e29d49 even more resilient plus fix 2022-01-26 11:38:26 +01:00
Marco Lettere e659207019 more resilient to return type from shub 2022-01-26 11:05:49 +01:00
Marco Lettere 604a78af89 fix 2022-01-25 14:16:15 +01:00
Marco Lettere 51edaa1675 upload only that flow 2022-01-25 14:14:31 +01:00
Marco Lettere a0defed409 support also not encoded contexts 2022-01-25 14:12:52 +01:00
Marco Lettere 85051056be fix 2021-12-21 11:02:19 +01:00
Marco Lettere 3e2e2d460d fix 2021-12-20 18:01:19 +01:00
Marco Lettere 263c12db0f added new workflow 2021-12-20 18:00:01 +01:00
Marco Lettere 553f2aa357 added add_workspace_client_to_contexts 2021-12-20 17:57:24 +01:00
Marco Lettere c2e98f6faf fix call to rigth workflow 2021-11-25 15:08:50 +01:00
Marco Lettere f4ee98c531 deploy group_created fix 2021-11-25 15:04:42 +01:00
Marco Lettere 5d2a945047 deploy group_created 2021-11-25 14:59:24 +01:00
Marco Lettere a64ea6f2a5 removed unnecessary parameters, make workspace_to_vre more resilient to already member, hooked enable_workspace_clients workflow to group_created 2021-11-25 14:51:07 +01:00
Marco Lettere 7f39fde127 call to add_ws_client subworkflow fix 2021-11-25 13:25:53 +01:00
Marco Lettere 9a86ba6ee4 call to add_ws_client subworkflow fix 2021-11-25 13:22:45 +01:00
Marco Lettere a11bf6a057 call to add_ws_client subworkflow fix 2021-11-25 13:15:30 +01:00
Marco Lettere 6fd9e3c590 call to add_ws_client subworkflow 2021-11-25 13:13:44 +01:00
Marco Lettere 4c57be3f45 apply filter fix 2021-11-25 12:47:51 +01:00
Marco Lettere c6a0a1e0b7 apply filter fix 2021-11-25 12:45:28 +01:00
Marco Lettere 7864b81016 apply filter fix 2021-11-25 12:44:10 +01:00
Marco Lettere f8e1fff6d4 apply filter fix 2021-11-25 12:39:32 +01:00
Marco Lettere 7dc2aacfc6 apply filter 2021-11-25 12:38:32 +01:00
Marco Lettere e95442434c extract ws client names 2021-11-25 12:18:54 +01:00
Marco Lettere f438b0e0b1 added query to IC Proxy 2021-11-25 12:07:51 +01:00
Marco Lettere 7190e25c84 fixing validation 2021-11-25 11:59:07 +01:00
Marco Lettere 4682b3c575 fixing validation 2021-11-25 11:57:16 +01:00
Marco Lettere 6736647f91 fixing validation 2021-11-25 11:53:26 +01:00
Marco Lettere db238a9d44 fixing validation 2021-11-25 11:45:11 +01:00
Marco Lettere 37f465df65 fixing validation 2021-11-25 11:32:30 +01:00
Marco Lettere f12108aaf1 fixing validation 2021-11-25 11:30:30 +01:00
Marco Lettere 9fc54797c6 fixing validation 2021-11-25 11:17:34 +01:00
Marco Lettere 212990557f first stub for enable_workspace_clients_for_context 2021-11-25 11:07:31 +01:00
Marco Lettere b88c4ac153 first stub for enable_workspace_clients_for_context 2021-11-25 10:34:35 +01:00
Marco Lettere e6ec1c4195 fix 2021-11-23 17:16:20 +01:00
Marco Lettere ab8f573ac9 removed unnecessary task 2021-11-23 17:09:48 +01:00
Marco Lettere 0d09523675 added call to subworkflow 2021-11-23 16:53:20 +01:00
Marco Lettere 46cc74e6ff added task to double check VRE folders 2021-11-23 14:19:38 +01:00
Marco Lettere 43b68fe755 fix auth 2021-11-23 13:29:56 +01:00
Marco Lettere f128a3670a fix 2021-11-23 13:25:07 +01:00
Marco Lettere 7b0f83abd1 added workspace to vre folder link 2021-11-23 13:23:07 +01:00
Marco Lettere fda78741db fix 2021-11-23 13:04:50 +01:00
Marco Lettere ad6c4b7f03 fix 2021-11-23 13:01:11 +01:00
Marco Lettere 79ded74f4d adedd context-name shubification 2021-11-23 12:58:20 +01:00
Marco Lettere e6e7e486f3 fix 2021-11-23 12:35:15 +01:00
Marco Lettere ecb01a8e08 fix 2021-11-23 12:32:46 +01:00
Marco Lettere cd14ab34bb fix 2021-11-23 12:24:41 +01:00
Marco Lettere 08511adf6b fix 2021-11-23 12:22:29 +01:00
Marco Lettere fd42f668f8 fix 2021-11-23 12:08:47 +01:00
Marco Lettere 6bc808207d fix 2021-11-23 12:07:18 +01:00
Marco Lettere 57cc977921 added workflow for adding a workspace client to a context 2021-11-23 12:02:15 +01:00
Marco Lettere 2e7b427ea1 setup for deploying to prod 2021-11-23 10:49:22 +01:00
Marco Lettere fe64b1261d look for a correct token 2021-11-22 17:49:32 +01:00
Marco Lettere 112680ae36 fix 2021-11-22 17:45:48 +01:00
Marco Lettere 0daf406aaf fix 2021-11-22 17:43:40 +01:00
Marco Lettere 812692c37e fix 2021-11-22 17:36:31 +01:00
Marco Lettere b3ca00aafe create SHUB account 2021-11-22 17:35:29 +01:00
Marco Lettere 2653e8547e fix 2021-11-22 17:17:56 +01:00
Marco Lettere 4d93c95f84 removed unnecessary authorization header 2021-11-22 17:14:44 +01:00
Marco Lettere d7b099bdec removed unnecessary variables 2021-11-22 17:13:12 +01:00
Marco Lettere 13c8d6ee44 added workspace check 2021-11-22 17:10:19 +01:00
Marco Lettere 88868587e5 user is path segment not client 2021-11-22 16:20:21 +01:00
Marco Lettere 06dbbe39d2 reorder client ids 2021-11-22 16:15:09 +01:00
Marco Lettere a0be8131dd fix on url 2021-11-22 16:12:53 +01:00
Marco Lettere 57fc634b8d fix on input parameter 2021-11-22 16:06:14 +01:00
Marco Lettere 58a6b2da12 fix on input parameter 2021-11-22 16:05:06 +01:00
Marco Lettere fb2cbb2247 fix join 2021-11-22 15:58:05 +01:00
Marco Lettere 442eb8fa59 added root vo role mapping 2021-11-22 15:55:19 +01:00
Marco Lettere 93410cf895 added create_workspace_client workflow 2021-11-22 15:31:55 +01:00
Marco Lettere 6020c16367 added create_workspace_client workflow 2021-11-22 15:30:41 +01:00
Marco Lettere 0cd1700bd6 added create_workspace_client workflow 2021-11-22 15:29:28 +01:00
Marco Lettere 676f684630 added create_workspace_client workflow 2021-11-22 15:23:59 +01:00
Marco Lettere 779612ac12 added create_workspace_client workflow 2021-11-22 15:22:48 +01:00
Marco Lettere b9cf7dbb89 deploy workflows for system service 2021-11-05 16:56:05 +01:00
Marco Lettere 96cad42acc added correct Cnotent-type 2021-11-02 12:46:11 +01:00
Marco Lettere 50c5669a2e fix 2021-11-02 12:28:48 +01:00
Marco Lettere bc9db28bfd fix 2021-11-02 11:47:53 +01:00
Marco Lettere 0a7b4788cf removed uneccesary call to subworkflow 2021-11-02 11:39:34 +01:00
Marco Lettere 15de441715 hook Member role of new VRE to Infrastructure-Member composite 2021-11-02 11:37:12 +01:00
Marco Lettere caaf863f73 hook Member role of new VRE to Infrastructure-Member composite 2021-11-02 11:30:38 +01:00
Marco Lettere e37091f43d changed realm role to infrastructure-member 2021-11-02 10:32:31 +01:00
Marco Lettere 390d826a15 changed realm role to infrastructure-member 2021-11-02 10:30:37 +01:00
Marco Lettere 7c6f28ea62 inserted validations 2021-10-14 10:39:27 +02:00
Marco Lettere ad7db3f8ef added validation step 2021-10-14 10:26:00 +02:00
Marco Lettere bd5f59d5c9 fix encoding of rootvo 2021-10-13 15:20:35 +02:00
Marco Lettere 41c7ead616 upload all wkfs to pre 2021-10-13 12:56:00 +02:00
Marco Lettere 592fd97bef disabled all deployments 2021-10-07 18:54:25 +02:00
Marco Lettere 54ba635108 temp disable 2021-10-07 18:50:48 +02:00
Marco Lettere 779d1dbfab added workflow to delete system services 2021-10-07 15:55:17 +02:00
Marco Lettere 21fc7423e9 added workflow to delete system services 2021-10-07 15:52:14 +02:00
Marco Lettere 5f2a9c6671 added workflow to delete system services 2021-10-07 15:50:57 +02:00
Marco Lettere a808251924 added workflow to delete system services 2021-10-07 15:48:18 +02:00
Marco Lettere 3463b65d4c handle secret and description as inputs 2021-10-07 14:14:28 +02:00
Marco Lettere 5d11f97187 handle secret and description as inputs 2021-10-07 14:12:29 +02:00
Marco Lettere 6b8c2fb1dc handle secret and description as inputs 2021-10-07 14:07:55 +02:00
Marco Lettere 5e3264aebb handle secret and description as inputs 2021-10-07 14:04:55 +02:00
Marco Lettere 78a7612306 handle secret and description as inputs 2021-10-07 14:02:16 +02:00
Marco Lettere 4d90cbc045 fix 2021-10-07 12:09:11 +02:00
Marco Lettere c0bd29d44b realm wide authorization is not required any longer? 2021-10-07 11:56:41 +02:00
Marco Lettere bd23d0b65f add system service gets only one realm wide role 2021-10-07 11:13:08 +02:00
Marco Lettere 3050f0d2f5 fixed retrieval of root_vo 2021-09-23 17:56:27 +02:00
Marco Lettere 01cdce661c unlocked all workflows redeploy 2021-09-23 16:51:20 +02:00
Marco Lettere a6a2f7a367 create user add to vre and parent groups (feature #21866) 2021-09-22 11:45:01 +02:00
Marco Lettere 2674901cec create user add to vre and parent groups (feature #21866) 2021-09-22 11:42:39 +02:00
Marco Lettere f14e338e6e create user add to vre and parent groups (feature #21866) 2021-09-22 11:37:53 +02:00
Marco Lettere 4db9a865cc create user add to vre and parent groups (feature #21866) 2021-09-22 11:19:37 +02:00
Marco Lettere a5d4dd75ad create user add to vre and parent groups (feature #21866) 2021-09-22 11:16:26 +02:00
Marco Lettere eb915933f6 temporary disable full deploy 2021-07-05 13:11:12 +02:00
Marco Lettere c079c695b7 extended group_created with call to add_all_system_services_to_vre 2021-07-01 11:47:52 +02:00
Marco Lettere 51eae66ec6 add vre Member role to all system service user accounts on KC 2021-07-01 11:27:34 +02:00
Marco Lettere 90dcb4dc83 add vre Member role to all system service user accounts on KC 2021-07-01 11:25:38 +02:00
Marco Lettere b9646e4069 add vre Member role to all system service user accounts on KC 2021-07-01 11:21:08 +02:00
Marco Lettere 97289e10a0 add vre Member role to all system service user accounts on KC 2021-07-01 11:19:07 +02:00
Marco Lettere 728cdd2484 add vre Member role to all system service user accounts on KC 2021-07-01 11:16:55 +02:00
Marco Lettere 0a916e2c50 retrieve system_services' useraccounts from KC 2021-07-01 10:41:15 +02:00
Marco Lettere 27518cfbdc retrieve system_services' useraccounts from KC 2021-07-01 10:37:06 +02:00
Marco Lettere eb84cf5e15 retrieve system_services' useraccounts from KC 2021-07-01 10:34:02 +02:00
Marco Lettere 38d8602c3b retrieve system_services' useraccounts from KC 2021-07-01 10:29:04 +02:00
Marco Lettere 586bbc0234 retrieve system_services' useraccounts from KC 2021-07-01 10:27:33 +02:00
Marco Lettere 66d6881eed retrieve system_services' useraccounts from KC 2021-07-01 10:24:47 +02:00
Marco Lettere 94e479ad2b retrieve vre and system_services from KC 2021-06-30 19:05:37 +02:00
Marco Lettere 8cc4efaac0 retrieve vre and system_services from KC 2021-06-30 19:03:38 +02:00
Marco Lettere 011f6eb0ed retrieve vre and system_services from KC 2021-06-30 18:48:49 +02:00
Marco Lettere e9a4c2e46f retrieve vre and system_services from KC 2021-06-30 18:45:01 +02:00
Marco Lettere fc41e2f4e5 retrieve vre and system_services from KC 2021-06-30 18:43:36 +02:00
Marco Lettere b4aef34d3b retrieve vre and system_services from KC 2021-06-30 18:39:36 +02:00
Marco Lettere 768e965305 use pyeval to squeeze out service names 2021-06-30 18:12:12 +02:00
Marco Lettere b6fda3975d use pyeval to squeeze out service names 2021-06-30 17:42:22 +02:00
Marco Lettere 050990db34 introduce uma based authorization step 2021-06-30 17:26:58 +02:00
Marco Lettere 597ba693d9 introduce uma based authorization step 2021-06-30 17:24:51 +02:00
Marco Lettere d8a47e00a2 need first to authorize on d4science realm 2021-06-30 16:49:54 +02:00
Marco Lettere feda23ebda need first to authorize on d4science realm 2021-06-30 16:38:39 +02:00
Marco Lettere debef2b479 need first to authorize on d4science realm 2021-06-30 16:37:40 +02:00
Marco Lettere d729118dbd temporary optimization 2021-06-30 16:23:39 +02:00
Marco Lettere 988804480e authorize call to ic proxy 2021-06-30 16:22:22 +02:00
Marco Lettere 2d3cfc69d9 added entry 2021-06-30 16:09:22 +02:00
Marco Lettere 7dcd18f438 set default to dev ic proxy 2021-06-30 16:07:12 +02:00
Marco Lettere 096f082a47 added workflow to add all system services to vre 2021-06-30 16:05:48 +02:00
Marco Lettere 55db5d7d39 typo in content type 2021-06-04 12:01:50 +02:00
Marco Lettere 899621e6a3 try with lambda 2021-06-04 11:33:15 +02:00
Marco Lettere 6561d96531 try with lambda 2021-06-04 11:30:29 +02:00
Marco Lettere d23b12de3c try without resultList 2021-06-04 11:25:12 +02:00
Marco Lettere 3bf7363f3a fix quotes 2021-06-04 11:15:35 +02:00
Marco Lettere 52448711c4 set also accept 2021-06-04 11:13:24 +02:00
Marco Lettere 48275c4a2d fix 2021-06-04 10:52:26 +02:00
Marco Lettere b0f341d61a add role needs array 2021-06-04 10:49:24 +02:00
Marco Lettere e4690e8cf5 fixed content type 2021-06-04 10:15:13 +02:00
Marco Lettere 31c09e1ae7 need user-account-id to add role 2021-06-04 10:12:14 +02:00
Marco Lettere e3bc4c24e0 fix 2021-06-04 10:02:46 +02:00
Marco Lettere 148f8894fe correct name 2021-06-04 09:50:14 +02:00
Marco Lettere b4489912fd fixes 2021-06-04 09:45:44 +02:00
Marco Lettere 4e2d074d60 fixes 2021-06-04 09:36:27 +02:00
Marco Lettere 88c3429082 added workflows for the creation of system services 2021-06-04 09:27:23 +02:00
Marco Lettere 63dcb10efb added workflows for the creation of system services 2021-06-04 09:26:00 +02:00
dcore94 d2d3f1b56f force basic auth 2021-05-19 09:48:48 +02:00
dcore94 90d23511d1 Merge branch 'master' of https://code-repo.d4science.org/gCubeSystem/ansible-role-conductor-workflows-user-management 2021-05-18 20:12:46 +02:00
dcore94 b1494e6c5d added user/password 2021-05-18 20:12:27 +02:00
dcore94 5a0541a969 limit to 10 VREs per call 2021-04-30 14:41:48 +02:00
dcore94 24281986f7 re-authenticating before evey massive call 2021-04-30 11:00:03 +02:00
dcore94 8625fc3f67 fixed typo 2021-03-24 16:23:17 +01:00
dcore94 4cd68edad7 improved message 2021-03-24 16:20:34 +01:00
dcore94 68bb27c159 added workflow for role deletion 2021-03-24 15:40:52 +01:00
dcore94 88a462ef4b fixed typo 2021-03-24 13:38:48 +01:00
dcore94 ade0ecf98f fixed typo 2021-03-24 13:33:52 +01:00
dcore94 6f984675c8 fixed typo 2021-03-24 13:31:27 +01:00
dcore94 9747e34dad fixed typo 2021-03-24 13:28:24 +01:00
dcore94 72049edb6a fixed typo 2021-03-24 13:26:59 +01:00
dcore94 49f8ce1123 fixed typo 2021-03-24 13:18:05 +01:00
dcore94 4a15b3a7e0 fixed typo 2021-03-24 13:04:00 +01:00
dcore94 3399483ac5 fixed typo 2021-03-24 12:58:07 +01:00
dcore94 4c7dab8913 fixed typo 2021-03-24 12:55:10 +01:00
dcore94 930ed0760f fixed typo 2021-03-24 12:39:56 +01:00
dcore94 2408d37373 fixed typo 2021-03-24 12:36:44 +01:00
dcore94 fdf375e984 added permission update 2021-03-24 12:34:52 +01:00
dcore94 3c3bbf4e3c fixed typo 2021-03-24 12:20:48 +01:00
dcore94 fa3c99482f fixed typo 2021-03-24 12:15:05 +01:00
dcore94 4267480a1c fixed typo 2021-03-24 12:06:00 +01:00
dcore94 7dce372bd4 move to subworkflow 2021-03-24 12:03:39 +01:00
dcore94 2fb8b37c7f move to subworkflow 2021-03-24 12:02:28 +01:00
dcore94 587c491b99 use containerId of role to link client 2021-03-24 10:46:28 +01:00
dcore94 cb5c4b5c47 fix typo 2021-03-24 10:28:03 +01:00
dcore94 71b2d26a0d fix typo 2021-03-24 10:24:03 +01:00
dcore94 32ee1a7bb6 fix typo 2021-03-24 10:21:26 +01:00
dcore94 1f78bc5325 fix typo 2021-03-24 10:05:31 +01:00
dcore94 5e74d09c73 role deletion tolerant to not found 2021-03-24 10:03:58 +01:00
dcore94 cb1ccd069d fix typo 2021-03-24 10:01:04 +01:00
dcore94 dbfc3ed884 fix typo 2021-03-24 09:57:14 +01:00
dcore94 ad79ea2353 fix typo 2021-03-24 09:54:15 +01:00
dcore94 70470f352d fix typo 2021-03-24 09:50:15 +01:00
dcore94 2238e8fb4d linked role instances and vres for policy addition 2021-03-24 09:47:33 +01:00
dcore94 651110dd3f first remove possible roles with same name 2021-03-24 09:28:32 +01:00
dcore94 24f1de5f3c fix typo 2021-03-24 09:11:27 +01:00
dcore94 f99244b85a fix typo 2021-03-24 09:08:26 +01:00
dcore94 659e8bb231 fix typo 2021-03-24 09:05:28 +01:00
dcore94 a447d919b5 added get back of all created roles 2021-03-24 09:03:01 +01:00
dcore94 7733542eba fix encoding of rootvo 2021-03-23 19:31:04 +01:00
dcore94 253733e698 fix encoding of rootvo 2021-03-23 19:20:46 +01:00
dcore94 9bc84b40ec fix encoding of rootvo 2021-03-23 19:17:08 +01:00
dcore94 ca48efb788 started work on role_created event 2021-03-23 19:07:04 +01:00
dcore94 9e15bbf00b started work on role_created event 2021-03-23 19:02:35 +01:00
dcore94 2652e9c635 started work on role_created event 2021-03-23 18:59:56 +01:00
dcore94 8e46177f07 fixed script for permission addition 2021-03-23 18:35:35 +01:00
dcore94 151599a81a fixed script for permission addition 2021-03-23 18:27:05 +01:00
dcore94 b5aeb10af4 fixed script for permission addition 2021-03-23 18:22:05 +01:00
dcore94 6715bc1a4a fixed script for permission addition 2021-03-23 18:18:58 +01:00
dcore94 bf41e1ee48 fixed script for permission addition 2021-03-23 18:08:04 +01:00
dcore94 21328cdb5f fixed script for permission addition 2021-03-23 18:02:57 +01:00
dcore94 ddce625c0f fixed script for permission addition 2021-03-23 17:49:06 +01:00
dcore94 b2faf6497a fixed script for permission addition 2021-03-23 17:40:53 +01:00
dcore94 98539d1a71 fixed script for permission addition 2021-03-23 17:35:56 +01:00
dcore94 873beff0f1 fixed script for permission addition 2021-03-23 17:33:17 +01:00
dcore94 2f33dceef0 added permission finalization 2021-03-23 17:29:42 +01:00
dcore94 95bd73561f fixed script for policy addition 2021-03-23 17:27:28 +01:00
dcore94 bd777eb402 fixed script for policy addition 2021-03-23 17:09:47 +01:00
dcore94 e5d5ba4818 fixed script for policy addition 2021-03-23 17:03:13 +01:00
dcore94 51e3d8599c fixed script for policy addition 2021-03-23 16:59:10 +01:00
dcore94 508742daa9 fixed script for policy addition 2021-03-23 16:51:28 +01:00
dcore94 d6e7688c48 fixed typo 2021-03-23 16:31:01 +01:00
dcore94 cfd6114d92 fixed typo 2021-03-23 16:25:57 +01:00
dcore94 23ec6e8388 fixed typo 2021-03-23 15:52:25 +01:00
dcore94 68568602ec dynamic fork can only contain one task 2021-03-23 15:44:34 +01:00
dcore94 4f238b49e7 dynamic fork can only contain one task 2021-03-23 15:31:58 +01:00
dcore94 7f01bffe5e fixed typo 2021-03-23 15:06:59 +01:00
dcore94 7d30255cf5 fixed typo 2021-03-23 15:02:40 +01:00
dcore94 a99a24720a fixed typo 2021-03-23 14:57:24 +01:00
dcore94 d3a99f5bf6 added workflow for deployment 2021-03-23 14:29:06 +01:00
dcore94 1abe2d835d added workflow for role created event 2021-03-23 13:40:05 +01:00
dcore94 8f4d35c2d5 switched to dynamic fork 2021-03-23 12:39:46 +01:00
dcore94 25bf4e537d switched to dynamic fork 2021-03-23 12:31:22 +01:00
dcore94 33b2df507e added email notifications 2021-03-23 11:11:47 +01:00
dcore94 2b20e70da2 added email notifications 2021-03-23 11:08:02 +01:00
dcore94 ea9cecb070 added email notifications 2021-03-23 11:03:43 +01:00
32 changed files with 4708 additions and 1253 deletions

View File

@ -1,14 +1,36 @@
--- ---
workflows: workflows:
- create-user-add-to-vre # - create-user-add-to-vre
- group_deleted # - group_deleted
- user-group_created # - user-group_created
- user-group-role_created - user-group-role_created
- group_created # - group_created
- invitation-accepted # - invitation-accepted
- user-group_deleted # - user-group_deleted
- user-group-role_deleted # - user-group-role_deleted
- delete-user-account # - delete-user-account
# - role_deleted
# - role_created
# - add_role_policy_permission
# - add_all_member_roles
# - create_system_service
# - delete_system_service
# - add_all_system_services_to_vre
# - create_workspace_client
# - add_workspace_client_to_context
# - enable_workspace_clients_for_context
# - add_workspace_client_to_contexts
# - ghn_client_add_to_context
# - ghn_client_add_to_contexts
# - ghn_client_create
# - ghn_client_delete
# - ghn_client_remove_from_contexts
# - ghn_client_remove_from_context
# - jupyterhub_add_serveroptions_to_context
# - record_context_to_is
# - create_vre_folder_for_context
# - create_vre
keycloak_host: "https://accounts.dev.d4science.org/auth" keycloak_host: "https://accounts.dev.d4science.org/auth"
keycloak: "{{ keycloak_host }}/realms" keycloak: "{{ keycloak_host }}/realms"
keycloak_realm: "d4science" keycloak_realm: "d4science"
@ -17,3 +39,6 @@ keycloak_auth: "c93501bd-abeb-4228-bc28-afac38877338"
keycloak_auth_master: "7a64deb5-e8ea-4add-ba8d-26b339994cc9" keycloak_auth_master: "7a64deb5-e8ea-4add-ba8d-26b339994cc9"
liferay: "https://next.d4science.org/api/jsonws" liferay: "https://next.d4science.org/api/jsonws"
liferay_auth: "bm90aWZpY2F0aW9uc0BkNHNjaWVuY2Uub3JnOmdjdWJlcmFuZG9tMzIx" liferay_auth: "bm90aWZpY2F0aW9uc0BkNHNjaWVuY2Uub3JnOmdjdWJlcmFuZG9tMzIx"
root_vo: "%2Fgcube"
ic_proxy: "https://node10-d-d4s.d4science.org"
is_url: "https://url.gcube.d4science.org"

View File

@ -15,6 +15,9 @@
uri: uri:
url: "{{ conductor_workflowdef_endpoint }}/{{ item }}/1" url: "{{ conductor_workflowdef_endpoint }}/{{ item }}/1"
method: DELETE method: DELETE
force_basic_auth: yes
url_username: "{{ user }}"
url_password: "{{ password }}"
follow_redirects: yes follow_redirects: yes
status_code: [200, 204, 404, 500] status_code: [200, 204, 404, 500]
loop: loop:
@ -26,6 +29,9 @@
method: POST method: POST
src: "{{ target.path }}/{{ item }}.json" src: "{{ target.path }}/{{ item }}.json"
body_format: json body_format: json
force_basic_auth: yes
url_username: "{{ user }}"
url_password: "{{ password }}"
follow_redirects: yes follow_redirects: yes
status_code: [200, 204] status_code: [200, 204]
loop: loop:

View File

@ -0,0 +1,76 @@
{
"ownerApp" : "Orchestrator",
"name" : "add_all_member_roles",
"createBy" : "Marco Lettere",
"description": "Add all member roles of every context to the KC system service client identified by client",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["context","client"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "1 == 1"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.context.id}/roles/Member",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${retrieve_member_role.output.body}",
"queryExpression" : ".role"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${workflow.input.client}/role-mappings/clients/${retrieve_member_role.output.body.containerId}",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${to_array.output.resultList}"
}
}
]
}

View File

@ -0,0 +1,190 @@
{
"ownerApp" : "Orchestrator",
"name" : "add_all_system_services_to_vre",
"createBy" : "Marco Lettere",
"description": "All system services retrieved from the IS through IC Proxy are added as Member to a VRE",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_resource_id"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"iC_proxy" : "{{ ic_proxy }}",
"evaluatorType" : "javascript",
"scriptExpression": "1 == 1"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_on_realm",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_with_uma_rpt",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json",
"Authorization" : "Bearer ${authorize_on_realm.output.body.access_token}"
},
"body" : {
"audience" : "{{ root_vo }}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "retrieve_system_services",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ ic_proxy }}/icproxy/gcube/service/ServiceEndpoint/SystemService",
"method" : "GET",
"headers" : {
"Accept" : "application/xml",
"Authorization" : "Bearer ${authorize_with_uma_rpt.output.body.access_token}"
}
}
},
{
"name" : "pyeval",
"taskReferenceName" : "extract_system_service_names",
"type" : "SIMPLE",
"inputParameters" : {
"code" : "exec('import xml.etree.ElementTree as ET') or list(map(lambda n: n.text, ET.fromstring(data['xmlstring']).findall('Resource/Profile/Name')))",
"xmlstring" : "${retrieve_system_services.output.body}"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_vre",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.client_resource_id}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_get_system_services_tasks",
"type": "INLINE",
"inputParameters": {
"url" : "${init.input.keycloak_admin}/clients?search=true&clientId=",
"services" : "${extract_system_service_names.output.result}",
"evaluatorType" : "javascript",
"expression": "inputs = {}, tasks = [];function f(){for (var i = 0; i < $.services.length; i++){s = $.services[i];tasks.push({name: 'pyrest',type: 'SIMPLE',taskReferenceName: 'get_system_service' + i});inputs['get_system_service' + i] = {url: $.url + s,method: 'GET',headers: {Authorization: 'Bearer ${authorize.output.body.access_token}', Accept: 'application/json'}}};return {tasks: Java.to(tasks, 'java.util.Map[]'),inputs: inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_get_system_services_tasks",
"inputParameters" : {
"tasks" : "${build_get_system_services_tasks.output.result.tasks}",
"inputs" : "${build_get_system_services_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_get_system_services_tasks"
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_get_system_services_useraccount_tasks",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"url" : "${init.input.keycloak_admin}/clients",
"services" : "${join_parallel_get_system_services_tasks.output..body.*.id}",
"scriptExpression": "inputs = {}, tasks = [];function f(){for (var i = 0; i < $.services.length; i++){s = $.services[i];tasks.push({name: 'pyrest',type: 'SIMPLE',taskReferenceName: 'get_system_service_useraccount' + i});inputs['get_system_service_useraccount' + i] = {url: $.url + '/' + s + '/service-account-user',method: 'GET',headers: {Authorization: 'Bearer ${authorize.output.body.access_token}', Accept: 'application/json'}}};return {tasks: Java.to(tasks, 'java.util.Map[]'),inputs: inputs};"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_get_system_services_useraccount_tasks",
"inputParameters" : {
"tasks" : "${build_get_system_services_useraccount_tasks.output.result.tasks}",
"inputs" : "${build_get_system_services_useraccount_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_get_system_services_useraccount_tasks"
},
{
"name": "LAMBDA_TASK",
"taskReferenceName": "build_member_roles_assignment_tasks",
"type": "LAMBDA",
"inputParameters": {
"context" : "${get_vre.output.body}",
"service_ids" : "${join_parallel_get_system_services_useraccount_tasks.output..body.id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];for(var i=0;i<$.service_ids.length;i++)c=$.context,tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'call_add_all_member_roles_'+i, subWorkflowParam:{ name:'add_all_member_roles'}}),inputs['call_add_all_member_roles_'+i]={context:c, client:$.service_ids[i]};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_member_roles_assignment_tasks",
"inputParameters" : {
"tasks" : "${build_member_roles_assignment_tasks.output.result.tasks}",
"inputs" : "${build_member_roles_assignment_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_build_member_roles_assignment_tasks"
}
]
}

View File

@ -0,0 +1,152 @@
{
"ownerApp" : "Orchestrator",
"name" : "add_role_policy_permission",
"createBy" : "Marco Lettere",
"description": "Atomically add a policy and a update client permission with new role",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["role"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "1 == 1"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "prepare_policy_and_permission",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "add_policy",
"retryCount" : 1,
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.role.containerId}/authz/resource-server/policy/role",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept" : "application/json"
},
"body" : {
"name":"${workflow.input.role.name}_policy",
"description" : "Policy for having ${workflow.input.role.name} role",
"type":"role",
"logic" : "POSITIVE",
"decisionStrategy" : "UNANIMOUS",
"roles" : [{ "id" : "${workflow.input.role.id}", "required" : true}]
}
}
}
],
[
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_default_permission",
"retryCount" : 1,
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.role.containerId}/authz/resource-server/permission?name=Default Permission",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_default_permission_policies",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.role.containerId}/authz/resource-server/permission/${retrieve_default_permission.output.body[0].id}/associatedPolicies",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
]
]
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_prepare_policy_and_permission",
"joinOn" : ["retrieve_default_permission_policies","add_policy"]
},
{
"name": "INLINE_TASK",
"taskReferenceName": "to_policy_array",
"type": "INLINE",
"inputParameters": {
"newpolicy": "${add_policy.output.body}",
"evaluatorType" : "javascript",
"prevpolicies" : "${retrieve_default_permission_policies.output.body}",
"expression": "Java.from($.prevpolicies).concat($.newpolicy)"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "count_check",
"inputParameters": {
"tocount": "${to_policy_array.output.result[*].id}",
"tocompare": "${retrieve_default_permission_policies.output.body}",
"evaluatorType": "javascript",
"expression": "if($.tocount.length < $.tocompare.length) throw 'Unexpected low value'; else $.tocount.length < $.tocompare.length"
},
"type": "INLINE",
"startDelay": 0,
"optional": false,
"asyncComplete": false
},
{
"name" : "pyrest",
"taskReferenceName" : "finalize_permission",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${workflow.input.role.containerId}/authz/resource-server/permission/${retrieve_default_permission.output.body[0].id}",
"method" : "PUT",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
},
"body" : {
"name": "Default Permission",
"description": "",
"type" : "resource",
"logic": "POSITIVE",
"decisionStrategy": "AFFIRMATIVE",
"policies" : "${to_policy_array.output.result[*].id}"
}
}
}
]
}

View File

@ -0,0 +1,205 @@
{
"ownerApp" : "Orchestrator",
"name" : "add_workspace_client_to_context",
"createBy" : "Marco Lettere",
"description": "A workspace client is made Member of a context and it's workspace folder is linked to context's shared folder",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"storagehub" : "{{ storagehub }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"ctx" : "${workflow.input.context}",
"evaluatorType": "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id) || e($.ctx)) throw('Client ID and Context must not be empty'); else return { encoded_root_vo : encodeURI($.root_vo), encoded_context : $.ctx.replaceAll('/', '%2F')}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "fork1",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.client_id}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_ws_client",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_client.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('Workspace client not found'); else return { client : $.client[0], id : $.client[0].id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_ws_client.output.result.id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_context",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${init.output.result.encoded_context}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_context",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_context.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('Workspace client not found'); else return { client : $.client[0], id: $.client[0].id }} f()"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_context.output.result.id}/roles/Member",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "roles_to_assign",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${retrieve_member_role.output.body}",
"queryExpression" : ".role"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "shubify_context_name",
"type": "INLINE",
"inputParameters": {
"context_name" : "${extract_context.output.result.client.name}",
"evaluatorType" : "javascript",
"expression": "var s = $.context_name; function f(){return { shubified_context_name : (s[0] === '/' ? s.replace('/', '') : s).split('/').join('-')}} f()"
}
}
]
]
},
{
"name": "join",
"taskReferenceName": "join1",
"type": "JOIN",
"joinOn": [
"get_service_account_user",
"shubify_context_name"
]
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/clients/${retrieve_member_role.output.body.containerId}",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${roles_to_assign.output.resultList}"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_with_uma_rpt",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${init.input.root_vo}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "workspace_to_vre_folder",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.storagehub}/workspace/groups/${shubify_context_name.output.result.shubified_context_name}/users",
"method" : "PUT",
"expect" : [200, 400, 500],
"body" :{
"userId" : "${get_service_account_user.output.body.username}"
},
"headers" : {
"Authorization" : "Bearer ${authorize_with_uma_rpt.output.body.access_token}"
}
}
}
]
}

View File

@ -0,0 +1,52 @@
{
"ownerApp" : "Orchestrator",
"name" : "add_workspace_client_to_contexts",
"createBy" : "Marco Lettere",
"description": "A workspace client is made Member of all the contexts passed as input by calling the add_workspace_client_to_context sub-workflow",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context_list"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty'); return { }} f()"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_tasks_to_add_ws_client_to_all_contexts",
"type": "INLINE",
"inputParameters": {
"context_list" : "${workflow.input.context_list}",
"client_id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.context_list.length;i++)c=$.context_list[i],tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'add_workspace_client_to_context_'+i, subWorkflowParam:{ name:'add_workspace_client_to_context'}}),inputs['add_workspace_client_to_context_'+i]={client_id : $.client_id, context: c};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_tasks_to_add_ws_client_to_all_contexts",
"inputParameters" : {
"tasks" : "${build_tasks_to_add_ws_client_to_all_contexts.output.result.tasks}",
"inputs" : "${build_tasks_to_add_ws_client_to_all_contexts.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_build_tasks_to_add_ws_client_to_all_contexts"
}
]
}

View File

@ -8,14 +8,15 @@
"inputParameters" : ["user", "first-name", "last-name", "email", "password", "group"], "inputParameters" : ["user", "first-name", "last-name", "email", "password", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"group" : "${workflow.input.group}", "group" : "${workflow.input.group}",
"scriptExpression": "var path = $.group.split('%2F').slice(1); return { 'tree' : Java.to(path, 'java.lang.Object[]'), 'name' : path.slice(path.length-1)[0]}" "evaluatorType" : "javascript",
"expression": "function f(){var path = $.group.split('%2F').slice(1); return { 'tree' : Java.to(path, 'java.lang.Object[]'), 'name' : path.slice(path.length-1)[0]}} f()"
} }
}, },
{ {
@ -79,15 +80,16 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_user", "taskReferenceName": "select_user",
"inputParameters": { "inputParameters": {
"foundusers": "${lookup_user.output.body}", "foundusers": "${lookup_user.output.body}",
"username": "${workflow.input.user}", "username": "${workflow.input.user}",
"scriptExpression": "for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return Java.to([$.foundusers[i]], 'java.lang.Object[]')}" "evaluatorType" : "javascript",
}, "expression": "function f(){for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return $.foundusers[i]}} f()"
"type": "LAMBDA" },
}, "type": "INLINE"
},
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "lookup_client", "taskReferenceName" : "lookup_client",
@ -119,21 +121,23 @@
{ {
"name" : "check_role_existance", "name" : "check_role_existance",
"taskReferenceName" : "check_role_existance", "taskReferenceName" : "check_role_existance",
"type" : "DECISION", "type" : "SWITCH",
"inputParameters" :{ "inputParameters" :{
"previous_outcome" : "${get_client_roles.output.status}" "previous_outcome" : "${get_client_roles.output.status}"
}, },
"caseValueParam" : "previous_outcome", "evaluatorType" : "value-param",
"expression" : "previous_outcome",
"decisionCases" : { "decisionCases" : {
"200" : [ "200" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_role", "taskReferenceName": "select_role",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"evaluatorType" : "javascript",
"role": "${workflow.input.role}", "role": "${workflow.input.role}",
"roles" : "${get_client_roles.output.body}", "roles" : "${get_client_roles.output.body}",
"scriptExpression": "for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == 'Member') return Java.to([$.roles[i]], 'java.lang.Object[]')}" "expression": "function f(){for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == 'Member') return $.roles[i]}} f()"
} }
}, },
{ {
@ -149,26 +153,43 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "extract_group", "taskReferenceName": "extract_groups",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"evaluatorType" : "javascript",
"tree" : "${init.output.result.tree}", "tree" : "${init.output.result.tree}",
"groups" : "${look_up_groups.output.body}", "groups" : "${look_up_groups.output.body}",
"scriptExpression": "function selectByPath(groups, path, level) { for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {if (level === path.length - 1) return groups[i];return selectByPath(groups[i].subGroups, path, level+1)}} return null; } return { 'group' : selectByPath($.groups, $.tree, 0)}" "expression": "function selectByPath(groups, path, level, acc){ for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {acc.push(groups[i]); if (level === path.length - 1) return acc;return selectByPath(groups[i].subGroups, path, level+1, acc)}} return []; } function f(){ return { 'groups' : Java.to(selectByPath($.groups, $.tree, 0, []),'java.util.Map[]')}} f()"
} }
}, },
{ {
"name" : "pyrest", "name": "INLINE_TASK",
"taskReferenceName" : "assign_user_to_group", "taskReferenceName": "build_add_to_all_groups_tasks",
"type" : "SIMPLE", "type": "INLINE",
"inputParameters" : { "inputParameters": {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result[0].id}/groups/${extract_group.output.result.group.id}", "evaluatorType" : "javascript",
"method" : "PUT", "groups" : "${extract_groups.output.result.groups}",
"headers" : { "auth" : "Bearer ${authorize.output.body.access_token}",
"Authorization" : "Bearer ${authorize.output.body.access_token}" "kc_user_url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/groups/",
} "expression": "inputs={};tasks=[];function f(){for(var i=0;i<$.groups.length;i++)group=$.groups[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'user_to_group_'+i}),inputs['user_to_group_'+i]={ url : $.kc_user_url + group.id, method : 'PUT', headers: { Authorization : $.auth} };return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f();"
} }
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_user_to_groups",
"inputParameters" : {
"tasks" : "${build_add_to_all_groups_tasks.output.result.tasks}",
"inputs" : "${build_add_to_all_groups_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_user_to_groups"
} }
] ]
} }

View File

@ -0,0 +1,116 @@
{
"ownerApp" : "Orchestrator",
"name" : "create_system_service",
"createBy" : "Marco Lettere",
"description": "Create a confidential client for software procedures that need to be members of each VO and VRE",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "client_secret", "description"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"secret" : "${workflow.input.client_secret}",
"description" : "${workflow.input.description}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){ if(e($.id)) throw('Client ID must not be empty'); return { client : { clientId : $.id, description : ($.description ? $.description : $.id), secret : ($.secret ? $.secret : Java.type('java.util.UUID').randomUUID().toString()), rootUrl : '', enabled : true, serviceAccountsEnabled : true, standardFlowEnabled : true, authorizationServicesEnabled : false, publicClient : false, fullScopeAllowed : true, protocol : 'openid-connect'}}}; f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "create_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"body" : "${init.output.result.client}",
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_client_id",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"client_location" : "${create_client.output.headers.location}",
"expression": "var client_id = $.client_location.split('/').pop(); function f(){return {'client_id' : client_id}}; f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_infra_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/roles/Infrastructure-Member",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${retrieve_infra_member_role.output.body}",
"queryExpression" : ".role"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_infra_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/realm",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${to_array.output.resultList}"
}
}
]
}

View File

@ -0,0 +1,656 @@
{
"ownerApp" : "Orchestrator",
"name" : "create_vre",
"createBy" : "Marco Lettere",
"description": "Handle workflow related to Portal event group_created",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["context", "folder_owner", "folder_admins"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"group" : "${workflow.input.context}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.group)) throw('Group must not be empty'); var tree = $.group.startsWith('%2F') ? $.group.split('%2F') : [$.group]; return { 'tree' : tree, 'child': tree[tree.length-1], 'append' : tree.slice(0,-1).join('/'), 'name' : tree.join('/'), encoded_root_vo : encodeURI($.root_vo)}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "preliminary_fork",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "create_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"body" : {
"clientId": "${init.input.group}",
"name": "${init.output.result.name}",
"description": "Client representation for ${init.output.result.name} context",
"rootUrl": "http://localhost${init.output.result.name}",
"enabled": true,
"serviceAccountsEnabled": true,
"standardFlowEnabled": true,
"authorizationServicesEnabled": true,
"publicClient": false,
"fullScopeAllowed" : false,
"protocol": "openid-connect"
},
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_client_id",
"type": "INLINE",
"inputParameters": {
"client_location" : "${create_client.output.headers.location}",
"evaluatorType" : "javascript",
"expression": "var client_id = $.client_location.split('/').pop(); function f(){return {'client_id' : client_id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "list_kc_groups",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/groups",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "prepare",
"type": "INLINE",
"inputParameters": {
"append": "${init.output.result.append}",
"groups": "${list_kc_groups.output.body}",
"evaluatorType" : "javascript",
"expression": "function recurse(inp){for(var i=0;i<inp.length;i++){if(inp[i]['path'] === $.append) return inp[i]; else{var subr = recurse(inp[i].subGroups); if(subr != null) return subr;}} return null}; function f(){return {'group' : $.append == '' ? '' : recurse($.groups)}} f()"
}
},
{
"name": "decide_task",
"taskReferenceName": "decide1",
"inputParameters": {
"groupid": "${prepare.output.result.group}"
},
"type": "SWITCH",
"evaluatorType" : "value-param",
"expression": "groupid",
"decisionCases": {
"": [
{
"name": "INLINE_TASK",
"taskReferenceName": "dummy",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"expression": "1"
}
}
]
},
"defaultCase": [
{
"name": "pyrest",
"taskReferenceName": "create_kc_group",
"inputParameters": {
"url": "${init.input.keycloak_admin}/groups/${prepare.output.result.group.id}/children",
"body": {
"name": "${init.output.result.child}"
},
"method": "POST",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Content-Type": "application/json"
}
},
"type": "SIMPLE"
},
{
"name": "INLINE_TASK",
"type": "INLINE",
"taskReferenceName": "prepare2",
"inputParameters": {
"location": "${create_kc_group.output.headers.location}",
"client_location": "${create_client.output.headers.location}",
"evaluatorType" : "javascript",
"expression": "var newid=$.location.split('/').pop(); var client_id = $.client_location.split('/').pop(); function f(){return {'newid' : newid, 'client_id' : client_id}} f()"
}
}
]
},
{
"name" : "pyrest",
"taskReferenceName" : "get_default_policies",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/policy",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_default_resource",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/resource",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_default_policy1",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/policy/${get_default_policies.output.body[0].id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_default_policy2",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/policy/${get_default_policies.output.body[1].id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "create_permission",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/permission/resource",
"body" : {
"name": "Default Permission",
"description": "",
"type" : "resource",
"logic": "POSITIVE",
"decisionStrategy": "AFFIRMATIVE",
"resources" : ["${get_default_resource.output.body[0]._id}"]
},
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=${init.output.result.encoded_root_vo}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo_roles",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${get_rootvo.output.body[0].id}/roles",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
]
]
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "preliminary_fork_join",
"joinOn": [ "create_permission", "get_rootvo_roles"]
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize1",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "create_role_member",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${create_client.output.headers.location}/roles",
"body" : {
"clientRole" : true, "name" : "Member", "description" : "Simple membership for ${init.output.result.name}"
},
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize1.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_back_role_member",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${create_role_member.output.headers.location}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize1.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${get_back_role_member.output.body}",
"queryExpression" : ".role"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "add_role_member_as_component_of_infrastructure_member",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/roles/Infrastructure-Member/composites",
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize1.output.body.access_token}",
"Content-Type" : "application/json"
},
"body" : "${to_array.output.resultList}"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "create_role_policy_member",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/policy/role",
"body" : {
"name": "Member_policy",
"description": "",
"type" : "role",
"logic": "POSITIVE",
"decisionStrategy": "UNANIMOUS",
"roles" : [
{
"id" : "${get_back_role_member.output.body.id}",
"required" : true
}
]
},
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize1.output.body.access_token}",
"Content-Type" : "application/json",
"Accept" : "application/json"
}
}
},
{
"name": "decide_task",
"taskReferenceName": "decide2",
"inputParameters": {
"groupid": "${prepare.output.result.group}"
},
"type": "SWITCH",
"evaluatorType" : "value-param",
"expression": "groupid",
"decisionCases": {
"": [
{
"name": "INLINE_TASK",
"taskReferenceName": "dummy2",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"expression": "1"
}
}
]
},
"defaultCase": [
{
"name" : "pyrest",
"taskReferenceName" : "assign_client_member_role_to_kc_group",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/groups/${prepare2.output.result.newid}/role-mappings/clients/${prepare2.output.result.client_id}",
"method" : "POST",
"body" : ["${get_back_role_member.output.body}"],
"headers" : {
"Authorization" : "Bearer ${authorize1.output.body.access_token}",
"Accept" : "application/json",
"Content-Type" : "application/json"
}
}
}
]
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize2",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_role_tasks",
"type": "INLINE",
"inputParameters": {
"roles" : "${get_rootvo_roles.output.body}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function add(r, k){ if(r.name != 'uma_protection' && r.name != 'Member'){ tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'create_'+k}); inputs['create_'+k]={url:'${create_client.output.headers.location}/roles',body:{clientRole:true,name:r.name,description:r.description},method:'POST',headers:{Authorization:'Bearer ${authorize2.output.body.access_token}','Content-Type':'application/json'}}}};for(var i=0;i<$.roles.length;i++)r=$.roles[i],k='add-'+r.name, add(r, k); function f(){return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_role",
"inputParameters" : {
"tasks" : "${build_add_role_tasks.output.result.tasks}",
"inputs" : "${build_add_role_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_role_addition"
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize3",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_get_back_role_tasks",
"type": "INLINE",
"inputParameters": {
"roleurls" : "${join_parallel_role_addition.output[*]..location}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.roleurls.length;i++)u=$.roleurls[i],k='add-'+i,tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'get_back_'+k}),inputs['get_back_'+k]={url:u,method:'GET',headers:{Authorization:'Bearer ${authorize3.output.body.access_token}',Accept:'application/json'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_get_back_role",
"inputParameters" : {
"tasks" : "${build_get_back_role_tasks.output.result.tasks}",
"inputs" : "${build_get_back_role_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_getting_back"
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize4",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_policy_tasks",
"type": "INLINE",
"inputParameters": {
"roles" : "${join_parallel_getting_back.output[*].body}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.roles.length;i++)r=$.roles[i],k='add-'+r.name,tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'create_role_policy_'+k}),inputs['create_role_policy_'+k]={url:'${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/policy/role',body:{name:r.name+'_policy',description:'',type:'role',logic:'POSITIVE',decisionStrategy:'UNANIMOUS',roles:Java.to([{id:r.id,required:true}], 'java.util.Map[]')},method:'POST',headers:{Authorization:'Bearer ${authorize4.output.body.access_token}', Accept: 'application/json', 'Content-Type':'application/json'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_policy_role",
"inputParameters" : {
"tasks" : "${build_add_policy_tasks.output.result.tasks}",
"inputs" : "${build_add_policy_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_policy_addition"
},
{
"name": "INLINE_TASK",
"taskReferenceName": "policy_list",
"type": "INLINE",
"inputParameters": {
"memberpolicy" : "${create_role_policy_member.output.body.id}",
"otherpolicies" : "${join_parallel_policy_addition.output[*].body.id}",
"evaluatorType" : "javascript",
"expression": "function f(){return Java.to(Java.from($.otherpolicies).concat($.memberpolicy), 'java.lang.String[]')} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize5",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "finalize_permission",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_id}/authz/resource-server/permission/resource/${create_permission.output.body.id}",
"body" : {
"name": "Default Permission",
"description": "",
"type" : "resource",
"logic": "POSITIVE",
"decisionStrategy": "AFFIRMATIVE",
"policies" : "${policy_list.output.result}"
},
"method" : "PUT",
"headers" : {
"Authorization" : "Bearer ${authorize5.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name" : "fork_subworkflows",
"type" : "FORK_JOIN",
"taskReferenceName" : "parallel_call_subworkflows",
"forkTasks" : [
[
{
"name": "sub_workflow_task",
"taskReferenceName": "call_enable_workspace_clients_for_context",
"subWorkflowParam": {
"name": "enable_workspace_clients_for_context"
},
"inputParameters": {
"context" : "${workflow.input.context}"
},
"type": "SUB_WORKFLOW"
}
],
[
{
"name": "sub_workflow_task",
"taskReferenceName": "call_jupyterhub_add_serveroptions_to_context",
"subWorkflowParam": {
"name": "jupyterhub_add_serveroptions_to_context"
},
"inputParameters": {
"context" : "${workflow.input.context}"
},
"type": "SUB_WORKFLOW"
}
],
[
{
"name": "sub_workflow_task",
"taskReferenceName": "call_record_context_to_is",
"subWorkflowParam": {
"name": "record_context_to_is"
},
"inputParameters": {
"context" : "${workflow.input.context}"
},
"type": "SUB_WORKFLOW"
}
],
[
{
"name": "sub_workflow_task",
"taskReferenceName": "call_create_vre_folder_for_context",
"subWorkflowParam": {
"name": "create_vre_folder_for_context"
},
"inputParameters": {
"context" : "${workflow.input.context}",
"folder_owner" : "${workflow.input.folder_owner}",
"folder_admins" : "${workflow.input.folder_admins}"
},
"type": "SUB_WORKFLOW"
}
]
]
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_call_subworkflows",
"joinOn" :[
"call_enable_workspace_clients_for_context",
"call_jupyterhub_add_serveroptions_to_context",
"call_record_context_to_is",
"call_create_vre_folder_for_context"
]
}
]
}

View File

@ -0,0 +1,141 @@
{
"createTime": 1689260185434,
"updateTime": 1689259167761,
"name": "create_vre_folder_for_context",
"description": "Upon creation of a new context, create also a vre folder on the workspace",
"version": 1,
"tasks": [
{
"name": "INLINE_TASK",
"type": "INLINE",
"taskReferenceName": "init",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"base_url": "https://url.gcube.d4science.org/",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"storagehub" : "{{ storagehub }}/workspace",
"ctx": "${workflow.input.context}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))} function f(){if(e($.ctx)) throw('Context must not be empty'); return { shubified_context_name : ($.ctx[0] === '%' ? $.ctx.replace('%2F', '') : $.ctx).split('%2F').join('-') }} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_with_uma_rpt",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${init.input.root_vo}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}"
}
}
},
{
"name": "pyrest",
"taskReferenceName": "create_vre_folder",
"inputParameters": {
"url": "${init.input.storagehub}/groups",
"method": "POST",
"headers": {
"Authorization": "Bearer ${authorize_with_uma_rpt.output.body.access_token}",
"Accept": "text/plain",
"Content-Type": "multipart/form-data"
},
"body": {
"accessType": [
"WRITE_OWNER",
"application/json"
],
"group": "${init.output.result.shubified_context_name}",
"folderOwner": "${workflow.input.folder_owner}"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_vre_folder_users_tasks",
"type": "INLINE",
"inputParameters": {
"admins" : "${workflow.input.folder_admins}",
"url": "${init.input.storagehub}/groups/${init.output.result.shubified_context_name}/users",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.admins.length;i++)a=$.admins[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'tu_'+i}),inputs['tu_'+i]={url:$.url,body:{userId:a},method:'PUT',headers:{Authorization:'Bearer ${authorize_with_uma_rpt.output.body.access_token}', Accept: 'text/plain'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_vre_folder_users",
"inputParameters" : {
"tasks" : "${build_add_vre_folder_users_tasks.output.result.tasks}",
"inputs" : "${build_add_vre_folder_users_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_add_vre_folder_users"
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_vre_folder_admins_tasks",
"type": "INLINE",
"inputParameters": {
"admins" : "${workflow.input.folder_admins}",
"url": "${init.input.storagehub}/groups/${init.output.result.shubified_context_name}/admins",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.admins.length;i++)a=$.admins[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'ta_'+i}),inputs['ta_'+i]={url:$.url,body:{userId:a},method:'PUT',headers:{Authorization:'Bearer ${authorize_with_uma_rpt.output.body.access_token}', Accept: 'text/plain'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_vre_folder_admins",
"inputParameters" : {
"tasks" : "${build_add_vre_folder_admins_tasks.output.result.tasks}",
"inputs" : "${build_add_vre_folder_admins_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_add_vre_folder_admins"
}
],
"inputParameters": [
"context",
"folder_owner",
"folder_admins"
],
"outputParameters": {},
"schemaVersion": 2,
"restartable": true,
"workflowStatusListenerEnabled": false,
"ownerEmail": "example@email.com",
"timeoutPolicy": "ALERT_ONLY",
"timeoutSeconds": 0,
"variables": {},
"inputTemplate": {}
}

View File

@ -0,0 +1,259 @@
{
"ownerApp" : "Orchestrator",
"name" : "create_workspace_client",
"createBy" : "Marco Lettere",
"description": "Create a WorkSpace Client and hook it up to optional list ov contexts. Check or create the settings on Shub.",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "client_secret", "description", "context_list"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"storagehub" : "{{ storagehub }}",
"id" : "${workflow.input.client_id}",
"secret" : "${workflow.input.client_secret}",
"description" : "${workflow.input.description}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty'); return { encoded_root_vo : encodeURI($.root_vo), client : { clientId : $.id, description : ($.description ? $.description : $.id), secret : ($.secret ? $.secret : Java.type('java.util.UUID').randomUUID().toString()), rootUrl : '', enabled : true, serviceAccountsEnabled : true, standardFlowEnabled : true, authorizationServicesEnabled : false, publicClient : false, fullScopeAllowed : true, protocol : 'openid-connect'}}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "fork1",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "create_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"body" : "${init.output.result.client}",
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_client_id",
"type": "INLINE",
"inputParameters": {
"client_location" : "${create_client.output.headers.location}",
"evaluatorType" :"javascript",
"expression": "var client_id = $.client_location.split('/').pop(); function f(){return {'client_resource_id' : client_id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_resource_id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=${init.output.result.encoded_root_vo}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo_member_role",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${get_rootvo.output.body[0].id}/roles/Member",
"method" : "GET",
"expect" : [200, 404],
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
]
]
},
{
"name": "join",
"taskReferenceName": "join1",
"type": "JOIN",
"joinOn": [
"get_service_account_user",
"get_rootvo_member_role"
]
},
{
"name": "jq_1",
"taskReferenceName": "to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${get_rootvo_member_role.output.body}",
"queryExpression" : ".role"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/clients/${get_rootvo_member_role.output.body.containerId}",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${to_array.output.resultList}"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_with_uma_rpt",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${init.input.root_vo}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "${workflow.input.client_id}",
"client_secret" : "${init.output.result.client.secret}"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "check_workspace",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.storagehub}/workspace",
"method" : "GET",
"expect" : [200, 406],
"headers" : {
"Accept" : "application/json",
"Authorization" : "Bearer ${authorize_with_uma_rpt.output.body.access_token}"
}
}
},
{
"name": "decision",
"taskReferenceName": "check_workspace_existance",
"inputParameters": {
"status": "${check_workspace.output.status}"
},
"type": "SWITCH",
"evaluatorType" : "javascript",
"expression": "($.status === 406 ? 'create' : 'exists')",
"decisionCases": {
"create": [
{
"name" : "pyrest",
"taskReferenceName" : "upgrade_orchestrator_token_to_uma",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json",
"Authorization" : "Bearer ${authorize.output.body.access_token}"
},
"body" : {
"audience" : "${init.input.root_vo}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "create_jcr_account",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.storagehub}/workspace/users",
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${upgrade_orchestrator_token_to_uma.output.body.access_token}"
},
"body" : {
"user" : "${get_service_account_user.output.body.username}",
"password" : "r3u4h-ewrqwli!_m"
}
}
}
]
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_tasks_to_add_ws_client_to_all_contexts",
"type": "INLINE",
"inputParameters": {
"context_list" : "${workflow.input.context_list}",
"client_id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.context_list.length;i++)c=$.context_list[i],tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'add_workspace_client_to_context_'+i, subWorkflowParam:{ name:'add_workspace_client_to_context'}}),inputs['add_workspace_client_to_context_'+i]={client_id : $.client_id, context: c};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_tasks_to_add_ws_client_to_all_contexts",
"inputParameters" : {
"tasks" : "${build_tasks_to_add_ws_client_to_all_contexts.output.result.tasks}",
"inputs" : "${build_tasks_to_add_ws_client_to_all_contexts.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_build_tasks_to_add_ws_client_to_all_contexts"
}
]
}

View File

@ -7,175 +7,233 @@
"ownerEmail" : "m.lettere@gmail.com", "ownerEmail" : "m.lettere@gmail.com",
"inputParameters" : [ "userid" ], "inputParameters" : [ "userid" ],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/${workflow.input.realm}", "root_vo": "{{ root_vo }}",
"keycloak_admin" : "{{ keycloak_admin }}/${workflow.input.realm}", "keycloak": "{{ keycloak }}/${workflow.input.realm}",
"liferay": "{{ liferay }}", "keycloak_admin" : "{{ keycloak_admin }}/${workflow.input.realm}",
"liferay_auth": "{{ liferay_auth }}", "liferay": "{{ liferay }}",
"keycloak_userid" : "${workflow.input.userid}", "liferay_auth": "{{ liferay_auth }}",
"scriptExpression": "1 == 1" "keycloak_userid" : "${workflow.input.userid}",
} "evaluatorType" : "javascript",
"expression": "function f(){ return { 'decoded_root_vo' : $.root_vo.replace('%2F','/'), 'encoded_root_vo' : encodeURIComponent($.root_vo)}} f()"
}
}, },
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "authorize", "taskReferenceName" : "authorize",
"type" : "SIMPLE", "type" : "SIMPLE",
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token", "url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST", "method" : "POST",
"headers" : { "headers" : {
"Accept" : "application/json" "Accept" : "application/json"
}, },
"body" : { "body" : {
"client_id" : "orchestrator", "client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}", "client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials" "grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${init.input.keycloak_userid}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "global_delete_user",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_company",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/company/get-company-by-web-id",
"method" : "GET",
"params" : { "webId" : "liferay.com"},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_user_by_screenname",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/user/get-user-by-screen-name",
"method" : "GET",
"params" : {
"companyId" : "${lookup_lr_company.output.body.companyId}",
"screenName" : "${lookup_user.output.body.username}"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_user_groups",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/group/get-user-sites-groups",
"method" : "GET",
"params" : {
"classNames" : "[\"com.liferay.portal.model.Group\"]",
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}",
"max" : "-1"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name": "LAMBDA_TASK",
"taskReferenceName": "build_delete_group_tasks",
"type": "LAMBDA",
"inputParameters": {
"groups" : "${lookup_lr_user_groups.output.body.*.groupId}",
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}",
"scriptExpression": "inputs = {}; tasks = []; for(var i=0;i<$.groups.length;i++){tasks.push({'name': 'pyrest','type' : 'SIMPLE','taskReferenceName' : 'del-' + i});inputs['del-'+i] = {'url' : '${init.input.liferay}/user/unset-group-users?userIds=' + $.userId + '&groupId=' + $.groups[i],'method' : 'POST','headers' : {'Authorization' : 'Basic ' + '${init.input.liferay_auth}', 'Accept' : 'application/json'}}}; return { 'tasks' : Java.to(tasks, 'java.util.Map[]'), 'inputs' : inputs};"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_delete_group",
"inputParameters" : {
"tasks" : "${build_delete_group_tasks.output.result.tasks}",
"inputs" : "${build_delete_group_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_group_deletion"
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_lr_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/user/delete-user",
"method" : "POST",
"params" : {
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name": "LAMBDA_TASK",
"taskReferenceName": "lr_final_task",
"type": "LAMBDA",
"inputParameters" : {
"scriptExpression" : "1 == 1"
}
}
]
]
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "global_delete_user_join",
"joinOn": [ "lr_final_task"]
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_keycloak_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${init.input.keycloak_userid}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
} }
} }
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${init.input.keycloak_userid}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "global_delete_user",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_company",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/company/get-company-by-web-id",
"method" : "GET",
"params" : { "webId" : "liferay.com"},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_user_by_screenname",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/user/get-user-by-screen-name",
"method" : "GET",
"params" : {
"companyId" : "${lookup_lr_company.output.body.companyId}",
"screenName" : "${lookup_user.output.body.username}"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_lr_user_groups",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/group/get-user-sites-groups",
"method" : "GET",
"params" : {
"classNames" : "[\"com.liferay.portal.model.Group\"]",
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}",
"max" : "-1"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_delete_group_tasks",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"groups" : "${lookup_lr_user_groups.output.body.*.groupId}",
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}",
"expression": "inputs = {}; tasks = []; function f(){ for(var i=0;i<$.groups.length;i++){tasks.push({'name': 'pyrest','type' : 'SIMPLE','taskReferenceName' : 'del-' + i});inputs['del-'+i] = {'url' : '${init.input.liferay}/user/unset-group-users?userIds=' + $.userId + '&groupId=' + $.groups[i],'method' : 'POST','headers' : {'Authorization' : 'Basic ' + '${init.input.liferay_auth}', 'Accept' : 'application/json'}}}; return { 'tasks' : Java.to(tasks, 'java.util.Map[]'), 'inputs' : inputs}} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_delete_group",
"inputParameters" : {
"tasks" : "${build_delete_group_tasks.output.result.tasks}",
"inputs" : "${build_delete_group_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_group_deletion"
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_lr_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.liferay}/user/delete-user",
"method" : "POST",
"params" : {
"userId" : "${lookup_lr_user_by_screenname.output.body.userId}"
},
"headers" : {
"Authorization" : "Basic ${init.input.liferay_auth}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "lr_final_task",
"type": "INLINE",
"inputParameters" : {
"evaluatorType" : "javascript",
"expression" : "1 == 1"
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=${init.output.result.encoded_root_vo}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo_roles",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${get_rootvo.output.body[0].id}/roles",
"method" : "GET",
"expect" : [200, 404],
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo_infra_managers",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${get_rootvo.output.body[0].id}/roles/Infrastructure-Manager/users",
"method" : "GET",
"expect" : [200, 404],
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
]
]
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "global_delete_user_join",
"joinOn": [ "lr_final_task", "get_rootvo_infra_managers"]
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_keycloak_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${init.input.keycloak_userid}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pymail",
"taskReferenceName" : "notify_infra_managers",
"type" : "SIMPLE",
"inputParameters" : {
"subject" : "User account REMOVAL notification",
"from" : "noreply@d4science.org",
"to" : "${get_rootvo_infra_managers.output.body.*.email}",
"html" : "<html><body><p>Dear ${init.output.result.decoded_root_vo} Infrastructure Manager,</p><p>${lookup_user.output.body.firstName} ${lookup_user.output.body.lastName} (${lookup_user.output.body.username}) removed his/her account from the portal with the following email: ${lookup_user.output.body.email}</p><p>You received this email because you are an Infrastructure Manager.</p><p>WARNING / LEGAL TEXT: This message is intended only for the use of the individual or entity to which it is addressed and may contain information which is privileged, confidential, proprietary, or exempt from disclosure under applicable law. If you are not the intended recipient or the person responsible for delivering the message to the intended recipient, you are strictly prohibited from disclosing, distributing, copying, or in any way using this message. If you have received this communication in error, please notify the sender and destroy and delete any copies you may have received.</p></body></html>"
}
}
] ]
} }

View File

@ -0,0 +1,76 @@
{
"ownerApp" : "Orchestrator",
"name" : "delete_system_service",
"createBy" : "Marco Lettere",
"description": "Delete a system service from KC and IS",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression" : "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty');} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.client_id}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "check",
"type": "INLINE",
"inputParameters": {
"list" : "${lookup_client.output.body}",
"evaluatorType" : "javascript",
"expression" : "function f(){if($.list.length === 0 || $.list.length > 1) throw('No client found with client_id or ambiguous query returned multiple clients.')} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}"
}
}
}
]
}

View File

@ -0,0 +1,101 @@
{
"ownerApp" : "Orchestrator",
"name" : "enable_workspace_clients_for_context",
"createBy" : "Marco Lettere",
"description": "All workspace clients registered on Information system for given context are enabled for VRE by calling add_workspace_client_to_context",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["filter", "context"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"ctx" : "${workflow.input.context}",
"filter" : "${workflow.input.filter}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))} function f(){if(e($.ctx)) throw('Context must not be empty'); f=$.filter; if(e(f)) f = []; else if(typeof(f) === 'string') f=[f]; else f=Java.from(f); return { encoded_root_vo : encodeURI($.root_vo), filter : Java.to(f,'java.lang.String[]')}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize_with_uma_rpt",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${workflow.input.context}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "query_workspace_clients_on_icproxy",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ ic_proxy }}/icproxy/gcube/service/ServiceEndpoint/SystemWorkspaceClient",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize_with_uma_rpt.output.body.access_token}"
}
}
},
{
"name" : "pyeval",
"taskReferenceName" : "extract_workspace_client_names",
"type" : "SIMPLE",
"inputParameters" : {
"code" : "exec('import xml.etree.ElementTree as ET') or list(map(lambda n: n.text, ET.fromstring(data['xmlstring']).findall('Resource/Profile/Name')))",
"xmlstring" : "${query_workspace_clients_on_icproxy.output.body}"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "filtered_workspace_client_names",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"names" : "${extract_workspace_client_names.output.result}",
"filter" : "${init.output.result.filter}",
"expression": "names=Java.from($.names); filt=Java.from($.filter); function f(){if(filt.length === 0) output=names; else { output=[]; for(i=0;i<names.length;i++){ if(filt.indexOf(names[i]) !== -1) output.push(names[i])}} return { 'names' : Java.to(output, 'java.lang.String[]')}} f()"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_workspace_client_to_context_tasks",
"type": "INLINE",
"inputParameters": {
"context" : "${workflow.input.context}",
"names" : "${filtered_workspace_client_names.output.result.names}",
"evaluatorType" : "javascript",
"expression": "inputs={};tasks=[];function f(){for(var i=0;i<$.names.length;i++){tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'call_add_ws_client_to_context_'+i, subWorkflowParam:{ name:'add_workspace_client_to_context'}});inputs['call_add_ws_client_to_context_'+i]={client_id:$.names[i], context:$.context}} return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_workspace_client_to_context_tasks",
"inputParameters" : {
"tasks" : "${build_add_workspace_client_to_context_tasks.output.result.tasks}",
"inputs" : "${build_add_workspace_client_to_context_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_add_workspace_client_to_context_tasks"
}
]
}

View File

@ -0,0 +1,159 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_add_to_context",
"createBy" : "Marco Lettere",
"description": "A GHN client is made Member of a context and it's workspace folder is linked to context's shared folder",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"ctx" : "${workflow.input.context}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id) || e($.ctx)) throw('Client ID and Context must not be empty'); else return { encoded_context : $.ctx.replaceAll('/', '%2F')}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "fork1",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.client_id}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_ghn_client",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_client.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('GHN client not found'); else return { client : $.client[0], id : $.client[0].id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_ghn_client.output.result.id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_context",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${init.output.result.encoded_context}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_context",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_context.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('Context not found'); else return { client : $.client[0], id: $.client[0].id }} f()"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_context.output.result.id}/roles/Member",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "roles_to_assign",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${retrieve_member_role.output.body}",
"queryExpression" : ".role"
}
}
]
]
},
{
"name": "join",
"taskReferenceName": "join1",
"type": "JOIN",
"joinOn": [
"get_service_account_user",
"roles_to_assign"
]
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/clients/${retrieve_member_role.output.body.containerId}",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${roles_to_assign.output.resultList}"
}
}
]
}

View File

@ -0,0 +1,51 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_add_to_contexts",
"createBy" : "Marco Lettere",
"description": "A client for a GHN is made Member of all the contexts passed as input by calling the ghn_client_add_to_context sub-workflow",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context_list"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty'); return { }} f()"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_tasks_to_add_ghn_client_to_all_contexts",
"type": "INLINE",
"inputParameters": {
"context_list" : "${workflow.input.context_list}",
"client_id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.context_list.length;i++)c=$.context_list[i],tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'add_ghn_client_to_context_'+i, subWorkflowParam:{ name:'ghn_client_add_to_context'}}),inputs['add_ghn_client_to_context_'+i]={client_id : $.client_id, context: c};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_tasks_to_add_ghn_client_to_all_contexts",
"inputParameters" : {
"tasks" : "${build_tasks_to_add_ghn_client_to_all_contexts.output.result.tasks}",
"inputs" : "${build_tasks_to_add_ghn_client_to_all_contexts.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_build_tasks_to_add_ghn_client_to_all_contexts"
}
]
}

View File

@ -0,0 +1,180 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_create",
"createBy" : "Marco Lettere",
"description": "Create a client on IAM to represent SmartGears based GHNodes",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "client_secret", "description", "context_list"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"root_vo": "{{ root_vo }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"storagehub" : "{{ storagehub }}",
"id" : "${workflow.input.client_id}",
"secret" : "${workflow.input.client_secret}",
"description" : "${workflow.input.description}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty'); return { encoded_root_vo : encodeURI($.root_vo), client : { clientId : $.id, description : ($.description ? $.description : $.id), secret : ($.secret ? $.secret : Java.type('java.util.UUID').randomUUID().toString()), rootUrl : '', enabled : true, serviceAccountsEnabled : true, standardFlowEnabled : true, authorizationServicesEnabled : false, publicClient : false, fullScopeAllowed : true, protocol : 'openid-connect'}}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "fork1",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "create_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"body" : "${init.output.result.client}",
"method" : "POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_client_id",
"type": "INLINE",
"inputParameters": {
"client_location" : "${create_client.output.headers.location}",
"evaluatorType" : "javascript",
"expression": "var client_id = $.client_location.split('/').pop(); function f(){return {'client_resource_id' : client_id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_client_id.output.result.client_resource_id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=${init.output.result.encoded_root_vo}",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_rootvo_member_role",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${get_rootvo.output.body[0].id}/roles/Member",
"method" : "GET",
"expect" : [200, 404],
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
]
]
},
{
"name": "join",
"taskReferenceName": "join1",
"type": "JOIN",
"joinOn": [
"get_service_account_user",
"get_rootvo_member_role"
]
},
{
"name": "jq_1",
"taskReferenceName": "to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${get_rootvo_member_role.output.body}",
"queryExpression" : ".role"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "assign_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/clients/${get_rootvo_member_role.output.body.containerId}",
"method" :"POST",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json",
"Accept":"application/json"
},
"body" : "${to_array.output.resultList}"
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_tasks_to_add_ghn_client_to_all_contexts",
"type": "INLINE",
"inputParameters": {
"context_list" : "${workflow.input.context_list}",
"client_id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.context_list.length;i++)c=$.context_list[i],tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'add_ghn_client_to_context_'+i, subWorkflowParam:{ name:'ghn_client_add_to_context'}}),inputs['add_ghn_client_to_context_'+i]={client_id : $.client_id, context: c};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_tasks_to_add_ghn_client_to_all_contexts",
"inputParameters" : {
"tasks" : "${build_tasks_to_add_ghn_client_to_all_contexts.output.result.tasks}",
"inputs" : "${build_tasks_to_add_ghn_client_to_all_contexts.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_build_tasks_to_add_ghn_client_to_all_contexts"
}
]
}

View File

@ -0,0 +1,76 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_delete",
"createBy" : "Marco Lettere",
"description": "Delete a GHN client from IAM",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression" : "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty');} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.client_id}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "check",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"list" : "${lookup_client.output.body}",
"expression" : "if($.list.length === 0 || $.list.length > 1) throw('No client found with client_id or ambiguous query returned multiple clients.')"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}"
}
}
}
]
}

View File

@ -0,0 +1,159 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_remove_from_context",
"createBy" : "Marco Lettere",
"description": "The role Memeber of the give context is removed from a GHN client on IAM.",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"ctx" : "${workflow.input.context}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id) || e($.ctx)) throw('Client ID and Context must not be empty'); else return { encoded_context : $.ctx.replaceAll('/', '%2F')}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "fork_join",
"taskReferenceName" : "fork1",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.client_id}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_ghn_client",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_client.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('GHN client not found'); else return { client : $.client[0], id : $.client[0].id}} f()"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_service_account_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_ghn_client.output.result.id}/service-account-user",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "lookup_context",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${init.output.result.encoded_context}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_context",
"type": "INLINE",
"inputParameters": {
"client" : "${lookup_context.output.body}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v.length === 0)}; function f(){if(e($.client)) throw('Context not found'); else return { client : $.client[0], id: $.client[0].id }} f()"
}
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "retrieve_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${extract_context.output.result.id}/roles/Member",
"method" :"GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "jq_1",
"taskReferenceName": "roles_to_remove",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${retrieve_member_role.output.body}",
"queryExpression" : ".role"
}
}
]
]
},
{
"name": "join",
"taskReferenceName": "join1",
"type": "JOIN",
"joinOn": [
"get_service_account_user",
"roles_to_remove"
]
},
{
"name" : "pyrest",
"type" : "SIMPLE",
"taskReferenceName": "remove_member_role",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${get_service_account_user.output.body.id}/role-mappings/clients/${retrieve_member_role.output.body.containerId}",
"method" :"DELETE",
"expect" : 204,
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
},
"body" : "${roles_to_remove.output.resultList}"
}
}
]
}

View File

@ -0,0 +1,51 @@
{
"ownerApp" : "Orchestrator",
"name" : "ghn_client_remove_from_contexts",
"createBy" : "Marco Lettere",
"description": "The role Member for of all the passed contexts is removed from a GHN client",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["client_id", "context_list"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"id" : "${workflow.input.client_id}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.id)) throw('Client ID must not be empty'); return { }} f()"
}
},
{
"name": "INLINE",
"taskReferenceName": "build_tasks_to_remove_ghn_client_from_all_contexts",
"type": "INLINE",
"inputParameters": {
"context_list" : "${workflow.input.context_list}",
"client_id" : "${workflow.input.client_id}",
"evaluatorType" : "javascript",
"expression": "inputs={},tasks=[]; function f(){for(var i=0;i<$.context_list.length;i++)c=$.context_list[i],tasks.push({name:'sub_workflow_task',type:'SUB_WORKFLOW',taskReferenceName:'remove_ghn_client_from_context_'+i, subWorkflowParam:{ name:'ghn_client_remove_from_context'}}),inputs['remove_ghn_client_from_context_'+i]={client_id : $.client_id, context: c};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs};} f()"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_build_tasks_to_remove_ghn_client_from_all_contexts",
"inputParameters" : {
"tasks" : "${build_tasks_to_remove_ghn_client_from_all_contexts.output.result.tasks}",
"inputs" : "${build_tasks_to_remove_ghn_client_from_all_contexts.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_build_tasks_to_remove_ghn_client_from_all_contexts"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -8,14 +8,15 @@
"inputParameters" : ["user", "group"], "inputParameters" : ["user", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"group" : "${workflow.input.group}", "group" : "${workflow.input.group}",
"scriptExpression" : "return $.group.split('%2F').join('/')" "evaluatorType" : "javascript",
"expression" : "function f(){return $.group.split('%2F').join('/')} f()"
} }
}, },
{ {
@ -75,13 +76,14 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "find_group_by_path", "taskReferenceName": "find_group_by_path",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"evaluatorType" : "javascript",
"path" : "${init.output.result}", "path" : "${init.output.result}",
"groups" : "${list_kc_groups.output.body}", "groups" : "${list_kc_groups.output.body}",
"scriptExpression": "function recurse(inp){for(var i=0;i<inp.length;i++){if(inp[i]['path'] === $.path) return inp[i]; else{var subr = recurse(inp[i].subGroups); if(subr != null) return subr;}} return null}; return recurse($.groups)" "expression": "function recurse(inp){for(var i=0;i<inp.length;i++){if(inp[i]['path'] === $.path) return inp[i]; else{var subr = recurse(inp[i].subGroups); if(subr != null) return subr;}} return null}; recurse($.groups)"
} }
}, },
{ {

View File

@ -8,13 +8,14 @@
"inputParameters" : ["user", "first-name", "last-name", "email", "password"], "inputParameters" : ["user", "first-name", "last-name", "email", "password"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"scriptExpression": "1" "evaluatorType" : "javascript",
"expression": "1"
} }
}, },
{ {
@ -40,7 +41,7 @@
"type" : "SIMPLE", "type" : "SIMPLE",
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak_admin}/users", "url" : "${init.input.keycloak_admin}/users",
"expect" : 201, "expect" : [201, 409],
"method" : "POST", "method" : "POST",
"body" : { "body" : {
"username": "${workflow.input.user}", "username": "${workflow.input.user}",

View File

@ -0,0 +1,385 @@
{
"createTime": 1657617957794,
"updateTime": 1657639881455,
"name": "jupyterhub_add_serveroptions_to_context",
"description": "Reflects the JupyterHub ServerOptions from a given IS Context to the AuthZ on the IAM",
"version": 1,
"tasks": [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin": "{{ keycloak_admin }}/{{ keycloak_realm }}",
"ctx": "${workflow.input.context}",
"jupyterhub_clientid" : "jupyterhub1",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.ctx)) throw('Context must not be empty'); else return { encoded_context : $.ctx.replaceAll('/', '%2F')}} f()"
},
"type": "INLINE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "pyrest",
"taskReferenceName": "authorize",
"inputParameters": {
"url": "{{ keycloak }}/master/protocol/openid-connect/token",
"method": "POST",
"headers": {
"Accept": "application/json"
},
"body": {
"client_id": "orchestrator",
"client_secret": "{{ keycloak_auth_master }}",
"grant_type": "client_credentials"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "fork_join",
"taskReferenceName": "pre-query",
"inputParameters": {},
"type": "FORK_JOIN",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [
[
{
"name": "pyrest",
"taskReferenceName": "lookup_client",
"inputParameters": {
"url": "${init.input.keycloak_admin}/clients",
"params": {
"clientId": "${init.output.result.encoded_context}"
},
"method": "GET",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Accept": "application/json"
}
},
"type": "SIMPLE"
},
{
"name": "pyrest",
"taskReferenceName": "get_client_member_role",
"inputParameters": {
"url": "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}/roles/Member",
"method": "GET",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Accept": "application/json"
}
},
"type": "SIMPLE"
},
{
"name": "jq_1",
"taskReferenceName": "role_to_array",
"type": "JSON_JQ_TRANSFORM",
"inputParameters": {
"role": "${get_client_member_role.output.body}",
"queryExpression" : ".role"
}
}
],
[
{
"name": "pyrest",
"taskReferenceName": "lookup_jupyterhub",
"inputParameters": {
"url": "${init.input.keycloak_admin}/clients",
"params": {
"clientId": "${init.input.jupyterhub_clientid}"
},
"method": "GET",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Accept": "application/json"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "pyrest",
"taskReferenceName": "lookup_jupyterhub_resources",
"inputParameters": {
"url": "${init.input.keycloak_admin}/clients/${lookup_jupyterhub.output.body[0].id}/authz/resource-server/resource",
"params": {
"clientId": "${init.input.jupyterhub_clientid}"
},
"method": "GET",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Accept": "application/json"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
}
],
[
{
"name": "pyrest",
"taskReferenceName": "authorize_with_uma_rpt",
"inputParameters": {
"url": "{{ keycloak }}/{{ keycloak_realm }}/protocol/openid-connect/token",
"method": "POST",
"headers": {
"Accept": "application/json"
},
"body": {
"audience": "${init.output.result.encoded_context}",
"grant_type": "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id": "orchestrator",
"client_secret": "{{ keycloak_auth }}"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "pyrest",
"taskReferenceName": "lookup_resources_on_icproxy",
"inputParameters": {
"url": "{{ ic_proxy }}/icproxy/gcube/service/GenericResource/JupyterHub",
"method": "GET",
"headers": {
"Authorization": "Bearer ${authorize_with_uma_rpt.output.body.access_token}"
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "pyeval",
"taskReferenceName": "extract_authids",
"inputParameters": {
"code": "exec('import xml.etree.ElementTree as ET') or list(map(lambda n: n.text, ET.fromstring(data['xmlstring']).findall('Resource/Profile/Body/ServerOption/AuthId')))",
"xmlstring": "${lookup_resources_on_icproxy.output.body}"
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
}
]
],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "join",
"taskReferenceName": "join-pre-query",
"inputParameters": {},
"type": "JOIN",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [
"lookup_jupyterhub_resources",
"extract_authids"
],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "INLINE_TASK",
"taskReferenceName": "check",
"inputParameters": {
"evaluatorType" : "javascript",
"param": "ok",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; function f(){if(e($.param)) throw('Param must not be empty'); else return $.param} f()"
},
"type": "INLINE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "INLINE_TASK",
"taskReferenceName": "filter_and_update",
"inputParameters": {
"evaluatorType" : "javascript",
"allowed": "${extract_authids.output.result}",
"res": "${lookup_jupyterhub_resources.output.body}",
"ctx": "${init.output.result.encoded_context}",
"expression": "var ret = []; function f(){for(var r=0; r < $.res.length; r++){ if($.allowed.indexOf($.res[r].name) !== -1){ $.res[r].attributes[$.ctx] = Java.to(['true'], 'java.lang.String[]'); ret.push($.res[r]) } } return Java.to(ret, 'java.util.Map[]')} f()"
},
"type": "INLINE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_parallel_tasks",
"inputParameters": {
"evaluatorType" : "javascript",
"res": "${filter_and_update.output.result}",
"url": "${init.input.keycloak_admin}/clients/${lookup_jupyterhub.output.body[0].id}/authz/resource-server/resource/",
"expression": "inputs = {}, tasks = [];function f(){for (var i = 0; i < $.res.length; i++){s = $.res[i];tasks.push({name: 'pyrest',type: 'SIMPLE',taskReferenceName: 't' + i});inputs['t' + i] = {url: $.url + $.res[i]._id,method: 'PUT', body: $.res[i], headers: {Authorization: 'Bearer ${authorize.output.body.access_token}', 'Content-Type': 'application/json'}}};return {tasks: Java.to(tasks, 'java.util.Map[]'),inputs: inputs};} f()"
},
"type": "INLINE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "fork_dynamic",
"taskReferenceName": "parallel_tasks",
"inputParameters": {
"tasks": "${build_parallel_tasks.output.result.tasks}",
"inputs": "${build_parallel_tasks.output.result.inputs}"
},
"type": "FORK_JOIN_DYNAMIC",
"decisionCases": {},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs",
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
},
{
"name": "join",
"taskReferenceName": "join_parallel_tasks",
"inputParameters": {},
"type": "JOIN"
},
{
"name": "check_at_least_one",
"taskReferenceName": "check_at_least_one",
"inputParameters": {
"tasks": "${join_parallel_tasks.input.*}"
},
"type": "SWITCH",
"evaluatorType" : "javascript",
"expression": "($.tasks.length > 0 ? 'true' : 'false')",
"decisionCases": {
"true": [
{
"name": "pyrest",
"taskReferenceName": "enable_jupyterhub_scope_for_context",
"inputParameters": {
"url": "${init.input.keycloak_admin}/clients/${lookup_jupyterhub.output.body[0].id}/scope-mappings/clients/${lookup_client.output.body[0].id}",
"method": "POST",
"headers": {
"Authorization": "Bearer ${authorize.output.body.access_token}",
"Content-Type": "application/json"
},
"body": "${role_to_array.output.resultList}"
},
"type": "SIMPLE"
}
]
},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
}
],
"inputParameters": [
"context"
],
"outputParameters": {},
"schemaVersion": 2,
"restartable": true,
"workflowStatusListenerEnabled": false,
"ownerEmail": "example@email.com",
"timeoutPolicy": "ALERT_ONLY",
"timeoutSeconds": 0,
"variables": {},
"inputTemplate": {}
}

View File

@ -0,0 +1,179 @@
{
"createTime": 1689254203836,
"updateTime": 1689259676819,
"name": "record_context_to_is",
"description": "Upon creation of a new context, record it to the Information System",
"version": 1,
"tasks": [
{
"name": "INLINE_TASK",
"type" : "INLINE",
"taskReferenceName": "init",
"inputParameters": {
"base_url": "{{is_url}}/resource-registry/contexts",
"root_vo": "{{ root_vo }}",
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"ctx": "${workflow.input.context}",
"ic_proxy" : "{{ ic_proxy }}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))} function f(){if(e($.ctx)) throw('Context must not be empty'); var tree = $.ctx.split('%2F'); return { child : tree[tree.length - 1], parent : tree[tree.length-2], decoded_root_vo : $.root_vo.replace('%2F', '/') }} f()"
}
},
{
"name" : "parallel_ic_proxy_queries",
"taskReferenceName" : "parallel_ic_proxy_queries",
"type" : "FORK_JOIN",
"forkTasks" : [
[
{
"name" : "pyrest",
"taskReferenceName" : "authorize_uma_rootvo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${init.input.root_vo}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "retrieve_infrastructure",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ ic_proxy }}/icproxy/gcube/service/GenericResource/INFRASTRUCTURE",
"method" : "GET",
"headers" : {
"Accept" : "application/xml",
"Authorization" : "Bearer ${authorize_uma_rootvo.output.body.access_token}"
}
}
},
{
"name" : "pyeval",
"taskReferenceName" : "extract_infrastructure_id",
"type" : "SIMPLE",
"inputParameters" : {
"code" : "exec('import xml.etree.ElementTree as ET') or list(map(lambda n: n.text, ET.fromstring(data['xmlstring']).findall('Resource/Profile/Body/infrastructures/infrastructure/vos/vo[scope=\\'${init.output.result.decoded_root_vo}/${init.output.result.parent}\\'].id')))",
"xmlstring" : "${retrieve_infrastructure.output.body}"
}
}
],
[
{
"name" : "pyrest",
"taskReferenceName" : "authorize_uma_parent_vo",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak}/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"audience" : "${init.input.root_vo}%2F${init.output.result.parent}",
"grant_type" : "urn:ietf:params:oauth:grant-type:uma-ticket",
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth }}"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "retrieve_vre",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ ic_proxy }}/icproxy/gcube/service/GenericResource/VRE/${init.output.result.child}",
"method" : "GET",
"headers" : {
"Accept" : "application/xml",
"Authorization" : "Bearer ${authorize_uma_parent_vo.output.body.access_token}"
}
}
},
{
"name" : "pyeval",
"taskReferenceName" : "extract_vre_id",
"type" : "SIMPLE",
"inputParameters" : {
"code" : "exec('import xml.etree.ElementTree as ET') or list(map(lambda n: n.text, ET.fromstring(data['xmlstring']).findall('Resource/ID')))",
"xmlstring" : "${retrieve_vre.output.body}"
}
}
]
]
},
{
"name": "notification_join",
"taskReferenceName": "notification_join_ref",
"type": "JOIN",
"joinOn": ["extract_infrastructure_id", "extract_vre_id"]
},
{
"type" : "INLINE",
"name": "INLINE_TASK",
"taskReferenceName": "check",
"inputParameters": {
"vre": "${extract_vre_id.output.result[0]}",
"infra": "${extract_infrastructure_id.output.result[0]}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))} function f(){if(e($.vre) || e($.infra)) throw('VRE ID and Infra ID must not be empty');} f()"
}
},
{
"name": "pyrest",
"taskReferenceName": "write_to_is",
"inputParameters": {
"url": "${init.input.base_url}/${extract_vre_id.output.result[0]}",
"method": "PUT",
"headers": {
"Authorization": "Bearer ${authorize_uma_rootvo.output.body.access_token}",
"Content-Type": "application/json",
"Accept" : "application/json"
},
"body": {
"type": "Context",
"id": "${extract_vre_id.output.result[0]}",
"name": "${init.output.result.child}",
"parent": {
"type": "IsParentOf",
"source": {
"type": "Context",
"id": "${extract_infrastructure_id.output.result[0]}"
}
}
}
},
"type": "SIMPLE",
"decisionCases": {},
"defaultCase": [],
"forkTasks": [],
"startDelay": 0,
"joinOn": [],
"optional": false,
"defaultExclusiveJoinTask": [],
"asyncComplete": false,
"loopOver": []
}
],
"inputParameters": [
"context"
],
"outputParameters": {},
"schemaVersion": 2,
"restartable": true,
"workflowStatusListenerEnabled": false,
"ownerEmail": "example@email.com",
"timeoutPolicy": "ALERT_ONLY",
"timeoutSeconds": 0,
"variables": {},
"inputTemplate": {}
}

View File

@ -0,0 +1,173 @@
{
"ownerApp" : "Orchestrator",
"name" : "role_created",
"createBy" : "Marco Lettere",
"description": "Handle workflow related to Portal event role_created",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["role", "first", "max"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "1 == 1"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_all_vres",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=%252F&search=true",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize2",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_add_role_tasks",
"type": "INLINE",
"inputParameters": {
"role" : "${workflow.input.role}",
"vres" : "${get_all_vres.output.body}",
"evaluatorType" : "javascript",
"expression": "inputs={};tasks=[];function f(){for(var i=0;i<$.vres.length;i++)vre=$.vres[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'create_role_'+i}),inputs['create_role_'+i]={url:'${init.input.keycloak_admin}/clients/' + vre.id + '/roles',body:{clientRole:true,name:$.role,description: $.role + ' role'},method:'POST',headers:{Authorization:'Bearer ${authorize2.output.body.access_token}','Content-Type':'application/json'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs}} f();"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_add_role",
"inputParameters" : {
"tasks" : "${build_add_role_tasks.output.result.tasks}",
"inputs" : "${build_add_role_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_role_addition"
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize3",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_get_back_role_tasks",
"type": "INLINE",
"inputParameters": {
"evaluatorType" : "javascript",
"roleurls" : "${join_parallel_role_addition.output[*]..location}",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.roleurls.length;i++)u=$.roleurls[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'get_back_'+i}),inputs['get_back_'+i]={url:u,method:'GET',headers:{Authorization:'Bearer ${authorize3.output.body.access_token}',Accept:'application/json'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs}} f();"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_get_back_role",
"inputParameters" : {
"tasks" : "${build_get_back_role_tasks.output.result.tasks}",
"inputs" : "${build_get_back_role_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_getting_back"
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_policy_permission_tasks",
"inputParameters": {
"evaluatorType": "javascript",
"roles": "${join_parallel_getting_back.output[*].body}",
"iam_master": "{{ keycloak }}/master/protocol/openid-connect/token",
"iam_admin": "${init.input.keycloak_admin}",
"user": "orchestrator",
"pass": "{{ keycloak_auth_master }}",
"playbook": "LSBuYW1lOiB0ZXN0CiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogICAgLSBuYW1lOiAiQXV0aG9yaXplIgogICAgICB1cmk6IAogICAgICAgIHVybDogInt7aWFtX21hc3Rlcn19IgogICAgICAgIHVzZXI6ICJ7e3VzZXJ9fSIKICAgICAgICBwYXNzd29yZCA6ICJ7e3Bhc3N3fX0iCiAgICAgICAgZm9yY2VfYmFzaWNfYXV0aDogdHJ1ZQogICAgICAgIG1ldGhvZDogUE9TVAogICAgICAgIGJvZHlfZm9ybWF0OiAiZm9ybS11cmxlbmNvZGVkIiAKICAgICAgICBib2R5OgogICAgICAgICAgLSBbZ3JhbnRfdHlwZSxjbGllbnRfY3JlZGVudGlhbHNdCiAgICAgIHJlZ2lzdGVyOiBhdXRoX3Jlc3AKICAgIAogICAgLSBzZXRfZmFjdDoKICAgICAgICB0b2sgOiAie3sgYXV0aF9yZXNwLmpzb24uYWNjZXNzX3Rva2VuIH19IgoKICAgIC0gbmFtZTogIlJldHJpZXZlIGRlZmF1bHQgcGVybWlzc2lvbiIKICAgICAgdXJpOgogICAgICAgIHVybDogInt7IGlhbV9hZG1pbiB9fS9jbGllbnRzL3t7IHJvbGUuY29udGFpbmVySWQgfX0vYXV0aHovcmVzb3VyY2Utc2VydmVyL3Blcm1pc3Npb24/bmFtZT17eydEZWZhdWx0IFBlcm1pc3Npb24nfHVybGVuY29kZX19IgogICAgICAgIG1ldGhvZDogIkdFVCIKICAgICAgICBoZWFkZXJzOgogICAgICAgICAgQXV0aG9yaXphdGlvbjogIkJlYXJlciB7eyB0b2sgfX0iCiAgICAgIHJlZ2lzdGVyOiBkZWZhdWx0X3Blcm1pc3Npb25fcmVzcAoKICAgIC0gc2V0X2ZhY3Q6CiAgICAgICAgZGVmYXVsdF9wZXJtIDogInt7IGRlZmF1bHRfcGVybWlzc2lvbl9yZXNwLmpzb24gfX0iCiAgICAgIGZhaWxlZF93aGVuOgogICAgICAgIGRlZmF1bHRfcGVybWlzc2lvbl9yZXNwLmpzb258bGVuZ3RoICE9IDEKCiAgICAtIG5hbWU6ICJSZXRyaWV2ZSBkZWZhdWx0IHBlcm1pc3Npb24gcG9saWNpZXMiCiAgICAgIHVyaToKICAgICAgICB1cmw6ICJ7eyBpYW1fYWRtaW4gfX0vY2xpZW50cy97eyByb2xlLmNvbnRhaW5lcklkIH19L2F1dGh6L3Jlc291cmNlLXNlcnZlci9wZXJtaXNzaW9uL3t7ZGVmYXVsdF9wZXJtWzBdLmlkfX0vYXNzb2NpYXRlZFBvbGljaWVzIgogICAgICAgIG1ldGhvZDogIkdFVCIKICAgICAgICBoZWFkZXJzOgogICAgICAgICAgQXV0aG9yaXphdGlvbjogIkJlYXJlciB7eyB0b2sgfX0iCiAgICAgIHJlZ2lzdGVyOiBkZWZhdWx0X3Blcm1pc3Npb25fcG9saWNpZXNfcmVzcAoKICAgIC0gc2V0X2ZhY3Q6CiAgICAgICAgcHJldl9wb2xpY2llcyA6ICJ7eyBkZWZhdWx0X3Blcm1pc3Npb25fcG9saWNpZXNfcmVzcC5qc29uIH19IgogICAgICBmYWlsZWRfd2hlbjoKICAgICAgICBkZWZhdWx0X3Blcm1pc3Npb25fcG9saWNpZXNfcmVzcC5qc29ufGxlbmd0aCA9PSAwCgogICAgLSBuYW1lOiAiQWRkIHBvbGljeSIKICAgICAgdXJpOgogICAgICAgIHVybDogInt7IGlhbV9hZG1pbiB9fS9jbGllbnRzL3t7IHJvbGUuY29udGFpbmVySWQgfX0vYXV0aHovcmVzb3VyY2Utc2VydmVyL3BvbGljeS9yb2xlIgogICAgICAgIG1ldGhvZDogIlBPU1QiCiAgICAgICAgYm9keV9mb3JtYXQ6ICJqc29uIgogICAgICAgIGJvZHk6ICJ7IFwibmFtZVwiIDogXCJ7eyByb2xlLm5hbWV9fV9wb2xpY3lcIiwgXCJkZXNjcmlwdGlvblwiIDogXCJQb2xpY3kgZm9yIGhhdmluZyB7e3JvbGUubmFtZX19IHJvbGVcIiwgXCJ0eXBlXCIgOiBcInJvbGVcIiwgXCJsb2dpY1wiIDogXCJQT1NJVElWRVwiLCBcImRlY2lzaW9uU3RyYXRlZ3lcIiA6IFwiVU5BTklNT1VTXCIsIFwicm9sZXNcIiA6IFt7IFwiaWRcIiA6IFwie3tyb2xlLmlkfX1cIiwgXCJyZXF1aXJlZFwiIDogdHJ1ZX1dfSIKICAgICAgICBoZWFkZXJzOgogICAgICAgICAgQXV0aG9yaXphdGlvbjogIkJlYXJlciB7eyB0b2sgfX0iCiAgICAgICAgc3RhdHVzX2NvZGU6IDIwMQogICAgICByZWdpc3RlcjogYWRkX3BvbGljeV9yZXNwCgogICAgLSBzZXRfZmFjdDoKICAgICAgICBuZXdfcG9saWN5IDogInt7YWRkX3BvbGljeV9yZXNwLmpzb259fSIKCiAgICAtIHNldF9mYWN0OgogICAgICAgIGZpbmFsX3BvbGljaWVzOiAie3sgKHByZXZfcG9saWNpZXMgKyBbbmV3X3BvbGljeV0pIHwgbWFwKGF0dHJpYnV0ZT0naWQnKSB9fSIKCiAgICAtIG5hbWU6ICJGaW5hbGl6ZSBwZXJtaXNzaW9uIgogICAgICB1cmk6CiAgICAgICAgdXJsOiAie3sgaWFtX2FkbWluIH19L2NsaWVudHMve3sgcm9sZS5jb250YWluZXJJZCB9fS9hdXRoei9yZXNvdXJjZS1zZXJ2ZXIvcGVybWlzc2lvbi97e2RlZmF1bHRfcGVybVswXS5pZH19IgogICAgICAgIG1ldGhvZDogIlBVVCIKICAgICAgICBib2R5X2Zvcm1hdDogImpzb24iCiAgICAgICAgYm9keTogInsgXCJuYW1lXCIgOiBcIkRlZmF1bHQgUGVybWlzc2lvblwiLCBcImRlc2NyaXB0aW9uXCIgOiBcIlwiLCBcInR5cGVcIiA6IFwicmVzb3VyY2VcIiwgXCJsb2dpY1wiIDogXCJQT1NJVElWRVwiLCBcImRlY2lzaW9uU3RyYXRlZ3lcIiA6IFwiQUZGSVJNQVRJVkVcIiwgXCJwb2xpY2llc1wiIDoge3tmaW5hbF9wb2xpY2llc319IH0iCiAgICAgICAgaGVhZGVyczoKICAgICAgICAgIEF1dGhvcml6YXRpb246ICJCZWFyZXIge3sgdG9rIH19IgogICAgICAgIHN0YXR1c19jb2RlOiAyMDEKICAgICAgcmVnaXN0ZXI6IGFkZF9wb2xpY3lfcmVzcAoKICAgIAoKCg==",
"expression": "inputs={},tasks=[];function f(){for(var i=0;i<$.roles.length;i++)r=$.roles[i],tasks.push({name:'pyansible',type:'SIMPLE',taskReferenceName:'call_policy_workflow_'+i}),inputs['call_policy_workflow_'+i]={playbook:$.playbook, extra_vars : {role:r, iam_master:$.iam_master,iam_admin:$.iam_admin,user:$.user,passw:$.pass}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs}} f();"
},
"type": "INLINE",
"startDelay": 0,
"optional": false,
"asyncComplete": false
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_call_policy_permission_workflow",
"inputParameters" : {
"tasks" : "${build_policy_permission_tasks.output.result.tasks}",
"inputs" : "${build_policy_permission_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_policy_permission_addition"
}
]
}

View File

@ -0,0 +1,79 @@
{
"ownerApp" : "Orchestrator",
"name" : "role_deleted",
"createBy" : "Marco Lettere",
"description": "Handle workflow related to Portal event role_deleted",
"version" : 1,
"ownerEmail" : "marco.lettere@nubisware.com",
"inputParameters" : ["role"],
"tasks" : [
{
"name": "INLINE_TASK",
"taskReferenceName": "init",
"type": "INLINE",
"inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"evaluatorType" : "javascript",
"expression": "1 == 1"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "authorize",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "{{ keycloak }}/master/protocol/openid-connect/token",
"method" : "POST",
"headers" : {
"Accept" : "application/json"
},
"body" : {
"client_id" : "orchestrator",
"client_secret" : "{{ keycloak_auth_master }}",
"grant_type" : "client_credentials"
}
}
},
{
"name" : "pyrest",
"taskReferenceName" : "get_all_vres",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients?clientId=%252F&search=true&first=0&max=500",
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "build_delete_role_tasks",
"type": "INLINE",
"inputParameters": {
"role" : "${workflow.input.role}",
"vres" : "${get_all_vres.output.body}",
"evaluatorType" : "javascript",
"expression": "inputs={};tasks=[];function f(){for(var i=0;i<$.vres.length;i++)vre=$.vres[i],tasks.push({name:'pyrest',type:'SIMPLE',taskReferenceName:'delete_role_'+i}),inputs['delete_role_'+i]={url:'${init.input.keycloak_admin}/clients/' + vre.id + '/roles/' + $.role,method:'DELETE', expect:Java.to([204,404],'int[]'),headers:{Authorization:'Bearer ${authorize.output.body.access_token}'}};return {tasks:Java.to(tasks,'java.util.Map[]'),inputs:inputs}} f();"
}
},
{
"name" : "fork_dynamic",
"type" : "FORK_JOIN_DYNAMIC",
"taskReferenceName" : "parallel_delete_role",
"inputParameters" : {
"tasks" : "${build_delete_role_tasks.output.result.tasks}",
"inputs" : "${build_delete_role_tasks.output.result.inputs}"
},
"dynamicForkTasksParam": "tasks",
"dynamicForkTasksInputParamName": "inputs"
},
{
"name" : "join",
"type" : "JOIN",
"taskReferenceName" : "join_parallel_role_deletion"
}
]
}

View File

@ -8,13 +8,14 @@
"inputParameters" : ["role", "user", "group"], "inputParameters" : ["role", "user", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"scriptExpression": "1" "expression": "1",
"evaluatorType" : "javascript"
} }
}, },
{ {
@ -48,36 +49,38 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_user", "taskReferenceName": "select_user",
"inputParameters": { "inputParameters": {
"foundusers" : "${lookup_user.output.body}", "foundusers" : "${lookup_user.output.body}",
"username" : "${workflow.input.user}", "username" : "${workflow.input.user}",
"scriptExpression": "for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return Java.to([$.foundusers[i]], 'java.lang.Object[]')}" "expression": "function f(){for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return $.foundusers[i]}} f()",
}, "evaluatorType" : "javascript"
"type": "LAMBDA" },
}, "type": "INLINE"
},
{ {
"name": "check_user_existance", "name": "check_user_existance",
"taskReferenceName": "check_user_existance", "taskReferenceName": "check_user_existance",
"inputParameters": { "inputParameters": {
"user": "${select_user.output.result[0]}" "user": "${select_user.output.result}"
}, },
"type": "DECISION", "type": "SWITCH",
"caseExpression": "($.user == null ? 'true' : 'false')", "evaluatorType": "javascript",
"decisionCases": { "expression": "$.user == null ? 'true' : 'false'",
"true": [ "decisionCases": {
{ "true": [
"name" : "terminate", {
"taskReferenceName" : "terminate_when_no_user", "name" : "terminate",
"type" : "TERMINATE", "taskReferenceName" : "terminate_when_no_user",
"inputParameters" : { "type" : "TERMINATE",
"terminationStatus" : "COMPLETED" "inputParameters" : {
} "terminationStatus" : "COMPLETED"
} }
] }
} ]
}, }
},
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "lookup_client", "taskReferenceName" : "lookup_client",
@ -112,18 +115,20 @@
"inputParameters": { "inputParameters": {
"prev_status": "${get_client_roles.output.status}" "prev_status": "${get_client_roles.output.status}"
}, },
"type": "DECISION", "type": "SWITCH",
"caseValueParam": "prev_status", "evaluatorType": "value-param",
"expression": "prev_status",
"decisionCases": { "decisionCases": {
"200": [ "200": [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_role", "taskReferenceName": "select_role",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"role": "${workflow.input.role}", "role": "${workflow.input.role}",
"roles" : "${get_client_roles.output.body}", "roles" : "${get_client_roles.output.body}",
"scriptExpression": "for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == $.role) return Java.to([$.roles[i]], 'java.lang.Object[]')}" "expression": "function f(){for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == $.role) return Java.to([$.roles[i]], 'java.lang.Object[]')}} f()",
"evaluatorType" : "javascript"
} }
}, },
{ {
@ -131,7 +136,7 @@
"taskReferenceName" : "assign_role_to_user", "taskReferenceName" : "assign_role_to_user",
"type" : "SIMPLE", "type" : "SIMPLE",
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result[0].id}/role-mappings/clients/${lookup_client.output.body[0].id}", "url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/role-mappings/clients/${lookup_client.output.body[0].id}",
"expect" : [204, 404], "expect" : [204, 404],
"method" : "POST", "method" : "POST",
"body" : "${select_role.output.result}", "body" : "${select_role.output.result}",

View File

@ -8,13 +8,14 @@
"inputParameters" : ["role", "user", "group"], "inputParameters" : ["role", "user", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"scriptExpression": "1" "expression": "1",
"evaluatorType" : "javascript"
} }
}, },
{ {
@ -48,36 +49,38 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_user", "taskReferenceName": "select_user",
"inputParameters": { "inputParameters": {
"foundusers": "${lookup_user.output.body}", "foundusers": "${lookup_user.output.body}",
"username": "${workflow.input.user}", "username": "${workflow.input.user}",
"scriptExpression": "for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return Java.to([$.foundusers[i]], 'java.lang.Object[]')}" "evaluatorType" : "javascript",
"expression": "function f(){for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return $.foundusers[i]}} f()"
}, },
"type": "LAMBDA" "type": "INLINE"
}, },
{ {
"name": "check_user_existance", "name": "check_user_existance",
"taskReferenceName": "check_user_existance", "taskReferenceName": "check_user_existance",
"inputParameters": { "inputParameters": {
"user": "${select_user.output.result[0]}" "users": "${select_user.output.result}"
}, },
"type": "DECISION", "type": "SWITCH",
"caseExpression": "($.user == null ? 'true' : 'false')", "evaluatorType" : "javascript",
"decisionCases": { "expression": "($.user != null ? 'true' : 'false')",
"true": [ "decisionCases": {
{ "true": [
"name" : "terminate", {
"taskReferenceName" : "terminate_when_no_user", "name" : "terminate",
"type" : "TERMINATE", "taskReferenceName" : "terminate_when_no_user",
"inputParameters" : { "type" : "TERMINATE",
"terminationStatus" : "COMPLETED" "inputParameters" : {
} "terminationStatus" : "COMPLETED"
} }
] }
} ]
}, }
},
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "lookup_client", "taskReferenceName" : "lookup_client",
@ -106,13 +109,14 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_role", "taskReferenceName": "select_role",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"role": "${workflow.input.role}", "role": "${workflow.input.role}",
"roles" : "${get_client_roles.output.body}", "roles" : "${get_client_roles.output.body}",
"scriptExpression": "for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == $.role) return Java.to([$.roles[i]], 'java.lang.Object[]')}" "evaluatorType" : "javascript",
"expression": "function f(){for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == $.role) return Java.to([$.roles[i]], 'java.lang.Object[]')}} f()"
} }
}, },
{ {
@ -120,7 +124,7 @@
"taskReferenceName" : "remove_role_from_user", "taskReferenceName" : "remove_role_from_user",
"type" : "SIMPLE", "type" : "SIMPLE",
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result[0].id}/role-mappings/clients/${lookup_client.output.body[0].id}", "url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/role-mappings/clients/${lookup_client.output.body[0].id}",
"expect" : 204, "expect" : 204,
"method" : "DELETE", "method" : "DELETE",
"body" : "${select_role.output.result}", "body" : "${select_role.output.result}",

View File

@ -8,14 +8,16 @@
"inputParameters" : ["user", "group"], "inputParameters" : ["user", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"user" : "${workflow.input.user}",
"group" : "${workflow.input.group}", "group" : "${workflow.input.group}",
"scriptExpression": "var path = $.group.split('%2F').slice(1); return { 'tree' : Java.to(path, 'java.lang.Object[]'), 'name' : path.slice(path.length-1)[0]}" "evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; if(e($.user) || e($.group)) throw('User and Group must not be empty'); function f(){ var path = $.group.startsWith('%2F') ? $.group.split('%2F').slice(1) : [$.group]; return { 'tree' : Java.to(path, 'java.lang.String[]'), 'name' : path.slice(path.length-1)[0], 'search' : encodeURIComponent(path.slice(path.length-1)[0])}} f()"
} }
}, },
{ {
@ -49,91 +51,78 @@
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_user", "taskReferenceName": "select_user",
"inputParameters": { "inputParameters": {
"foundusers": "${lookup_user.output.body}", "foundusers": "${lookup_user.output.body}",
"username": "${workflow.input.user}", "username": "${workflow.input.user}",
"scriptExpression": "for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return Java.to([$.foundusers[i]], 'java.lang.Object[]')}" "evaluatorType" : "javascript",
}, "expression": "function f(){for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return $.foundusers[i]}} f()"
"type": "LAMBDA" },
}, "type": "INLINE"
{
"name" : "pyrest",
"taskReferenceName" : "lookup_client",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients",
"params" : { "clientId" : "${workflow.input.group}"},
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
}, },
{ {
"name" : "pyrest", "name": "check_user_existance",
"taskReferenceName" : "get_client_roles", "taskReferenceName": "check_user_existance",
"type" : "SIMPLE", "inputParameters": {
"inputParameters" : { "user": "${select_user.output.result}"
"url" : "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}/roles",
"expect" : [200, 404],
"method" : "GET",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name" : "check_role_existance",
"taskReferenceName" : "check_role_existance",
"type" : "DECISION",
"inputParameters" :{
"previous_outcome" : "${get_client_roles.output.status}"
}, },
"caseValueParam" : "previous_outcome", "type": "SWITCH",
"decisionCases" : { "evaluatorType" : "javascript",
"200" : [ "expression": "($.user == null ? 'true' : 'false')",
"decisionCases": {
"true": [
{ {
"name": "LAMBDA_TASK", "name" : "terminate",
"taskReferenceName": "select_role", "taskReferenceName" : "terminate_when_no_user",
"type": "LAMBDA", "type" : "TERMINATE",
"inputParameters": { "inputParameters" : {
"role": "${workflow.input.role}", "terminationStatus" : "COMPLETED"
"roles" : "${get_client_roles.output.body}",
"scriptExpression": "for(var i=0; i < $.roles.length;i++){if($.roles[i]['name'] == 'Member') return Java.to([$.roles[i]], 'java.lang.Object[]')}"
} }
}, }
{ ]
"name" : "pyrest", }
"taskReferenceName" : "look_up_groups", },
"type" : "SIMPLE", {
"inputParameters" : { "name" : "pyrest",
"url" : "${init.input.keycloak_admin}/groups?search=${init.output.result.name}", "taskReferenceName" : "look_up_groups",
"headers" : { "type" : "SIMPLE",
"Authorization" : "Bearer ${authorize.output.body.access_token}", "inputParameters" : {
"Accept" : "application/json" "url" : "${init.input.keycloak_admin}/groups?search=${init.output.result.search}",
} "headers" : {
} "Authorization" : "Bearer ${authorize.output.body.access_token}",
}, "Accept" : "application/json"
{ }
"name": "LAMBDA_TASK", }
"taskReferenceName": "extract_group", },
"type": "LAMBDA", {
"inputParameters": { "name": "INLINE_TASK",
"tree" : "${init.output.result.tree}", "taskReferenceName": "extract_group",
"groups" : "${look_up_groups.output.body}", "type": "INLINE",
"scriptExpression": "function selectByPath(groups, path, level) { for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {if (level === path.length - 1) return groups[i];return selectByPath(groups[i].subGroups, path, level+1)}} return null; } return { 'group' : selectByPath($.groups, $.tree, 0)}" "inputParameters": {
} "tree" : "${init.output.result.tree}",
}, "groups" : "${look_up_groups.output.body}",
"expression": "function selectByPath(groups, path, level) { for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {if (level === path.length - 1) return groups[i];return selectByPath(groups[i].subGroups, path, level+1)}} return null; } function f() { return { 'group' : selectByPath($.groups, $.tree, 0)}} f()",
"evaluatorType" : "javascript"
}
},
{
"name" : "check_group_existance",
"taskReferenceName" : "check_group_existance",
"type" : "SWITCH",
"evaluatorType" : "javascript",
"inputParameters" :{
"group" : "${extract_group.output.result.group}"
},
"expression": "(($.group != null) ? 'assign' : 'skip')",
"decisionCases" : {
"assign" : [
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "assign_user_to_group", "taskReferenceName" : "assign_user_to_group",
"type" : "SIMPLE", "type" : "SIMPLE",
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result[0].id}/groups/${extract_group.output.result.group.id}", "url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/groups/${extract_group.output.result.group.id}",
"method" : "PUT", "method" : "PUT",
"headers" : { "headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}" "Authorization" : "Bearer ${authorize.output.body.access_token}"

View File

@ -5,17 +5,19 @@
"description": "Handle workflow related to Portal event user-group_deleted", "description": "Handle workflow related to Portal event user-group_deleted",
"version" : 1, "version" : 1,
"ownerEmail" : "m.lettere@gmail.com", "ownerEmail" : "m.lettere@gmail.com",
"inputParameters" : ["role", "user", "group"], "inputParameters" : ["user", "group"],
"tasks" : [ "tasks" : [
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "init", "taskReferenceName": "init",
"type": "LAMBDA", "type": "INLINE",
"inputParameters": { "inputParameters": {
"keycloak": "{{ keycloak }}/{{ keycloak_realm }}", "keycloak": "{{ keycloak }}/{{ keycloak_realm }}",
"keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}", "keycloak_admin" : "{{ keycloak_admin }}/{{ keycloak_realm }}",
"group" : "${workflow.input.group}", "group" : "${workflow.input.group}",
"scriptExpression": "var path = $.group.split('%2F').slice(1); return { 'tree' : Java.to(path, 'java.lang.Object[]'), 'name' : path.slice(path.length-1)[0]}" "user" : "${workflow.input.user}",
"evaluatorType" : "javascript",
"expression": "function e(v){ return (v == null || (v.trim && v.trim() === ''))}; if(e($.user) || e($.group)) throw('User and Group must not be empty'); function f(){var path = $.group.startsWith('%2F') ? $.group.split('%2F').slice(1) : [$.group]; return { 'tree' : Java.to(path, 'java.lang.String[]'), 'name' : path.slice(path.length-1)[0], search : encodeURIComponent(path.slice(path.length-1)[0])}} f()"
} }
}, },
{ {
@ -48,24 +50,26 @@
} }
} }
}, },
{ {
"name": "LAMBDA_TASK", "name": "INLINE_TASK",
"taskReferenceName": "select_user", "taskReferenceName": "select_user",
"inputParameters": { "inputParameters": {
"foundusers": "${lookup_user.output.body}", "foundusers": "${lookup_user.output.body}",
"username": "${workflow.input.user}", "username": "${workflow.input.user}",
"scriptExpression": "for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return Java.to([$.foundusers[i]], 'java.lang.Object[]')}" "evaluatorType" : "javascript",
}, "expression": "function f(){for(var i=0; i < $.foundusers.length;i++){if($.foundusers[i]['username'] == $.username) return $.foundusers[i]}} f()"
"type": "LAMBDA" },
}, "type": "INLINE"
},
{ {
"name": "check_user_existance", "name": "check_user_existance",
"taskReferenceName": "check_user_existance", "taskReferenceName": "check_user_existance",
"inputParameters": { "inputParameters": {
"user": "${select_user.output.result[0]}" "user": "${select_user.output.result}"
}, },
"type": "DECISION", "type": "SWITCH",
"caseExpression": "($.user == null ? 'true' : 'false')", "evaluatorType" : "javascript",
"expression": "($.user == null ? 'true' : 'false')",
"decisionCases": { "decisionCases": {
"true": [ "true": [
{ {
@ -79,6 +83,63 @@
] ]
} }
}, },
{
"name" : "pyrest",
"taskReferenceName" : "look_up_groups",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/groups?search=${init.output.result.search}",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "INLINE_TASK",
"taskReferenceName": "extract_group",
"type": "INLINE",
"inputParameters": {
"tree" : "${init.output.result.tree}",
"groups" : "${look_up_groups.output.body}",
"evaluatorType" : "javascript",
"expression": "function selectByPath(groups, path, level) { for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {if (level === path.length - 1) return groups[i];return selectByPath(groups[i].subGroups, path, level+1)}} return null; } function f() { return { 'group' : selectByPath($.groups, $.tree, 0)}} f()"
}
},
{
"name" : "check_group_existance",
"taskReferenceName" : "check_group_existance",
"type" : "SWITCH",
"inputParameters" :{
"group" : "${extract_group.output.result.group}"
},
"evaluatorType" : "javascript",
"expression": "(($.group != null) ? 'delete' : 'skip')",
"decisionCases" : {
"skip" : [
{
"name" : "terminate",
"taskReferenceName" : "terminate_when_no_group",
"type" : "TERMINATE",
"inputParameters" : {
"terminationStatus" : "COMPLETED"
}
}
]
}
},
{
"name" : "pyrest",
"taskReferenceName" : "delete_user_from_group",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/groups/${extract_group.output.result.group.id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}"
}
}
},
{ {
"name" : "pyrest", "name" : "pyrest",
"taskReferenceName" : "lookup_client", "taskReferenceName" : "lookup_client",
@ -100,6 +161,7 @@
"inputParameters" : { "inputParameters" : {
"url" : "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}/roles", "url" : "${init.input.keycloak_admin}/clients/${lookup_client.output.body[0].id}/roles",
"method" : "GET", "method" : "GET",
"expect" : [200, 404],
"headers" : { "headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}", "Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json" "Accept" : "application/json"
@ -107,53 +169,33 @@
} }
}, },
{ {
"name" : "pyrest", "name" : "check_role_existance",
"taskReferenceName" : "remove_all_roles_from_user", "taskReferenceName" : "check_role_existance",
"type" : "SIMPLE", "type" : "SWITCH",
"inputParameters" : { "evaluatorType" : "value-param",
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result[0].id}/role-mappings/clients/${lookup_client.output.body[0].id}", "inputParameters" :{
"expect" : 204, "previous_outcome" : "${get_client_roles.output.status}"
"method" : "DELETE", },
"body" : "${get_client_roles.body}", "expression" : "previous_outcome",
"headers" : { "decisionCases" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}", "200" : [
"Content-Type" : "application/json" {
} "name" : "pyrest",
"taskReferenceName" : "remove_all_roles_from_user",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${select_user.output.result.id}/role-mappings/clients/${lookup_client.output.body[0].id}",
"expect" : 204,
"method" : "DELETE",
"body" : "${get_client_roles.body}",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Content-Type" : "application/json"
}
}
}
]
} }
}, }
{
"name" : "pyrest",
"taskReferenceName" : "look_up_groups",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/groups?search=${init.output.result.name}",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}",
"Accept" : "application/json"
}
}
},
{
"name": "LAMBDA_TASK",
"taskReferenceName": "extract_group",
"type": "LAMBDA",
"inputParameters": {
"tree" : "${init.output.result.tree}",
"groups" : "${look_up_groups.output.body}",
"scriptExpression": "function selectByPath(groups, path, level) { for (var i=0; i < groups.length; i++) {if (groups[i].name === path[level]) {if (level === path.length - 1) return groups[i];return selectByPath(groups[i].subGroups, path, level+1)}} return null; } return { 'group' : selectByPath($.groups, $.tree, 0)}"
}
},
{
"name" : "pyrest",
"taskReferenceName" : "assign_user_to_group",
"type" : "SIMPLE",
"inputParameters" : {
"url" : "${init.input.keycloak_admin}/users/${lookup_user.output.body[0].id}/groups/${extract_group.output.result.group.id}",
"method" : "DELETE",
"headers" : {
"Authorization" : "Bearer ${authorize.output.body.access_token}"
}
}
}
] ]
} }