public async Task <bool> ValidateGroupAsync([ActivityTrigger] GroupValidatorRequest request)
        {
            await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"{nameof(GroupValidatorFunction)} function started", RunId = request.RunId });

            bool isExistingGroup   = false;
            var  groupExistsResult = await _graphUpdaterService.GroupExistsAsync(request.GroupId, request.RunId);

            if (groupExistsResult.Outcome == OutcomeType.Successful && groupExistsResult.Result)
            {
                await _loggingRepository.LogMessageAsync(new LogMessage { RunId = request.RunId, Message = $"Group with ID {request.GroupId} exists." });

                isExistingGroup = true;
            }
            else
            {
                if (groupExistsResult.Outcome == OutcomeType.Successful)
                {
                    await _loggingRepository.LogMessageAsync(new LogMessage { RunId = request.RunId, Message = $"Group with ID {request.GroupId} doesn't exist." });

                    var syncJob = await _graphUpdaterService.GetSyncJobAsync(request.JobPartitionKey, request.JobRowKey);

                    if (syncJob != null)
                    {
                        await _graphUpdaterService.SendEmailAsync(
                            syncJob.Requestor,
                            SyncDisabledNoGroupEmailBody,
                            new[] { request.GroupId.ToString(), _emailSenderAndRecipients.SupportEmailAddresses },
                            request.RunId);
                    }
                }
                else if (groupExistsResult.FaultType == FaultType.ExceptionHandledByThisPolicy)
                {
                    await _loggingRepository.LogMessageAsync(new LogMessage { RunId = request.RunId, Message = $"Exceeded {NumberOfGraphRetries} while trying to determine if a group exists." });
                }

                if (groupExistsResult.FinalException != null)
                {
                    throw groupExistsResult.FinalException;
                }

                isExistingGroup = false;
            }

            await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"{nameof(GroupValidatorFunction)} function completed", RunId = request.RunId });

            return(isExistingGroup);
        }
Example #2
0
        public async Task <DeltaResponse> CalculateDifferenceAsync(GroupMembership membership, List <AzureADUser> membersFromDestinationGroup)
        {
            var deltaResponse = new DeltaResponse
            {
                IsDryRunSync = _isGraphUpdaterDryRunEnabled
            };

            var fromto   = $"to {membership.Destination}";
            var changeTo = SyncStatus.Idle;

            var job = await _syncJobRepository.GetSyncJobAsync(membership.SyncJobPartitionKey, membership.SyncJobRowKey);

            SetupLoggingRepository(membership, job);

            if (job == null)
            {
                await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"Sync job : Partition key {membership.SyncJobPartitionKey}, Row key {membership.SyncJobRowKey} was not found!", RunId = membership.RunId });

                deltaResponse.GraphUpdaterStatus = GraphUpdaterStatus.Error;
                deltaResponse.SyncStatus         = SyncStatus.Error;
                deltaResponse.IsDryRunSync       = membership.MembershipObtainerDryRunEnabled || _isGraphUpdaterDryRunEnabled;
                return(deltaResponse);
            }

            var isDryRunSync = _loggingRepository.DryRun = job.IsDryRunEnabled || membership.MembershipObtainerDryRunEnabled || _isGraphUpdaterDryRunEnabled;

            await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"The Dry Run Enabled configuration is currently set to {isDryRunSync}. We will not be syncing members if any of the 3 Dry Run Enabled configurations is set to True.", RunId = membership.RunId });

            await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"Processing sync job : Partition key {membership.SyncJobPartitionKey} , Row key {membership.SyncJobRowKey}", RunId = membership.RunId });

            await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"{job.TargetOfficeGroupId} job's status is {job.Status}.", RunId = membership.RunId });

            var groupExistsResult = await _graphUpdaterService.GroupExistsAsync(membership.Destination.ObjectId, membership.RunId);

            if (!groupExistsResult.Result)
            {
                await _loggingRepository.LogMessageAsync(new LogMessage { Message = $"When syncing {fromto}, destination group {membership.Destination} doesn't exist. Not syncing and marking as error.", RunId = membership.RunId });

                changeTo = SyncStatus.Error;
            }

            if (changeTo == SyncStatus.Idle)
            {
                var delta = await CalculateDeltaAsync(membership, fromto, membersFromDestinationGroup);

                var isInitialSync = job.LastRunTime == DateTime.FromFileTimeUtc(0);
                var threshold     = isInitialSync ? new ThresholdResult() : await CalculateThresholdAsync(job, delta.Delta, delta.TotalMembersCount, membership.RunId);

                deltaResponse.MembersToAdd       = delta.Delta.ToAdd;
                deltaResponse.MembersToRemove    = delta.Delta.ToRemove;
                deltaResponse.SyncStatus         = SyncStatus.Idle;
                deltaResponse.IsInitialSync      = isInitialSync;
                deltaResponse.IsDryRunSync       = isDryRunSync;
                deltaResponse.Requestor          = job.Requestor;
                deltaResponse.SyncJobType        = job.Type;
                deltaResponse.Timestamp          = job.Timestamp;
                deltaResponse.GraphUpdaterStatus = GraphUpdaterStatus.Ok;

                if (threshold.IsThresholdExceeded)
                {
                    deltaResponse.GraphUpdaterStatus = GraphUpdaterStatus.ThresholdExceeded;

                    await SendThresholdNotificationAsync(threshold, job, membership.RunId);

                    return(deltaResponse);
                }
            }

            if (changeTo == SyncStatus.Error)
            {
                return(new DeltaResponse
                {
                    GraphUpdaterStatus = GraphUpdaterStatus.Error,
                    SyncStatus = SyncStatus.Error,
                    IsDryRunSync = isDryRunSync,
                });
            }

            return(deltaResponse);
        }