forked from AzureAD/SCIMReferenceCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInitialization_Workflow.json
More file actions
1199 lines (1199 loc) · 79.3 KB
/
Initialization_Workflow.json
File metadata and controls
1199 lines (1199 loc) · 79.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"triggers": {
"manual": {
"type": "Request",
"kind": "Http",
"inputs": {
"schema": {
"type": "object",
"properties": {}
}
}
}
},
"actions": {
"Initialize_Processing_Variables": {
"runAfter": {},
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "sourceToTargetLookup",
"type": "Array",
"value": []
},
{
"name": "userBody",
"type": "Object",
"value": {
"accountEnabled": true,
"passwordProfile": {
"forceChangePasswordNextSignIn": true,
"password": "@{concat('Tmp!', substring(guid(),0,8), '@', substring(guid(),24,8))}"
}
}
},
{
"name": "updateUserBody",
"type": "Object",
"value": {}
},
{
"name": "ExcludedList",
"type": "Array",
"value": [
"IsSoftDeleted",
"accountEnabled",
"passwordProfile",
"manager",
"mail",
"userPrincipalName",
"id"
]
},
{
"name": "GraphArrayProperties",
"type": "Array",
"value": [
"businessPhones",
"otherMails",
"proxyAddresses",
"imAddresses"
]
},
{
"name": "scimDirectUserCreateBody",
"type": "Object",
"value": {}
}
]
}
},
"Initialize_Tests": {
"actions": {
"List_Existing_Jobs": {
"runAfter": {},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/servicePrincipals/@{parameters('servicePrincipalId')}/synchronization/jobs",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Compose_SyncJobId": {
"runAfter": {
"List_Existing_Jobs": [
"Succeeded",
"Skipped"
]
},
"type": "Compose",
"inputs": "@{coalesce(first(body('List_Existing_Jobs')?['value'])?['id'])}"
},
"Get_Job_Details": {
"runAfter": {
"Compose_SyncJobId": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/servicePrincipals/@{parameters('servicePrincipalId')}/synchronization/jobs/@{outputs('Compose_SyncJobId')}",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Get_Schema": {
"runAfter": {
"Get_Job_Details": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/servicePrincipals/@{parameters('servicePrincipalId')}/synchronization/jobs/@{outputs('Compose_SyncJobId')}/schema",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Get_Connectivity_Parameters": {
"runAfter": {
"Get_Schema": [
"Succeeded",
"Failed"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/beta/servicePrincipals/@{parameters('servicePrincipalId')}/synchronization/connectivityParameters",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Compose_Job_Settings_And_Templates": {
"runAfter": {
"Get_Connectivity_Parameters": [
"Succeeded",
"Failed"
]
},
"type": "Compose",
"inputs": {
"jobSettings": "@body('Get_Job_Details')",
"schema": "@body('Get_Schema')",
"connectivityParameters": "@coalesce(body('Get_Connectivity_Parameters'), null)"
}
},
"Get_App_Roles": {
"runAfter": {
"Compose_Job_Settings_And_Templates": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/servicePrincipals/@{parameters('servicePrincipalId')}?$select=appRoles",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Filter_User_AppRole": {
"runAfter": {
"Get_App_Roles": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@body('Get_App_Roles')?['appRoles']",
"where": "@equals(toLower(item()?['displayName']), 'user')"
}
},
"Generate_TestNames": {
"actions": {
"Generate_Test_UserNames": {
"type": "Compose",
"inputs": {
"createUser": "@{concat('lacreate', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"createUserMail": "@{concat('lacreate', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"updateUser": "@{concat('laupdate', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"disableUser": "@{concat('ladis', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"deleteUser": "@{concat('ladel', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"managerUser": "@{concat('lamgr', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"managerUserNew": "@{concat('lamgrnew', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"memberUser1": "@{concat('lamem1', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"memberUser2": "@{concat('lamem2', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"index": "@rand(0, sub(length(parameters('defaultUserProperties')), 1))",
"managerUserInitial": "@{concat('lamgrinit', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"createUserNickname": "@{concat('lacreate', substring(guid(),0,8))}",
"updateUserNickname": "@{concat('laupdate', substring(guid(),0,8))}",
"deleteUserNickname": "@{concat('ladel', substring(guid(),0,8))}",
"disableUserNickname": "@{concat('ladis', substring(guid(),0,8))}",
"managerUserNickname": "@{concat('lamgr', substring(guid(),0,8))}",
"managerUserNewNickname": "@{concat('lamgrnew', substring(guid(),0,8))}",
"managerUserInitialNickname": "@{concat('lamgrinit', substring(guid(),0,8))}",
"restoreUser": "@{concat('larestore', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"restoreUserMail": "@{concat('larestore', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"restoreUserNickname": "@{concat('larestore', substring(guid(),0,8))}",
"memberUser1Mail": "@{concat('lamem1', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"memberUser2Mail": "@{concat('lamem2', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"scimDirectUser": "@{concat('lascuser', substring(guid(),0,8), '@', parameters('testUserDomain'))}",
"scimDirectUserNickname": "@{concat('lascuser', substring(guid(),0,8))}"
}
},
"Generate_Test_GroupNames": {
"runAfter": {
"Generate_Test_UserNames": [
"Succeeded"
]
},
"type": "Compose",
"inputs": {
"createGroup": "@{concat('LACreateGroup-(', substring(guid(),0,8), ')')}",
"updateGroup": "@{concat('LAUpdateGroup-', substring(guid(),0,8))}",
"deleteGroup": "@{concat('LADeleteGroup-', substring(guid(),0,8))}",
"memberGroup": "@{concat('LAMemberGroup-', substring(guid(),0,8))}",
"createGroupNickname": "@{concat('LACreateGroup', substring(guid(),0,8))}",
"updateGroupNickname": "@{concat('LAUpdateGroup', substring(guid(),0,8))}",
"deleteGroupNickname": "@{concat('LADeleteGroup', substring(guid(),0,8))}",
"memberGroupNickname": "@{concat('LAMemberGroup', substring(guid(),0,8))}",
"scimDirectGroup": "@{concat('LASCDirectGroup-', substring(guid(),0,8))}",
"scimDirectGroupNickname": "@{concat('LASCDirectGroup', substring(guid(),0,8))}"
}
}
},
"runAfter": {
"Filter_User_AppRole": [
"Succeeded"
]
},
"type": "Scope"
}
},
"runAfter": {
"Initialize_Processing_Variables": [
"Succeeded"
]
},
"type": "Scope"
},
"Parse_Templates": {
"runAfter": {
"Initialize_Tests": [
"Succeeded"
]
},
"type": "ParseJson",
"inputs": {
"content": "@body('Get_Schema')",
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"synchronizationRules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"objectMappings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sourceDirectoryName": {
"type": "string"
},
"targetDirectoryName": {
"type": "string"
},
"sourceObjectName": {
"type": "string"
},
"targetObjectName": {
"type": "string"
},
"attributeMappings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"targetAttributeName": {
"type": "string"
},
"source": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"expression": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
},
"Process_Template_Mappings": {
"runAfter": {
"Parse_Templates": [
"Succeeded"
]
},
"actions": {
"Extract_Source_Directory": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@body('Get_Schema')?['directories']",
"where": "@equals(item()?['name'], 'Microsoft Entra ID')"
}
},
"Extract_Target_Directory": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@body('Get_Schema')?['directories']",
"where": "@not(equals(item()?['name'], 'Microsoft Entra ID'))"
}
},
"Filter_Target_Group_Object": {
"runAfter": {
"Extract_Target_Directory": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@coalesce(first(body('Extract_Target_Directory'))?['objects'], json('[]'))",
"where": "@contains(toLower(item()?['name']), 'group')"
}
},
"Filter_Target_User_Object": {
"runAfter": {
"Extract_Target_Directory": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@coalesce(first(body('Extract_Target_Directory'))?['objects'], json('[]'))",
"where": "@or(or(equals(item()?['name'], 'User'), equals(item()?['name'], 'urn:ietf:params:scim:schemas:core:2.0:User')), equals(item()?['name'], 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'))"
}
},
"Compose_Target_User_Attributes": {
"runAfter": {
"Filter_Target_User_Object": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@coalesce(first(body('Filter_Target_User_Object'))?['attributes'], json('[]'))"
},
"Compose_Target_Group_Attributes": {
"runAfter": {
"Filter_Target_Group_Object": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@coalesce(first(body('Filter_Target_Group_Object'))?['attributes'], json('[]'))"
},
"Select_Target_Group_Attribute_Names": {
"runAfter": {
"Filter_Group_ObjectMapping": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@coalesce(first(body('Filter_Group_ObjectMapping'))?['attributeMappings'], json('[]'))",
"select": "@item()?['targetAttributeName']"
}
},
"Filter_User_Object": {
"runAfter": {
"Extract_Source_Directory": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@first(body('Extract_Source_Directory'))?['objects']",
"where": "@equals(item()?['name'], 'User')"
}
},
"Select_All_User_Attributes": {
"runAfter": {
"Filter_User_Object": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@first(body('Filter_User_Object'))?['attributes']",
"select": {
"name": "@item()?['name']",
"type": "@item()?['type']",
"multivalued": "@coalesce(item()?['multivalued'], false)"
}
}
},
"Compose_Primitive_Attributes": {
"runAfter": {
"Select_All_User_Attributes": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@body('Select_All_User_Attributes')",
"where": "@not(contains(item()?['name'], '.'))"
}
},
"Compose_Complex_Attributes": {
"runAfter": {
"Select_All_User_Attributes": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@body('Select_All_User_Attributes')",
"where": "@contains(item()?['name'], '.')"
}
},
"Compose_ArrayType_Attributes": {
"runAfter": {
"Select_All_User_Attributes": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@body('Select_All_User_Attributes')",
"where": "@equals(item()?['multivalued'], true)"
}
},
"Select_Primitive_Attribute_Names": {
"runAfter": {
"Compose_Primitive_Attributes": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Compose_Primitive_Attributes')",
"select": "@if(contains(parameters('attributeTransforms'), item()?['name']), parameters('attributeTransforms')[item()?['name']], item()?['name'])"
}
},
"Select_Complex_Attribute_Names": {
"runAfter": {
"Compose_Complex_Attributes": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Compose_Complex_Attributes')",
"select": "@if(contains(parameters('attributeTransforms'), first(split(item()?['name'], '.'))), parameters('attributeTransforms')[first(split(item()?['name'], '.'))], first(split(item()?['name'], '.')))"
}
},
"Select_ArrayType_Attribute_Names": {
"runAfter": {
"Compose_ArrayType_Attributes": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Compose_ArrayType_Attributes')",
"select": "@if(contains(parameters('attributeTransforms'), item()?['name']), parameters('attributeTransforms')[item()?['name']], item()?['name'])"
}
},
"Filter_User_ObjectMapping": {
"runAfter": {
"Select_Primitive_Attribute_Names": [
"Succeeded"
],
"Select_Complex_Attribute_Names": [
"Succeeded"
],
"Compose_Dynamic_ArrayProperties": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@coalesce(first(body('Parse_Templates')?['synchronizationRules'])?['objectMappings'], json('[]'))",
"where": "@equals(item()?['targetObjectName'], 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User')"
}
},
"Select_Target_Attribute_Names": {
"runAfter": {
"Filter_User_ObjectMapping": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@coalesce(first(body('Filter_User_ObjectMapping'))?['attributeMappings'], json('[]'))",
"select": "@item()?['targetAttributeName']"
}
},
"ForEach_AttributeMappings": {
"foreach": "@coalesce(first(body('Filter_User_ObjectMapping'))?['attributeMappings'], json('[]'))",
"actions": {
"If_TargetAttribute_Present": {
"actions": {
"Filter_Source_Parameters": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@coalesce(items('ForEach_AttributeMappings')?['source']?['parameters'], json('[]'))",
"where": "@equals(item()?['key'], 'source')"
}
},
"Select_Source_Attribute_Names": {
"runAfter": {
"Filter_Source_Parameters": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Filter_Source_Parameters')",
"select": "@item()?['value']?['name']"
}
},
"Filter_Target_Attribute_For_Lookup": {
"runAfter": {
"Select_Source_Attribute_Names": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@outputs('Compose_Target_User_Attributes')",
"where": "@equals(item()?['name'], items('ForEach_AttributeMappings')?['targetAttributeName'])"
}
},
"Compose_SourceToTargetLookup_Entry": {
"runAfter": {
"Select_Source_Attribute_Names": [
"Succeeded"
],
"Filter_Target_Attribute_For_Lookup": [
"Succeeded"
]
},
"type": "Compose",
"inputs": {
"source": "@if(contains(parameters('attributeTransforms'), coalesce(if(equals(items('ForEach_AttributeMappings')?['source']?['type'], 'Attribute'), items('ForEach_AttributeMappings')?['source']?['name'], first(body('Select_Source_Attribute_Names'))), '')), parameters('attributeTransforms')[coalesce(if(equals(items('ForEach_AttributeMappings')?['source']?['type'], 'Attribute'), items('ForEach_AttributeMappings')?['source']?['name'], first(body('Select_Source_Attribute_Names'))), '')], coalesce(if(equals(items('ForEach_AttributeMappings')?['source']?['type'], 'Attribute'), items('ForEach_AttributeMappings')?['source']?['name'], first(body('Select_Source_Attribute_Names'))), ''))",
"target": "@items('ForEach_AttributeMappings')?['targetAttributeName']",
"type": "@coalesce(items('ForEach_AttributeMappings')?['source']?['type'], 'Unknown')",
"matchingPrecedence": "@coalesce(items('ForEach_AttributeMappings')?['matchingPrecedence'], 0)",
"flowType": "@coalesce(items('ForEach_AttributeMappings')?['flowType'], 'Always')",
"function": "@if(equals(coalesce(items('ForEach_AttributeMappings')?['source']?['type'], ''), 'Function'), coalesce(items('ForEach_AttributeMappings')?['source']?['name'], ''), '')",
"functionParameters": "@if(equals(coalesce(items('ForEach_AttributeMappings')?['source']?['type'], ''), 'Function'), coalesce(items('ForEach_AttributeMappings')?['source']?['parameters'], json('[]')), json('[]'))",
"targetSchema": "@if(greater(length(body('Filter_Target_Attribute_For_Lookup')), 0), first(body('Filter_Target_Attribute_For_Lookup')), json('{}'))"
}
},
"Condition_Source_Not_Exists": {
"runAfter": {
"Compose_SourceToTargetLookup_Entry": [
"Succeeded"
]
},
"type": "If",
"expression": {
"and": [
{
"not": {
"contains": [
"@string(variables('sourceToTargetLookup'))",
"@concat('\"source\":\"', outputs('Compose_SourceToTargetLookup_Entry')?['source'], '\",\"target\":\"', outputs('Compose_SourceToTargetLookup_Entry')?['target'], '\"')"
]
}
}
]
},
"actions": {
"Append_SourceToTargetLookup": {
"type": "AppendToArrayVariable",
"inputs": {
"name": "sourceToTargetLookup",
"value": "@outputs('Compose_SourceToTargetLookup_Entry')"
}
}
},
"else": {
"actions": {}
}
}
},
"else": {
"actions": {}
},
"expression": {
"and": [
{
"not": {
"equals": [
"@items('ForEach_AttributeMappings')?['targetAttributeName']",
null
]
}
},
{
"not": {
"equals": [
"@items('ForEach_AttributeMappings')?['targetAttributeName']",
""
]
}
}
]
},
"type": "If"
}
},
"runAfter": {
"Filter_User_ObjectMapping": [
"Succeeded"
],
"Compose_Target_User_Attributes": [
"Succeeded"
]
},
"type": "Foreach",
"runtimeConfiguration": {
"concurrency": {
"repetitions": 1
}
}
},
"Select_Graph_Property_Names": {
"runAfter": {
"ForEach_AttributeMappings": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@variables('sourceToTargetLookup')",
"select": "@item()?['source']"
}
},
"For_Each_Build_UserBody": {
"foreach": "@body('Select_Graph_Property_Names')",
"actions": {
"Filter_Lookup_For_Source": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@variables('sourceToTargetLookup')",
"where": "@equals(item()?['source'], items('For_Each_Build_UserBody'))"
}
},
"Filter_Lookup_For_Source_Direct": {
"runAfter": {
"Filter_Lookup_For_Source": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@body('Filter_Lookup_For_Source')",
"where": "@empty(coalesce(item()?['function'], ''))"
}
},
"Compose_Preferred_Lookup_Row": {
"runAfter": {
"Filter_Lookup_For_Source_Direct": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(body('Filter_Lookup_For_Source_Direct')), 0), first(body('Filter_Lookup_For_Source_Direct')), if(greater(length(body('Filter_Lookup_For_Source')), 0), first(body('Filter_Lookup_For_Source')), json('{}')))"
},
"Compose_Default_Value_Per_Source": {
"runAfter": {
"Compose_Preferred_Lookup_Row": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(body('Filter_Lookup_For_Source')), 0), if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'Not'), true, if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'SingleAppRoleAssignment'), coalesce(first(body('Filter_User_AppRole'))?['id'], concat('Test', substring(guid(),0,6))), if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'AppRoleAssignmentsComplex'), createArray(json(concat('{\"value\":\"', coalesce(first(body('Filter_User_AppRole'))?['id'], ''), '\",\"display\":\"', coalesce(first(body('Filter_User_AppRole'))?['displayName'], 'User'), '\",\"type\":\"User\"}'))), if(greater(length(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['canonicalValues'], json('[]'))), 0), first(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['canonicalValues'], json('[]'))), if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'boolean'), true, if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'datetime'), utcNow(), if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'integer'), 1, concat('Test', substring(guid(),0,6))))))))), concat('Test', substring(guid(),0,6)))"
},
"Compose_Default_Value_Per_Source_Update": {
"runAfter": {
"Compose_Preferred_Lookup_Row": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(body('Filter_Lookup_For_Source')), 0), if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'Not'), true, if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'SingleAppRoleAssignment'), coalesce(first(body('Filter_User_AppRole'))?['id'], concat('Updated', substring(guid(),0,6))), if(equals(coalesce(outputs('Compose_Preferred_Lookup_Row')?['function'], ''), 'AppRoleAssignmentsComplex'), createArray(json(concat('{\"value\":\"', coalesce(first(body('Filter_User_AppRole'))?['id'], ''), '\",\"display\":\"', coalesce(first(body('Filter_User_AppRole'))?['displayName'], 'User'), '\",\"type\":\"User\"}'))), if(greater(length(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['canonicalValues'], json('[]'))), 0), first(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['canonicalValues'], json('[]'))), if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'boolean'), true, if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'datetime'), utcNow(), if(equals(toLower(coalesce(outputs('Compose_Preferred_Lookup_Row')?['targetSchema']?['type'], '')), 'integer'), 1, concat('Updated', substring(guid(),0,6))))))))), concat('Updated', substring(guid(),0,6)))"
},
"Compose_New_UserBody": {
"runAfter": {
"Compose_Default_Value_Per_Source": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(contains(variables('ExcludedList'), items('For_Each_Build_UserBody')), variables('userBody'), if(and(contains(items('For_Each_Build_UserBody'), '.'), contains(body('Select_Complex_Attribute_Names'), first(split(items('For_Each_Build_UserBody'), '.')))), setProperty(variables('userBody'), first(split(items('For_Each_Build_UserBody'), '.')), setProperty(coalesce(if(contains(variables('userBody'), first(split(items('For_Each_Build_UserBody'), '.'))), variables('userBody')[first(split(items('For_Each_Build_UserBody'), '.'))], null), json('{}')), last(split(items('For_Each_Build_UserBody'), '.')), coalesce(if(contains(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']], first(split(items('For_Each_Build_UserBody'), '.'))), if(not(equals(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][first(split(items('For_Each_Build_UserBody'), '.'))], null)), if(contains(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][first(split(items('For_Each_Build_UserBody'), '.'))], last(split(items('For_Each_Build_UserBody'), '.'))), if(not(empty(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][first(split(items('For_Each_Build_UserBody'), '.'))][last(split(items('For_Each_Build_UserBody'), '.'))])), parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][first(split(items('For_Each_Build_UserBody'), '.'))][last(split(items('For_Each_Build_UserBody'), '.'))], null), null), null), null), outputs('Compose_Default_Value_Per_Source')))), if(contains(body('Select_Primitive_Attribute_Names'), items('For_Each_Build_UserBody')), if(contains(outputs('Compose_Dynamic_ArrayProperties'), items('For_Each_Build_UserBody')), setProperty(variables('userBody'), items('For_Each_Build_UserBody'), if(and(contains(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']], items('For_Each_Build_UserBody')), greater(length(coalesce(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][items('For_Each_Build_UserBody')], json('[]'))), 0)), parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][items('For_Each_Build_UserBody')], createArray(outputs('Compose_Default_Value_Per_Source')))), setProperty(variables('userBody'), items('For_Each_Build_UserBody'), coalesce(if(contains(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']], items('For_Each_Build_UserBody')), if(not(empty(parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][items('For_Each_Build_UserBody')])), parameters('defaultUserProperties')[outputs('Generate_Test_UserNames')['index']][items('For_Each_Build_UserBody')], null), null), outputs('Compose_Default_Value_Per_Source')))), variables('userBody'))))"
},
"Set_userBody": {
"runAfter": {
"Compose_New_UserBody": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "userBody",
"value": "@outputs('Compose_New_UserBody')"
}
},
"Compose_New_UpdateUserBody": {
"runAfter": {
"Set_userBody": [
"Succeeded"
],
"Compose_Default_Value_Per_Source_Update": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(or(contains(variables('ExcludedList'), items('For_Each_Build_UserBody')), contains(body('Select_ObjectAddOnly_SourceNames'), items('For_Each_Build_UserBody'))), variables('updateUserBody'), if(and(contains(items('For_Each_Build_UserBody'), '.'), contains(body('Select_Complex_Attribute_Names'), first(split(items('For_Each_Build_UserBody'), '.')))), setProperty(variables('updateUserBody'), first(split(items('For_Each_Build_UserBody'), '.')), setProperty(coalesce(if(contains(variables('updateUserBody'), first(split(items('For_Each_Build_UserBody'), '.'))), variables('updateUserBody')[first(split(items('For_Each_Build_UserBody'), '.'))], null), json('{}')), last(split(items('For_Each_Build_UserBody'), '.')), coalesce(if(contains(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))], first(split(items('For_Each_Build_UserBody'), '.'))), if(not(equals(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][first(split(items('For_Each_Build_UserBody'), '.'))], null)), if(contains(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][first(split(items('For_Each_Build_UserBody'), '.'))], last(split(items('For_Each_Build_UserBody'), '.'))), if(not(empty(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][first(split(items('For_Each_Build_UserBody'), '.'))][last(split(items('For_Each_Build_UserBody'), '.'))])), parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][first(split(items('For_Each_Build_UserBody'), '.'))][last(split(items('For_Each_Build_UserBody'), '.'))], null), null), null), null), outputs('Compose_Default_Value_Per_Source_Update')))), if(contains(body('Select_Primitive_Attribute_Names'), items('For_Each_Build_UserBody')), if(contains(outputs('Compose_Dynamic_ArrayProperties'), items('For_Each_Build_UserBody')), setProperty(variables('updateUserBody'), items('For_Each_Build_UserBody'), if(and(contains(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))], items('For_Each_Build_UserBody')), greater(length(coalesce(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][items('For_Each_Build_UserBody')], json('[]'))), 0)), parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][items('For_Each_Build_UserBody')], createArray(outputs('Compose_Default_Value_Per_Source_Update')))), setProperty(variables('updateUserBody'), items('For_Each_Build_UserBody'), coalesce(if(contains(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))], items('For_Each_Build_UserBody')), if(not(empty(parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][items('For_Each_Build_UserBody')])), parameters('defaultUserProperties')[mod(add(outputs('Generate_Test_UserNames')['index'], 1), length(parameters('defaultUserProperties')))][items('For_Each_Build_UserBody')], null), null), outputs('Compose_Default_Value_Per_Source_Update')))), variables('updateUserBody'))))"
},
"Set_updateUserBody": {
"runAfter": {
"Compose_New_UpdateUserBody": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "updateUserBody",
"value": "@outputs('Compose_New_UpdateUserBody')"
}
}
},
"runAfter": {
"Select_Graph_Property_Names": [
"Succeeded"
],
"Select_ObjectAddOnly_SourceNames": [
"Succeeded"
]
},
"type": "Foreach",
"runtimeConfiguration": {
"concurrency": {
"repetitions": 1
}
}
},
"Compose_Final_Dynamic_User_Body": {
"runAfter": {
"For_Each_Build_UserBody": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@union(variables('userBody'), if(contains(body('Select_Graph_Property_Names'), 'userPrincipalName'), json(concat('{\"userPrincipalName\":\"', outputs('Generate_Test_UserNames')['updateUser'], '\"}')), json('{}')), if(contains(body('Select_Graph_Property_Names'), 'mail'), json(concat('{\"mail\":\"', outputs('Generate_Test_UserNames')['updateUser'], '\"}')), json('{}')), if(not(contains(variables('userBody'), 'displayName')), json(concat('{\"displayName\":\"', outputs('Generate_Test_UserNames')['updateUser'], '\"}')), json('{}')), if(not(contains(variables('userBody'), 'mailNickname')), json(concat('{\"mailNickname\":\"', outputs('Generate_Test_UserNames')['updateUserNickname'], '\"}')), json('{}')))"
},
"Compose_Final_Dynamic_Update_User_Body": {
"runAfter": {
"Compose_Final_Dynamic_User_Body": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@union(variables('updateUserBody'), if(and(contains(body('Select_Graph_Property_Names'), 'userPrincipalName'), not(contains(body('Select_ObjectAddOnly_SourceNames'), 'userPrincipalName'))), json(concat('{\"userPrincipalName\":\"updated-', outputs('Generate_Test_UserNames')['updateUser'], '\"}')), json('{}')), if(and(contains(body('Select_Graph_Property_Names'), 'mail'), not(contains(body('Select_ObjectAddOnly_SourceNames'), 'mail'))), json(concat('{\"mail\":\"updated-', outputs('Generate_Test_UserNames')['updateUser'], '\"}')), json('{}')), if(and(not(contains(variables('updateUserBody'), 'displayName')), not(contains(body('Select_ObjectAddOnly_SourceNames'), 'displayName'))), json(concat('{\"displayName\":\"', outputs('Generate_Test_UserNames')['updateUser'], ' - Updated\"}')), json('{}')), if(and(contains(body('Select_Graph_Property_Names'), 'mailNickname'), not(contains(body('Select_ObjectAddOnly_SourceNames'), 'mailNickname'))), json(concat('{\"mailNickname\":\"updated', outputs('Generate_Test_UserNames')['updateUserNickname'], '\"}')), json('{}')))"
},
"Compose_Dynamic_ArrayProperties": {
"runAfter": {
"Select_ArrayType_Attribute_Names": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@union(variables('GraphArrayProperties'), body('Select_ArrayType_Attribute_Names'))"
},
"Filter_Group_ObjectMapping": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@coalesce(first(body('Parse_Templates')?['synchronizationRules'])?['objectMappings'], json('[]'))",
"where": "@and(contains(toLower(item()?['targetObjectName']), 'group'), equals(item()?['enabled'], true))"
}
},
"Compose_IsGroupSupported": {
"runAfter": {
"Filter_Group_ObjectMapping": [
"Succeeded"
],
"Filter_Target_Group_Object": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@and(greater(length(body('Filter_Target_Group_Object')), 0), greater(length(body('Filter_Group_ObjectMapping')), 0))"
},
"Compose_IsManagerSupported": {
"runAfter": {
"Select_Target_Attribute_Names": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@contains(string(body('Select_Target_Attribute_Names')), 'manager')"
},
"Compose_IsSoftDeleteSupported": {
"runAfter": {
"Select_Target_Attribute_Names": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@contains(string(body('Select_Target_Attribute_Names')), 'active')"
},
"Compose_IsUserDeleteSupported": {
"runAfter": {
"Filter_User_ObjectMapping": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(body('Filter_User_ObjectMapping')), 0), contains(toLower(coalesce(string(first(body('Filter_User_ObjectMapping'))?['flowTypes']), '')), 'delete'), false)"
},
"Compose_IsGroupDeleteSupported": {
"runAfter": {
"Filter_Group_ObjectMapping": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(body('Filter_Group_ObjectMapping')), 0), contains(toLower(coalesce(string(first(body('Filter_Group_ObjectMapping'))?['flowTypes']), '')), 'delete'), false)"
},
"Compose_UpdateTest_ExcludeList": {
"runAfter": {
"Select_ObjectAddOnly_SourceNames": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@union(body('Select_ObjectAddOnly_SourceNames'), createArray('id', 'accountEnabled', 'manager', 'appRoleAssignments'))"
},
"Filter_ObjectAddOnly_FromLookup": {
"runAfter": {
"ForEach_AttributeMappings": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@variables('sourceToTargetLookup')",
"where": "@equals(item()?['flowType'], 'ObjectAddOnly')"
}
},
"Select_ObjectAddOnly_SourceNames": {
"runAfter": {
"Filter_ObjectAddOnly_FromLookup": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Filter_ObjectAddOnly_FromLookup')",
"select": "@item()?['source']"
}
}
},
"type": "Scope"
},
"Build_SCIM_User_Body": {
"runAfter": {
"Process_Template_Mappings": [
"Succeeded"
]
},
"actions": {
"Compose_SCIM_User_Extension_URNs": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@outputs('Compose_Target_User_Attributes')",
"where": "@startsWith(coalesce(item()?['name'], ''), 'urn:')"
}
},
"Select_SCIM_User_Extension_Namespaces": {
"runAfter": {
"Compose_SCIM_User_Extension_URNs": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Compose_SCIM_User_Extension_URNs')",
"select": "@join(take(split(item()?['name'], ':'), sub(length(split(item()?['name'], ':')), 1)), ':')"
}
},
"Compose_SCIM_User_Schemas": {
"runAfter": {
"Select_SCIM_User_Extension_Namespaces": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@union(createArray('urn:ietf:params:scim:schemas:core:2.0:User'), union(body('Select_SCIM_User_Extension_Namespaces'), json('[]')))"
},
"Set_SCIM_Base_Body": {
"runAfter": {
"Compose_SCIM_User_Schemas": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "scimDirectUserCreateBody",
"value": {
"schemas": "@outputs('Compose_SCIM_User_Schemas')",
"userName": "placeholder@test.com",
"active": true
}
}
},
"ForEach_Build_SCIM_Body": {
"foreach": "@outputs('Compose_Target_User_Attributes')",
"actions": {
"Filter_SCIM_Lookup_For_Target": {
"type": "Query",
"inputs": {
"from": "@variables('sourceToTargetLookup')",
"where": "@equals(coalesce(item()?['target'], ''), coalesce(items('ForEach_Build_SCIM_Body')?['name'], ''))"
},
"runAfter": {}
},
"Compose_SCIM_Lookup_Source_Value": {
"runAfter": {
"Filter_SCIM_Lookup_For_Target": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(empty(body('Filter_SCIM_Lookup_For_Target')), '', if(contains(coalesce(first(body('Filter_SCIM_Lookup_For_Target'))?['source'], ''), '.'), string(coalesce(variables('userBody')?[first(split(first(body('Filter_SCIM_Lookup_For_Target'))?['source'], '.'))]?[last(split(first(body('Filter_SCIM_Lookup_For_Target'))?['source'], '.'))], '')), if(equals(string(coalesce(variables('userBody')?[first(body('Filter_SCIM_Lookup_For_Target'))?['source']], '')), ''), '', if(startsWith(string(variables('userBody')?[first(body('Filter_SCIM_Lookup_For_Target'))?['source']]), '['), string(first(coalesce(variables('userBody')?[first(body('Filter_SCIM_Lookup_For_Target'))?['source']], json('[]')))), string(variables('userBody')?[first(body('Filter_SCIM_Lookup_For_Target'))?['source']])))))"
},
"Compose_TargetTestValue": {
"runAfter": {
"Compose_SCIM_Lookup_Source_Value": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(greater(length(coalesce(triggerBody()?['scimTargetUserValues'], json('[]'))), 0), if(contains(triggerBody()?['scimTargetUserValues'][mod(outputs('Generate_Test_UserNames')['index'], length(triggerBody()?['scimTargetUserValues']))], items('ForEach_Build_SCIM_Body')?['name']), string(triggerBody()?['scimTargetUserValues'][mod(outputs('Generate_Test_UserNames')['index'], length(triggerBody()?['scimTargetUserValues']))][items('ForEach_Build_SCIM_Body')?['name']]), ''), '')"
},
"Compose_SCIM_Source_Value": {
"runAfter": {
"Compose_TargetTestValue": [
"Succeeded"
]
},