private bool IsRuleInTimeframe(SchedulingRule schedulingRule, DateTime requestedTime)
        {
            bool isRuleInTimeframe = false;

            // check if in timeframe by scope
            switch (schedulingRule.Scope)
            {
            case SchedulingScope.Day:
                isRuleInTimeframe = true;
                break;

            case SchedulingScope.Week:
                var dayOfWeek = (int)requestedTime.DayOfWeek;
                if (schedulingRule.Days.Contains(dayOfWeek))
                {
                    isRuleInTimeframe = true;
                }
                break;

            case SchedulingScope.Month:
                var dayOfMonth = requestedTime.Day;
                if (schedulingRule.Days.Contains(dayOfMonth))
                {
                    isRuleInTimeframe = true;
                }
                break;
            }

            isRuleInTimeframe = (isRuleInTimeframe) &&
                                ((requestedTime >= _timeframeFrom && requestedTime <= _timeframeTo) ||
                                 (requestedTime <= _timeframeFrom &&
                                  (requestedTime.Add(schedulingRule.MaxDeviationAfter) >= DateTime.Now)));

            return(isRuleInTimeframe);
        }
        public static string DebugInfo(this SchedulingRule rule)
        {
            if (rule == null)
            {
                return(String.Empty);
            }

            return(String.Format("Requested time={0}, scope={1}, max deviation after={2}",
                                 rule.Scope, rule.Times.Length > 0 ? rule.Times[0].ToString(@"hh\:mm\:ss") : String.Empty, rule.MaxDeviationAfter.ToString(@"hh\:mm\:ss")));
        }
        private ServiceInstance CreateServiceInstance(ServiceConfiguration config, SchedulingRule rule, DateTime requestedTime)
        {
            try
            {
                ServiceInstance request = Environment.NewServiceInstance(config);

                request.SchedulingInfo = new SchedulingInfo
                {
                    SchedulingStatus   = SchedulingStatus.New,
                    SchedulingScope    = rule.Scope,
                    RequestedTime      = requestedTime,
                    MaxDeviationBefore = rule.MaxDeviationBefore,
                    MaxDeviationAfter  = rule.MaxDeviationAfter,
                };
                AsLockable(request).Lock(_instanceLock);

                return(request);
            }
            catch (Exception ex)
            {
                WriteLog(String.Format("Failed create instance for service '{0}' rule '{1}', ex: {2}", config.DebugInfo(), rule.DebugInfo(), ex.Message), ex);
            }
            return(null);
        }