示例#1
0
        /// <summary>
        /// at this time, there is always only one feature to be activated or deactivated in a location with same scope
        /// </summary>
        /// <param name="message"></param>
        private void HandleFeatureToggleRequest(FeatureToggleRequest message)
        {
            _log.Debug("Entered LocationActor-HandleFeatureToggleRequest");

            if (message.Activate)
            {
                ActivatedFeature af;
                var error = dataService.ActivateFeature(
                    message.FeatureDefinition
                    , message.Location
                    , message.ElevatedPrivileges
                    , message.Force
                    , out af);

                var completed = new Core.Messages.Completed.FeatureActivationCompleted(
                    message.TaskId
                    , message.Location.Id
                    , af
                    , string.Empty
                    );

                Sender.Tell(completed);
            }
            else
            {
                var completed = new Core.Messages.Completed.FeatureDeactivationCompleted(
                    message.TaskId
                    , message.Location.Id
                    , string.Empty
                    );

                Sender.Tell(completed);
            }
        }
        public FeatureToggleResponse IsEnabled(FeatureToggleRequest request)
        {
            var response = new FeatureToggleResponse
            {
                Enabled = IsEnabled(request.ServiceName, request.UserName, request.MachineName, request.Feature)
            };

            _logger.Debug("FeatureToggle retrieved {@Request} {@Response}", request, response);

            return(response);
        }
        private bool Get(string feature)
        {
            var request = new FeatureToggleRequest
            {
                ServiceName = _serviceName,
                UserName    = _userName,
                MachineName = _machineName,
                Feature     = feature
            };

            var response = _messageBus.Request <FeatureToggleRequest, FeatureToggleResponse>(FeatureToggleConfig.RequestFeatureToggle, request);

            _logger.Information("Feature Toggle {Feature} {Enabled} {@Request}", feature, response.Enabled, request);

            return(response.Enabled);
        }
示例#4
0
        private void HandleFeatureToggleRequest([NotNull] FeatureToggleRequest message)
        {
            _log.Debug("Entered HandleFeatureToggleRequest with Id " + Id.ToString());


            IEnumerable <Location> actionLocations;

            if (message.Activate)
            {
                // retrieve locations where to activate
                actionLocations = repository.GetLocationsCanActivate(message.FeatureDefinition, message.Location);
            }
            else
            {
                // retrieve locations where to deactivate
                actionLocations = repository.GetLocationsCanDeactivate(message.FeatureDefinition, message.Location);
            }


            // create Location actors and trigger feature actions

            foreach (Location l in actionLocations)
            {
                var toggleRequestForThisLocation = new FeatureToggleRequest(
                    message.FeatureDefinition
                    , l
                    , message.Activate
                    );

                if (!executingActors.ContainsKey(l.Id))
                {
                    IActorRef newLocationActor =
                        Context.ActorOf(Context.DI().Props <LocationActor>());

                    executingActors.Add(l.Id, newLocationActor);

                    newLocationActor.Tell(toggleRequestForThisLocation);
                }
                else
                {
                    executingActors[l.Id].Tell(toggleRequestForThisLocation);
                }
            }
        }
        /// <summary>
        /// at this time, there is always only one feature to be activated or deactivated in a location with same scope
        /// </summary>
        /// <param name="message"></param>
        private void ReceiveFeatureToggleRequest(FeatureToggleRequest message)
        {
            _log.Debug("Entered LocationActor-HandleFeatureToggleRequest");

            if (!TaskCanceled)
            {
                try
                {
                    switch (message.Action)
                    {
                    case Core.Models.Enums.FeatureAction.Activate:
                        HandleActivation(message);
                        break;

                    case Core.Models.Enums.FeatureAction.Deactivate:
                        HandleDeactivation(message);
                        break;

                    case Core.Models.Enums.FeatureAction.Upgrade:
                        HandleUpgrade(message);
                        break;

                    default:
                        throw new NotImplementedException("this action verb is not known to location actor for task id " + message.TaskId);
                    }
                }
                catch (Exception ex)
                {
                    var cancelationMsg = new CancelMessage(
                        message.TaskId,
                        ex.Message,
                        true,
                        ex
                        );

                    Sender.Tell(cancelationMsg);
                }
            }
        }
        private void HandleUpgradeFeaturesRequest(UpgradeFeaturesRequest message)
        {
            _log.Debug("Entered HandleUpgradeFeaturesRequest with Id " + Id.ToString());

            if (!TaskCanceled)
            {
                Title = message.Title;

                if (isSubTaskActor)
                {
                    ParentTaskActor = Sender;
                }

                requestsToBeConfirmed = new List <FeatureToggleRequest>();

                foreach (ActivatedFeatureSpecial af in message.Features)
                {
                    var toggleRequest = new FeatureToggleRequest(
                        af.Definition,
                        af.Location,
                        Enums.FeatureAction.Upgrade,
                        message.Force,
                        message.ElevatedPrivileges
                        );
                    requestsToBeConfirmed.Add(toggleRequest);
                }

                var confirmRequest = new ConfirmationRequest(
                    "Please confirm Feature upgrade",
                    Title,
                    message.TaskId,
                    true
                    );


                eventAggregator.PublishOnUIThread(confirmRequest);
            }
        }
        private void HandleFeatureToggleRequest([NotNull] FeatureToggleRequest message)
        {
            _log.Debug("Entered HandleFeatureToggleRequest with Id " + Id.ToString());

            if (!TaskCanceled)
            {
                if (isSubTaskActor)
                {
                    ParentTaskActor = Sender;
                }

                Title = message.Title;

                IEnumerable <Location> targetLocations;

                if (message.Action == Enums.FeatureAction.Activate)
                {
                    // retrieve locations where to activate
                    targetLocations = repository.GetLocationsCanActivate(message.FeatureDefinition, message.Location);
                }
                else if (message.Action == Enums.FeatureAction.Deactivate)
                {
                    // retrieve locations where to deactivate
                    targetLocations = repository.GetLocationsCanDeactivate(message.FeatureDefinition, message.Location);
                }
                else
                {
                    throw new NotImplementedException("Received feature toggle requests in feature task actor only support activation and deactivation!");
                }

                requestsToBeConfirmed = new List <FeatureToggleRequest>();

                foreach (Location l in targetLocations)
                {
                    var toggleRequestForThisLocation = new FeatureToggleRequest(
                        message.FeatureDefinition
                        , l
                        , message.Action
                        , message.Force
                        , message.ElevatedPrivileges
                        );
                    requestsToBeConfirmed.Add(toggleRequestForThisLocation);
                }

                var action = message.Action.ToString().ToLower();

                var locationPrefix = message.FeatureDefinition.Scope < message.Location.Scope ? "across" : "at";

                var confirmRequest = new ConfirmationRequest(
                    Title,
                    string.Format("Please confirm to {0} feature \n\n{1} \n\n{4} location \n\n{2}\n\n\nFeatureAdmin found '{3}' location(s) where to {0}.",
                                  action,
                                  message.FeatureDefinition.ToString(),
                                  message.Location.ToString(),
                                  targetLocations.Count(),
                                  locationPrefix),
                    Id
                    );


                eventAggregator.PublishOnUIThread(confirmRequest);
            }
        }
        private void HandleDeactivateFeaturesRequest(DeactivateFeaturesRequest message)
        {
            _log.Debug("Entered HandleDeactivateFeaturesRequest with Id " + Id.ToString());

            if (!TaskCanceled)
            {
                if (isSubTaskActor)
                {
                    ParentTaskActor = Sender;
                }

                Title = message.Title;

                requestsToBeConfirmed = new List <FeatureToggleRequest>();

                foreach (ActivatedFeatureSpecial af in message.Features)
                {
                    FeatureDefinition definition;

                    if (af.Definition == null)
                    {
                        definition = Factories.FeatureDefinitionFactory.GetFaultyDefinition(
                            af.ActivatedFeature.FeatureId,
                            af.Location.Scope,
                            af.ActivatedFeature.Version);
                    }
                    else
                    {
                        definition = af.Definition;
                    }



                    var toggleRequest = new FeatureToggleRequest(
                        definition,
                        af.Location,
                        // force is already set to true, so now it is same as deactivation ...
                        // message.Action,
                        Enums.FeatureAction.Deactivate,
                        message.Force,
                        message.ElevatedPrivileges
                        );
                    requestsToBeConfirmed.Add(toggleRequest);
                }

                if (isSubTaskActor)
                {
                    var skipConfirmation = new Confirmation(
                        Id
                        );

                    HandleConfirmation(skipConfirmation);
                }
                else
                {
                    var confirmRequest = new ConfirmationRequest(
                        string.Format(
                            "Please confirm Feature {0}",
                            message.Action.ToString().ToLower()
                            ),
                        Title,
                        message.TaskId,
                        true
                        );


                    eventAggregator.PublishOnUIThread(confirmRequest);
                }
            }
        }
        private void HandleUpgrade(FeatureToggleRequest message)
        {
            string errorMsg = null;

            ActivatedFeature af;

            switch (message.Location.Scope)
            {
            case Core.Models.Enums.Scope.Web:
                errorMsg += dataService.WebFeatureAction(
                    message.FeatureDefinition,
                    message.Location,
                    Core.Models.Enums.FeatureAction.Upgrade,
                    message.ElevatedPrivileges.Value,
                    message.Force.Value,
                    out af);
                break;

            case Core.Models.Enums.Scope.Site:
                errorMsg += dataService.SiteFeatureAction(
                    message.FeatureDefinition,
                    message.Location,
                    Core.Models.Enums.FeatureAction.Upgrade,
                    message.ElevatedPrivileges.Value,
                    message.Force.Value,
                    out af);
                break;

            case Core.Models.Enums.Scope.WebApplication:
                errorMsg += dataService.WebAppFeatureAction(
                    message.FeatureDefinition,
                    message.Location,
                    Core.Models.Enums.FeatureAction.Upgrade,
                    message.Force.Value,
                    out af);
                break;

            case Core.Models.Enums.Scope.Farm:
                errorMsg += dataService.FarmFeatureAction(
                    message.FeatureDefinition,
                    message.Location,
                    Core.Models.Enums.FeatureAction.Upgrade,
                    message.Force.Value,
                    out af);
                break;

            case Core.Models.Enums.Scope.ScopeInvalid:
                errorMsg += string.Format("Location '{0}' has invalid scope - not supported for feature upgrade.", message.Location.Id);
                af        = null;
                break;

            default:
                errorMsg += string.Format("Location '{0}' has unidentified scope - not supported for feature upgrade.", message.Location.Id);
                af        = null;
                break;
            }


            if (string.IsNullOrEmpty(errorMsg))
            {
                var completed = new Core.Messages.Completed.FeatureUpgradeCompleted(
                    message.TaskId,
                    message.Location.UniqueId,
                    af
                    );

                Sender.Tell(completed);
            }
            else
            {
                var cancelationMsg = new CancelMessage(
                    message.TaskId,
                    errorMsg,
                    true
                    );

                Sender.Tell(cancelationMsg);
            }
        }
        public void Handle(FeatureToggleRequest message)
        {
            var requestWithCorrectSettings = message.GetWithUpdatedSettings(force, elevatedPrivileges);

            SetupNewFeatureTaskActor(requestWithCorrectSettings);
        }