public virtual async Task <DeltaResponse <T> > GetDeltaResponseAsync(DateTime?minLastDateTimeChangedUtc = null)
        {
            var storageInfo = await GetStorageInfoAsync();

            var response = new DeltaResponse <T>()
            {
                StorageDeltaStartChangeDateTimeUtc = storageInfo.DeltaStartDateTimeUtc,
                StorageLastChangeDateTimeUtc       = storageInfo.LastChangeDateTimeUtc
            };

            if (!minLastDateTimeChangedUtc.HasValue || minLastDateTimeChangedUtc < storageInfo.DeltaStartDateTimeUtc)
            {
                response.RemoveAllBeforeInsert = true;
                response.DeletedEntities       = new Guid[0];
                response.ChangedEntities       =
                    (await _entityRepository.FindAllAsync(includeDeletedRecords: false)).ToArray();
            }
            else
            {
                response.RemoveAllBeforeInsert = false;

                var entities = (await _entityRepository.FindAllAsync(includeDeletedRecords: true,
                                                                     minLastDateTimeChangedUtc: minLastDateTimeChangedUtc)).ToList();

                response.ChangedEntities = entities.Where(a => a.IsDeleted == 0).ToArray();
                response.DeletedEntities = entities.Where(a => a.IsDeleted == 1).Select(a => a.Id).ToArray();
            }

            return(response);
        }
예제 #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);
        }
    private void getDelta(string accTok, string endP, string delta)
    {
        try
        {
            string contextURL = string.Empty;
            contextURL = string.Empty + endP + "/myMessages/v2/delta?state=" + delta;
            HttpWebRequest deltaWebRequest = (HttpWebRequest)WebRequest.Create(contextURL);
            deltaWebRequest.Headers.Add("Authorization", "Bearer " + accTok);
            deltaWebRequest.Method = "GET";
            deltaWebRequest.KeepAlive = true;
            WebResponse deltaWebResponse = deltaWebRequest.GetResponse();
            using (var stream = deltaWebResponse.GetResponseStream())
            {
                StreamReader sr = new StreamReader(stream);
                string deltaMessageData = sr.ReadToEnd();
                JavaScriptSerializer deserializeJsonObject = new JavaScriptSerializer();
                csGetDeltaDetails deserializedJsonObj = (csGetDeltaDetails)deserializeJsonObject.Deserialize(deltaMessageData, typeof(csGetDeltaDetails));
                if (null != deserializedJsonObj)
                {
                    deltaSuccessResponse = deltaMessageData + ":Success";
                    csDeltaResponse = deserializedJsonObj.deltaResponse;
                }
                else
                {
                    deltaErrorResponse = "No response from server";
                }

                stream.Close();
            }
        }
        catch (WebException we)
        {
            string errorResponse = string.Empty;
            try
            {
                using (StreamReader sr2 = new StreamReader(we.Response.GetResponseStream()))
                {
                    errorResponse = sr2.ReadToEnd();
                    sr2.Close();
                }
                deltaErrorResponse = errorResponse;
            }
            catch
            {
                errorResponse = "Unable to get response";
                deltaErrorResponse = errorResponse;
            }
        }
        catch (Exception ex)
        {
            deltaErrorResponse = ex.Message;
            return;
        }
    }
예제 #4
0
 public void Init()
 {
     instance = new DeltaResponse();
 }