forked from AzureAD/SCIMReferenceCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUserTests_Workflow.json
More file actions
5653 lines (5653 loc) · 380 KB
/
UserTests_Workflow.json
File metadata and controls
5653 lines (5653 loc) · 380 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": {
"EnabledTests": {
"type": "string"
},
"IsSoftDeleted": {
"type": "boolean"
},
"initializationData": {
"type": "object",
"properties": {
"syncJobId": {
"type": "string"
},
"testUserNames": {
"type": "object"
},
"testGroupNames": {
"type": "object"
},
"appRoles": {
"type": "object"
},
"userAppRole": {
"type": "array"
},
"schema": {
"type": "object"
},
"sourceToTargetLookup": {
"type": "array"
},
"userBody": {
"type": "object"
},
"updateUserBody": {
"type": "object"
}
}
}
}
}
}
}
},
"actions": {
"Initialize_MatchedAttributesResult": {
"runAfter": {
"Initialize_AttributeMatchExcludeList": [
"Succeeded"
]
},
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "matchedAttributesResult",
"type": "Array",
"value": []
}
]
}
},
"Response_Immediate": {
"runAfter": {
"Initialize_MatchedAttributesResult": [
"Succeeded"
]
},
"type": "Response",
"kind": "Http",
"inputs": {
"statusCode": 202,
"body": {
"workflowRunId": "@workflow().run.name",
"workflowName": "@workflow().name",
"status": "Accepted",
"message": "UserTests workflow started. Tests are running asynchronously."
}
}
},
"Initialize_AttributeMatchExcludeList": {
"runAfter": {},
"type": "InitializeVariable",
"inputs": {
"variables": [
{
"name": "attributeMatchExcludeList",
"type": "Array",
"value": "@triggerBody()?['initializationData']?['updateTestExcludeList']"
}
]
}
},
"UserTests_Scope": {
"actions": {
"Create_User_Test": {
"actions": {
"Create_User_Test_Actions": {
"actions": {
"Create_User_Initial_Verify_User_Exists": {
"type": "Http",
"inputs": {
"uri": "@{concat(parameters('scimEndpoint'), '/Users?filter=userName%20eq%20%22', coalesce(triggerBody()?['initializationData']?['testUserNames']?['createUser'], ''), '%22')}",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}"
}
}
},
"Create_User_Graph": {
"runAfter": {
"Create_User_Initial_Verify_User_Exists": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"accountEnabled": true,
"displayName": "@{triggerBody()?['initializationData']?['testUserNames']?['createUser']}",
"mailNickname": "@{triggerBody()?['initializationData']?['testUserNames']?['createUserNickname']}",
"userPrincipalName": "@{triggerBody()?['initializationData']?['testUserNames']?['createUser']}",
"givenName": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['givenName']), concat('Given', substring(guid(),0,6)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['givenName'])}",
"surname": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['surname']), concat('Sur', substring(guid(),0,6)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['surname'])}",
"jobTitle": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['jobTitle']), concat('Title', substring(guid(),0,6)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['jobTitle'])}",
"department": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['department']), concat('Dept', substring(guid(),0,6)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['department'])}",
"companyName": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['companyName']), concat('Company', substring(guid(),0,6)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['companyName'])}",
"businessPhones": "@if(greater(length(coalesce(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['businessPhones'], json('[]'))), 0), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['businessPhones'], json(concat('[\"+ 1-555-', substring(guid(),0,4), '\"]')))",
"mobilePhone": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['mobilePhone']), concat('+1-555-', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['mobilePhone'])}",
"officeLocation": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['officeLocation']), concat('Office', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['officeLocation'])}",
"preferredLanguage": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['preferredLanguage']), 'en-US', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['preferredLanguage'])}",
"employeeId": "@{substring(guid(), 0, 8)}",
"employeeType": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeType']), 'Employee', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeType'])}",
"streetAddress": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['streetAddress']), concat('Street', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['streetAddress'])}",
"city": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['city']), concat('City', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['city'])}",
"state": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['state']), 'WA', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['state'])}",
"country": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['country']), 'US', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['country'])}",
"postalCode": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['postalCode']), substring(guid(),0,5), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['postalCode'])}",
"usageLocation": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['usageLocation']), 'US', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['usageLocation'])}",
"otherMails": "@if(greater(length(coalesce(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['otherMails'], json('[]'))), 0), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['otherMails'], json('[]'))",
"mail": "@{triggerBody()?['initializationData']?['testUserNames']?['createUserMail']}",
"faxNumber": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['faxNumber']), concat('+1-555-', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['faxNumber'])}",
"userType": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['userType']), 'Member', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['userType'])}",
"employeeOrgData": "@if(or(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['division']), empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['costCenter'])), json(concat('{\"division\":\"', if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['division']), concat('Div', substring(guid(),0,4)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['division']), '\",\"costCenter\":\"', if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['costCenter']), substring(guid(),0,5), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['costCenter']), '\"}')), json(concat('{\"division\":\"', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['division'], '\",\"costCenter\":\"', parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['employeeOrgData']?['costCenter'], '\"}')))",
"passwordProfile": {
"forceChangePasswordNextSignIn": "@{coalesce(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['passwordProfile']['forceChangePasswordNextSignIn'], true)}",
"password": "@{if(empty(parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['passwordProfile']['password']), concat('Tmp!', substring(guid(),0,8), '@', substring(guid(),24,8)), parameters('defaultUserProperties')[triggerBody()?['initializationData']?['testUserNames']?['index']]['passwordProfile']['password'])}"
}
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Assign_User_To_App": {
"runAfter": {
"Create_User_Graph": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users/@{body('Create_User_Graph')?['id']}/appRoleAssignments",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"principalId": "@{body('Create_User_Graph')?['id']}",
"resourceId": "@{parameters('servicePrincipalId')}",
"appRoleId": "@{coalesce(first(triggerBody()?['initializationData']?['userAppRole'])?['id'], first(triggerBody()?['initializationData']?['appRoles']?['appRoles'])?['id'])}"
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"DoUntil_Poll_Create_User": {
"actions": {
"SCIM_Query_Created_User": {
"type": "Http",
"inputs": {
"uri": "@{concat(parameters('scimEndpoint'), '/Users?filter=userName%20eq%20%22', coalesce(triggerBody()?['initializationData']?['testUserNames']?['createUser'], ''), '%22')}",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}"
}
}
},
"Delay_Create_User_15s": {
"runAfter": {
"SCIM_Query_Created_User": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"Assign_User_To_App": [
"Succeeded"
]
},
"expression": "@greater(length(coalesce(body('SCIM_Query_Created_User')?['Resources'], json('[]'))), 0)",
"limit": {
"count": 200,
"timeout": "PT60M"
},
"type": "Until"
},
"DoUntil_Poll_Provisioning_Logs": {
"actions": {
"Verify_Provisioning_Logs": {
"type": "Http",
"inputs": {
"uri": "@{concat('https://graph.microsoft.com/v1.0/auditLogs/provisioning?$top=1&$orderby=activityDateTime%20desc&$filter=jobId%20eq%20%27', triggerBody()?['initializationData']?['syncJobId'], '%27%20and%20servicePrincipal/id%20eq%20%27', parameters('servicePrincipalId'), '%27%20and%20sourceIdentity/id%20eq%20%27', body('Create_User_Graph')?['id'], '%27%20and%20provisioningAction%20eq%20%27Create%27')}",
"method": "GET",
"headers": {
"Accept": "application/json"
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Delay_Provisioning_Logs_15s": {
"runAfter": {
"Verify_Provisioning_Logs": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"DoUntil_Poll_Create_User": [
"Succeeded",
"Failed",
"TimedOut"
]
},
"expression": "@greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0)",
"limit": {
"count": 150,
"timeout": "PT40M"
},
"type": "Until"
}
},
"type": "Scope"
},
"Capture_Failed_Action_Details": {
"actions": {
"Get_Actions_Results": {
"type": "Compose",
"inputs": "@result('Create_User_Test_Actions')"
},
"Filter_Failed_Actions": {
"runAfter": {
"Get_Actions_Results": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@outputs('Get_Actions_Results')",
"where": "@equals(item()?['status'], 'Failed')"
}
},
"Set_Failed_Action_Name": {
"runAfter": {
"Filter_Failed_Actions": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "CreateUserFailedActionName",
"value": "@{if(greater(length(body('Filter_Failed_Actions')), 0), first(body('Filter_Failed_Actions'))?['name'], 'Unknown_Action')}"
}
},
"Set_Failed_Action_Response": {
"runAfter": {
"Set_Failed_Action_Name": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "CreateUserFailedActionResponse",
"value": "@if(greater(length(body('Filter_Failed_Actions')), 0), coalesce(first(body('Filter_Failed_Actions'))?['outputs'], json('{}')), json('{}'))"
}
},
"Set_Create_User_Test_Status_Failed": {
"runAfter": {
"Set_Failed_Action_Response": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "CreateUserScopeExecutionStatus",
"value": "Failed"
}
}
},
"runAfter": {
"Create_User_Test_Actions": [
"Failed"
]
},
"type": "Scope"
},
"Set_Create_User_Test_Status_Success": {
"runAfter": {
"Create_User_Test_Actions": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "CreateUserScopeExecutionStatus",
"value": "Succeeded"
}
},
"Create_User_Test_Analyze_Provisioning_Results": {
"runAfter": {
"Create_User_Test_Actions": [
"Succeeded",
"Failed",
"TimedOut"
],
"Capture_Failed_Action_Details": [
"Succeeded",
"Skipped"
],
"Set_Create_User_Test_Status_Success": [
"Succeeded",
"Skipped"
]
},
"type": "Compose",
"inputs": {
"provisioningLogsCount": "@length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]')))",
"hasProvisioningLogs": "@greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0)",
"provisioningStatus": "@if(greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0), coalesce(first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], 'UNKNOWN'), 'NO_LOGS_FOUND')",
"provisioningResult": "@if(equals(variables('CreateUserScopeExecutionStatus'), 'Succeeded'), if(greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0), if(equals(toLower(coalesce(first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], '')), 'success'), 'success', concat('Verify_Provisioning_Logs: ', coalesce(first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], 'UNKNOWN'))), 'Verify_Provisioning_Logs: NO_LOGS_FOUND'), concat('Failed Action: ', variables('CreateUserFailedActionName')))",
"provisioningErrorDetails": "@if(equals(variables('CreateUserScopeExecutionStatus'), 'Succeeded'), if(and(greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0), equals(toLower(first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status']), 'failure')), first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['errorInformation'], null), variables('CreateUserFailedActionResponse'))",
"scimCheckResult": "@if(equals(variables('CreateUserScopeExecutionStatus'), 'Succeeded'), if(coalesce(greater(length(coalesce(body('SCIM_Query_Created_User')?['Resources'], json('[]'))), 0), false), 'success', 'SCIM_Query_Created_User: User not found on SCIM server after provisioning'), concat('Failed Action: ', variables('CreateUserFailedActionName')))",
"scimCheckErrorDetails": "@if(equals(variables('CreateUserScopeExecutionStatus'), 'Succeeded'), if(coalesce(greater(length(coalesce(body('SCIM_Query_Created_User')?['Resources'], json('[]'))), 0), false), null, concat('SCIM verification failed: User not found on SCIM server after provisioning. SCIM query returned ', string(length(coalesce(body('SCIM_Query_Created_User')?['Resources'], json('[]')))), ' resources (expected >= 1). totalResults: ', string(coalesce(body('SCIM_Query_Created_User')?['totalResults'], 'N/A')))), concat('Scope execution failed. Failed action: ', variables('CreateUserFailedActionName')))",
"overallResult": "@if(equals(variables('CreateUserScopeExecutionStatus'), 'Succeeded'), if(and(and(greater(length(coalesce(body('Verify_Provisioning_Logs')?['value'], json('[]'))), 0), equals(toLower(coalesce(first(body('Verify_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], '')), 'success')), greater(length(coalesce(body('SCIM_Query_Created_User')?['Resources'], json('[]'))), 0)), 'PASSED', 'FAILED'), 'FAILED')"
}
},
"Set_CreateUser_Output_Variables": {
"actions": {
"Set_CreateUserTestOutputs": {
"type": "SetVariable",
"inputs": {
"name": "CreateUserTestOutputs",
"value": {
"result": "@if(and(equals(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), 'success'), equals(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['scimCheckResult'], ''), 'success')), 'success', if(startsWith(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), 'Failed Action:'), concat('FAILED - [Create Phase] ', coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], '')), concat('FAILED - [Create Phase] Provisioning: ', coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), ' | SCIM: ', coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['scimCheckResult'], ''))))",
"overallResult": "@outputs('Create_User_Test_Analyze_Provisioning_Results')?['overallResult']",
"provisioningLogsResult": "@if(and(contains(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), 'success'), not(contains(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), 'failure'))), 'success', 'failure')",
"scimCheckResult": "@if(equals(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['scimCheckResult'], ''), 'success'), 'success', 'failure')",
"errorDetails": {
"provisioningLogs": "@if(equals(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningResult'], ''), 'success'), null, coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['provisioningErrorDetails'], 'Analyze step failed - unable to retrieve provisioning error details'))",
"scimCheck": "@if(equals(coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['scimCheckResult'], ''), 'success'), null, coalesce(outputs('Create_User_Test_Analyze_Provisioning_Results')?['scimCheckErrorDetails'], 'Analyze step failed - unable to retrieve SCIM error details'))"
}
}
}
}
},
"runAfter": {
"Create_User_Test_Analyze_Provisioning_Results": [
"Succeeded",
"Failed"
]
},
"type": "Scope"
},
"Delete_Created_User": {
"runAfter": {
"Set_CreateUser_Output_Variables": [
"Succeeded",
"Failed",
"Skipped"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users/@{body('Create_User_Graph')?['id']}",
"method": "DELETE",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
}
},
"else": {
"actions": {}
},
"expression": {
"or": [
{
"equals": [
"@triggerBody()?['EnabledTests']",
"All"
]
},
{
"equals": [
"@triggerBody()?['EnabledTests']",
"UserTests"
]
},
{
"equals": [
"@triggerBody()?['EnabledTests']",
"Create_User_Test"
]
}
]
},
"type": "If"
},
"Update_User_Test": {
"actions": {
"Update_User_Test_-_Actions": {
"actions": {
"Update_User_Verify_Creation_And_Provisioning": {
"actions": {
"Update_User_-_Initial_Verify_User_Exists": {
"type": "Http",
"inputs": {
"uri": "@{concat(parameters('scimEndpoint'), '/Users?filter=userName%20eq%20%22', coalesce(triggerBody()?['initializationData']?['testUserNames']?['updateUser'], ''), '%22')}",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}"
}
}
},
"Update_User_-_Create_User_Graph": {
"runAfter": {
"Update_User_-_Initial_Verify_User_Exists": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": "@triggerBody()?['initializationData']?['userBody']",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Update_User_-_Assign_User_To_App": {
"runAfter": {
"Update_User_-_Create_User_Graph": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users/@{body('Update_User_-_Create_User_Graph')?['id']}/appRoleAssignments",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"principalId": "@{body('Update_User_-_Create_User_Graph')?['id']}",
"resourceId": "@{parameters('servicePrincipalId')}",
"appRoleId": "@{coalesce(first(triggerBody()?['initializationData']?['userAppRole'])?['id'], first(triggerBody()?['initializationData']?['appRoles']?['appRoles'])?['id'])}"
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Update_DoUntil_Wait_For_User_Creation": {
"actions": {
"Update_User_Verify_User_Created": {
"type": "Http",
"inputs": {
"uri": "@{concat(parameters('scimEndpoint'), '/Users?filter=userName%20eq%20%22', coalesce(triggerBody()?['initializationData']?['testUserNames']?['updateUser'], ''), '%22')}",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}",
"Content-Type": "@{parameters('scimContentType')}"
}
}
},
"Update_Delay_Creation_15s": {
"runAfter": {
"Update_User_Verify_User_Created": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"Update_User_-_Assign_User_To_App": [
"Succeeded"
]
},
"expression": "@greater(length(coalesce(body('Update_User_Verify_User_Created')?['Resources'], json('[]'))), 0)",
"limit": {
"count": 200,
"timeout": "PT60M"
},
"type": "Until"
},
"Update_DoUntil_Poll_Create_Provisioning_Logs": {
"actions": {
"Update_Verify_Create_Provisioning_Logs": {
"type": "Http",
"inputs": {
"uri": "@concat('https://graph.microsoft.com/v1.0/auditLogs/provisioning?$top=1&$orderby=activityDateTime%20desc&$filter=jobId%20eq%20%27', triggerBody()?['initializationData']?['syncJobId'], '%27%20and%20servicePrincipal/id%20eq%20%27', parameters('servicePrincipalId'), '%27%20and%20sourceIdentity/id%20eq%20%27', body('Update_User_-_Create_User_Graph')?['id'], '%27%20and%20provisioningAction%20eq%20%27Create%27')",
"method": "GET",
"headers": {
"Accept": "application/json"
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Update_Delay_Create_Provisioning_Logs_15s": {
"runAfter": {
"Update_Verify_Create_Provisioning_Logs": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"Update_DoUntil_Wait_For_User_Creation": [
"Succeeded"
]
},
"expression": "@greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0)",
"limit": {
"count": 150,
"timeout": "PT40M"
},
"type": "Until"
}
},
"type": "Scope"
},
"Update_User_Analyze_Create_Provisioning_Results": {
"runAfter": {
"Update_User_Verify_Creation_And_Provisioning": [
"Succeeded",
"Failed",
"TimedOut"
],
"Capture_Update_CreatePhase_Failed_Actions": [
"Succeeded",
"Skipped"
],
"Set_UpdateUser_CreatePhase_Status_Success": [
"Succeeded",
"Skipped"
]
},
"type": "Compose",
"inputs": {
"provisioningLogsCount": "@length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]')))",
"hasProvisioningLogs": "@greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0)",
"provisioningStatus": "@if(greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0), coalesce(first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], 'UNKNOWN'), 'NO_LOGS_FOUND')",
"provisioningResult": "@if(equals(variables('UpdateUserScopeExecutionStatus'), 'Succeeded'), if(greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0), if(equals(toLower(coalesce(first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], '')), 'success'), 'success', concat('Update_Verify_Create_Provisioning_Logs: ', coalesce(first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], 'UNKNOWN'))), 'Update_Verify_Create_Provisioning_Logs: NO_LOGS_FOUND'), concat('Failed Action: ', variables('UpdateUserFailedActionName')))",
"provisioningErrorDetails": "@if(equals(variables('UpdateUserScopeExecutionStatus'), 'Succeeded'), if(and(greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0), equals(toLower(first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status']), 'failure')), first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['errorInformation'], null), variables('UpdateUserFailedActionResponse'))",
"scimCheckResult": "@if(equals(variables('UpdateUserScopeExecutionStatus'), 'Succeeded'), if(coalesce(greater(length(coalesce(body('Update_User_Verify_User_Created')?['Resources'], json('[]'))), 0), false), 'success', 'Update_User_Verify_User_Created: User not found on SCIM server after provisioning'), concat('Failed Action: ', variables('UpdateUserFailedActionName')))",
"scimCheckErrorDetails": "@if(equals(variables('UpdateUserScopeExecutionStatus'), 'Succeeded'), if(coalesce(greater(length(coalesce(body('Update_User_Verify_User_Created')?['Resources'], json('[]'))), 0), false), null, concat('SCIM verification failed: User not found on SCIM server after provisioning. SCIM query returned ', string(length(coalesce(body('Update_User_Verify_User_Created')?['Resources'], json('[]')))), ' resources (expected >= 1). totalResults: ', string(coalesce(body('Update_User_Verify_User_Created')?['totalResults'], 'N/A')))), concat('Scope execution failed. Failed action: ', variables('UpdateUserFailedActionName')))",
"overallResult": "@if(equals(variables('UpdateUserScopeExecutionStatus'), 'Succeeded'), if(and(and(greater(length(coalesce(body('Update_Verify_Create_Provisioning_Logs')?['value'], json('[]'))), 0), equals(toLower(coalesce(first(body('Update_Verify_Create_Provisioning_Logs')?['value'])?['provisioningStatusInfo']?['status'], '')), 'success')), greater(length(coalesce(body('Update_User_Verify_User_Created')?['Resources'], json('[]'))), 0)), 'PASSED', 'FAILED'), 'FAILED')"
}
},
"Update_User_Check_Create_Phase_Status": {
"actions": {
"Update_User_Verify_Update_And_Provisioning": {
"actions": {
"Update_User_Query_User_By_Id": {
"runAfter": {},
"type": "Http",
"inputs": {
"uri": "@concat(parameters('scimEndpoint'), '/Users?filter=userName%20eq%20%22', coalesce(triggerBody()?['initializationData']?['testUserNames']?['updateUser'], ''), '%22')",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}"
}
}
},
"Update_User_Update_User_Attributes": {
"runAfter": {
"Update_User_Query_User_By_Id": [
"Succeeded",
"Failed"
]
},
"type": "Http",
"inputs": {
"uri": "https://graph.microsoft.com/v1.0/users/@{body('Update_User_-_Create_User_Graph')?['id']}",
"method": "PATCH",
"headers": {
"Content-Type": "application/json"
},
"body": "@triggerBody()?['initializationData']?['updateUserBody']",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Update_DoUntil_Wait_For_Attribute_Updates": {
"actions": {
"Update_User_-_Query_User_By_Id_After_Attributes_Update": {
"type": "Http",
"inputs": {
"uri": "@concat(parameters('scimEndpoint'), '/Users/', coalesce(first(body('Update_User_Query_User_By_Id')?['Resources'])?['id'], ''))",
"method": "GET",
"headers": {
"Authorization": "@{concat('Bearer ', parameters('scimBearerToken'))}",
"Accept": "@{parameters('scimContentType')}"
}
}
},
"Update_Delay_Final_15s": {
"runAfter": {
"Update_User_-_Query_User_By_Id_After_Attributes_Update": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"Update_User_Update_User_Attributes": [
"Succeeded"
]
},
"expression": "@and(not(empty(body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?['id'])), if(not(empty(coalesce(triggerBody()?['initializationData']?['updateUserBody']?['userPrincipalName'], ''))), equals(coalesce(body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?['userName'], ''), coalesce(triggerBody()?['initializationData']?['updateUserBody']?['userPrincipalName'], '')), if(not(empty(coalesce(triggerBody()?['initializationData']?['updateUserBody']?['displayName'], ''))), equals(coalesce(body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?['displayName'], ''), coalesce(triggerBody()?['initializationData']?['updateUserBody']?['displayName'], '')), false)))",
"limit": {
"count": 200,
"timeout": "PT60M"
},
"type": "Until"
},
"ForEach_SourceToTargetLookup": {
"foreach": "@triggerBody()?['initializationData']?['sourceToTargetLookup']",
"actions": {
"Query_Filter_Array_By_Type": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@if(contains(items('ForEach_SourceToTargetLookup')?['target'], '[type eq'), coalesce(body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?[first(split(items('ForEach_SourceToTargetLookup')?['target'], '['))], json('[]')), json('[]'))",
"where": "@equals(toLower(item()?['type']), toLower(replace(replace(first(split(last(split(items('ForEach_SourceToTargetLookup')?['target'], 'type eq ')), ']')), '\"', ''), '''', '')))"
}
},
"Condition_Not_In_ExcludeList": {
"runAfter": {
"Query_Filter_Array_By_Type": [
"Succeeded",
"Failed"
]
},
"type": "If",
"expression": {
"and": [
{
"not": {
"contains": [
"@variables('attributeMatchExcludeList')",
"@items('ForEach_SourceToTargetLookup')?['source']"
]
}
}
]
},
"actions": {
"Filter_Join_Sources": {
"runAfter": {},
"type": "Query",
"inputs": {
"from": "@coalesce(items('ForEach_SourceToTargetLookup')?['functionParameters'], json('[]'))",
"where": "@and(equals(item()?['key'], 'source'), equals(item()?['value']?['type'], 'Attribute'))"
}
},
"Select_Join_Values": {
"runAfter": {
"Filter_Join_Sources": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Filter_Join_Sources')",
"select": "@coalesce(triggerBody()?['initializationData']?['updateUserBody']?[item()?['value']?['name']], '')"
}
},
"Filter_Join_Separator": {
"runAfter": {
"Select_Join_Values": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@coalesce(items('ForEach_SourceToTargetLookup')?['functionParameters'], json('[]'))",
"where": "@equals(item()?['key'], 'separator')"
}
},
"Compose_Expected_Value": {
"runAfter": {
"Filter_Join_Separator": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@if(equals(coalesce(items('ForEach_SourceToTargetLookup')?['function'], ''), 'Join'), join(body('Select_Join_Values'), string(coalesce(first(body('Filter_Join_Separator'))?['value']?['name'], first(body('Filter_Join_Separator'))?['value']?['expression'], ' '))), if(equals(coalesce(items('ForEach_SourceToTargetLookup')?['function'], ''), 'ToLower'), toLower(string(if(contains(triggerBody()?['initializationData']?['arrayProperties'], items('ForEach_SourceToTargetLookup')?['source']), first(triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']]), if(contains(items('ForEach_SourceToTargetLookup')?['source'], '.'), triggerBody()?['initializationData']?['updateUserBody']?[first(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))]?[last(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))], triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']])))), if(equals(coalesce(items('ForEach_SourceToTargetLookup')?['function'], ''), 'ToUpper'), toUpper(string(if(contains(triggerBody()?['initializationData']?['arrayProperties'], items('ForEach_SourceToTargetLookup')?['source']), first(triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']]), if(contains(items('ForEach_SourceToTargetLookup')?['source'], '.'), triggerBody()?['initializationData']?['updateUserBody']?[first(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))]?[last(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))], triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']])))), if(contains(triggerBody()?['initializationData']?['arrayProperties'], items('ForEach_SourceToTargetLookup')?['source']), first(triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']]), if(contains(items('ForEach_SourceToTargetLookup')?['source'], '.'), triggerBody()?['initializationData']?['updateUserBody']?[first(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))]?[last(split(items('ForEach_SourceToTargetLookup')?['source'], '.'))], triggerBody()?['initializationData']?['updateUserBody']?[items('ForEach_SourceToTargetLookup')?['source']])))))"
},
"Append_Matched_Attribute_Result": {
"runAfter": {
"Compose_Expected_Value": [
"Succeeded"
]
},
"type": "AppendToArrayVariable",
"inputs": {
"name": "matchedAttributesResult",
"value": {
"sourceAttribute": "@items('ForEach_SourceToTargetLookup')?['source']",
"targetAttribute": "@items('ForEach_SourceToTargetLookup')?['target']",
"expectedValue": "@outputs('Compose_Expected_Value')",
"actualValue": "@if(contains(items('ForEach_SourceToTargetLookup')?['target'], '[type eq'), if(contains(items('ForEach_SourceToTargetLookup')?['target'], '].'), first(body('Query_Filter_Array_By_Type'))?[last(split(items('ForEach_SourceToTargetLookup')?['target'], '.'))], first(body('Query_Filter_Array_By_Type'))?['value']), if(and(contains(items('ForEach_SourceToTargetLookup')?['target'], '.'), not(contains(items('ForEach_SourceToTargetLookup')?['target'], ':'))), body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?[first(split(items('ForEach_SourceToTargetLookup')?['target'], '.'))]?[last(split(items('ForEach_SourceToTargetLookup')?['target'], '.'))], coalesce(body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']?[last(split(last(split(items('ForEach_SourceToTargetLookup')?['target'], ':')), '.'))], body('Update_User_-_Query_User_By_Id_After_Attributes_Update')?[last(split(last(split(items('ForEach_SourceToTargetLookup')?['target'], ':')), '.'))])))"
}
}
}
},
"else": {
"actions": {}
}
}
},
"runAfter": {
"Update_DoUntil_Wait_For_Attribute_Updates": [
"Succeeded",
"TimedOut",
"Failed"
]
},
"type": "Foreach",
"runtimeConfiguration": {
"concurrency": {
"repetitions": 1
}
}
},
"Update_User_-_Match_Expected_Attributes_After_Attributes_Update": {
"runAfter": {
"ForEach_SourceToTargetLookup": [
"Succeeded"
]
},
"type": "Compose",
"inputs": "@variables('matchedAttributesResult')"
},
"Update_User_-_Filter_Mismatched_Attributes": {
"runAfter": {
"Update_User_-_Match_Expected_Attributes_After_Attributes_Update": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@coalesce(outputs('Update_User_-_Match_Expected_Attributes_After_Attributes_Update'), json('[]'))",
"where": "@not(equals(toLower(string(coalesce(item()?['expectedValue'], ''))), toLower(string(coalesce(item()?['actualValue'], '')))))"
}
},
"Update_User_-_Attribute_Match_Summary": {
"runAfter": {
"Update_User_-_Filter_Mismatched_Attributes": [
"Succeeded"
]
},
"type": "Compose",
"inputs": {
"totalAttributesVerified": "@length(coalesce(body('Update_User_-_Match_Expected_Attributes_After_Attributes_Update'), json('[]')))",
"allAttributesMatch": "@equals(length(coalesce(body('Update_User_-_Filter_Mismatched_Attributes'), json('[]'))), 0)",
"mismatchCount": "@length(coalesce(body('Update_User_-_Filter_Mismatched_Attributes'), json('[]')))",
"mismatchedAttributes": "@coalesce(body('Update_User_-_Filter_Mismatched_Attributes'), json('[]'))",
"matchedCount": "@sub(length(coalesce(body('Update_User_-_Match_Expected_Attributes_After_Attributes_Update'), json('[]'))), length(coalesce(body('Update_User_-_Filter_Mismatched_Attributes'), json('[]'))))"
}
},
"Update_DoUntil_Poll_Update_Provisioning_Logs": {
"actions": {
"Update_Verify_Update_Provisioning_Logs": {
"type": "Http",
"inputs": {
"uri": "@concat('https://graph.microsoft.com/v1.0/auditLogs/provisioning?$filter=jobId%20eq%20%27', triggerBody()?['initializationData']?['syncJobId'], '%27%20and%20servicePrincipal/id%20eq%20%27', parameters('servicePrincipalId'), '%27%20and%20sourceIdentity/id%20eq%20%27', body('Update_User_-_Create_User_Graph')?['id'], '%27%20and%20provisioningAction%20eq%20%27Update%27&$top=1&$orderby=activityDateTime%20desc')",
"method": "GET",
"headers": {
"Accept": "application/json"
},
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://graph.microsoft.com/"
}
}
},
"Update_Delay_Update_Provisioning_Logs_15s": {
"runAfter": {
"Update_Verify_Update_Provisioning_Logs": [
"Succeeded",
"Failed"
]
},
"type": "Wait",
"inputs": {
"interval": {
"count": 15,
"unit": "Second"
}
}
}
},
"runAfter": {
"Update_User_-_Match_Expected_Attributes_After_Attributes_Update": [
"Succeeded",
"Failed"
]
},
"expression": "@greater(length(coalesce(body('Update_Verify_Update_Provisioning_Logs')?['value'], json('[]'))), 0)",
"limit": {
"count": 150,
"timeout": "PT40M"
},
"type": "Until"
}
},
"type": "Scope"
},
"Capture_Update_UpdatePhase_Failed_Actions": {
"actions": {
"Get_Failed_UpdatePhase_Actions": {
"type": "Compose",
"inputs": "@result('Update_User_Verify_Update_And_Provisioning')"
},
"Filter_Failed_UpdatePhase_Actions": {
"runAfter": {
"Get_Failed_UpdatePhase_Actions": [
"Succeeded"
]
},
"type": "Query",
"inputs": {
"from": "@outputs('Get_Failed_UpdatePhase_Actions')",
"where": "@equals(item()?['status'], 'Failed')"
}
},
"Set_UpdateUser_UpdatePhase_Failed_Action_Name": {
"runAfter": {
"Filter_Failed_UpdatePhase_Actions": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "UpdateUserFailedActionName",
"value": "@{if(greater(length(body('Filter_Failed_UpdatePhase_Actions')), 0), first(body('Filter_Failed_UpdatePhase_Actions'))?['name'], 'Unknown_Action')}"
}
},
"Set_UpdateUser_UpdatePhase_Failed_Action_Response": {
"runAfter": {
"Set_UpdateUser_UpdatePhase_Failed_Action_Name": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "UpdateUserFailedActionResponse",
"value": "@if(greater(length(body('Filter_Failed_UpdatePhase_Actions')), 0), coalesce(first(body('Filter_Failed_UpdatePhase_Actions'))?['outputs'], json('{}')), json('{}'))"
}
},
"Set_UpdateUser_UpdatePhase_Status_Failed": {
"runAfter": {
"Set_UpdateUser_UpdatePhase_Failed_Action_Response": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "UpdateUserScopeExecutionStatus",
"value": "Failed"
}
}
},
"runAfter": {
"Update_User_Verify_Update_And_Provisioning": [
"Failed"
]
},
"type": "Scope"
},
"Set_UpdateUser_UpdatePhase_Status_Success": {
"runAfter": {
"Update_User_Verify_Update_And_Provisioning": [
"Succeeded"
]
},
"type": "SetVariable",
"inputs": {
"name": "UpdateUserScopeExecutionStatus",
"value": "Succeeded"
}
},
"Set_UpdateUser_UpdatePhase_Output_Variables": {
"actions": {
"Set_UpdateUserTest_UpdatePhase_Outputs": {
"type": "SetVariable",
"inputs": {
"name": "UpdateUserTestOutputs",
"value": {
"result": "@if(and(equals(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), 'success'), equals(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['scimCheckResult'], ''), 'success')), 'success', if(startsWith(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), 'Failed Action:'), concat('FAILED - [Update Phase] ', coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], '')), concat('FAILED - [Update Phase] Provisioning: ', coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), ' | SCIM: ', coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['scimCheckResult'], ''))))",
"overallResult": "@outputs('Update_Analyze_Update_Provisioning_Results')?['overallResult']",
"provisioningLogsResult": "@if(and(contains(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), 'success'), not(contains(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), 'failure'))), 'success', 'failure')",
"scimCheckResult": "@if(equals(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['scimCheckResult'], ''), 'success'), 'success', 'failure')",
"errorDetails": {
"provisioningLogs": "@if(equals(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningResult'], ''), 'success'), null, coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['provisioningErrorDetails'], 'Analyze step failed - unable to retrieve provisioning error details'))",
"scimCheck": "@if(equals(coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['scimCheckResult'], ''), 'success'), null, coalesce(outputs('Update_Analyze_Update_Provisioning_Results')?['scimCheckErrorDetails'], 'Analyze step failed - unable to retrieve SCIM error details'))"
}