Exemple #1
0
        public override async Task ExecuteAsync(Guid activityId)
        {
            RepairActionTypeEnum?action = repairActionProvider.GetRepairAction(repairTask.Action);

            if (action == null)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown action {1}", repairTask.TaskId, repairTask.Action);
                return;
            }

            // Ignore requests for anything other than a single node
            IList <string> targetNodeNames = repairTask.GetTargetNodeNames();

            if (targetNodeNames == null || targetNodeNames.Count != 1)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring bad target description {1}", repairTask.TaskId, repairTask.Target);
                return;
            }

            // Map Service Fabric node name to Azure role instance Id
            string targetRoleInstance = targetNodeNames[0].TranslateNodeNameToRoleInstance();

            // TODO cancel task if its action/target is bad

            await policyAgentClient.RequestRepairAsync(
                activityId,
                new RepairRequest
            {
                Action         = action.Value,
                ContextId      = repairTask.GetTenantJobContext(),
                RoleInstanceId = targetRoleInstance,
            },
                CancellationToken.None).ConfigureAwait(false);
        }
        public override async Task ExecuteAsync(Guid activityId)
        {
            if (repairTask.State != RepairTaskState.Created)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: not claiming it since its state isn't {1}", repairTask.TaskId, RepairTaskState.Created);
                return;
            }

            // Is this an action that this executor can process?
            RepairActionTypeEnum?action = repairActionProvider.GetRepairAction(repairTask.Action);

            if (action == null)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown action {1}", repairTask.TaskId, repairTask.Action);
                return;
            }

            if (repairTask.Scope.Kind != RepairScopeIdentifierKind.Cluster)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown scope {1}", repairTask.TaskId, repairTask.Scope);
                return;
            }

            // Ignore requests for anything other than a single node
            IList <string> targetNodeNames = repairTask.GetTargetNodeNames();

            if (targetNodeNames == null || targetNodeNames.Count != 1)
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring bad target description {1}", repairTask.TaskId, repairTask.Target);
                return;
            }

            // Map Service Fabric node name to Azure role instance Id
            string targetRoleInstance = targetNodeNames[0].TranslateNodeNameToRoleInstance();

            // Is the target a valid role instance in this tenant?
            if (!roleInstanceNames.Contains(targetRoleInstance, StringComparer.OrdinalIgnoreCase))
            {
                this.Environment.DefaultTraceType.WriteInfo("Repair task {0}: ignoring unknown role instance {1}", repairTask.TaskId, targetRoleInstance);
                return;
            }

            // All checks passed; this executor can claim and execute this repair task
            repairTask.Executor = this.Environment.ServiceName;

            // Zero impact, because approval for actual execution will go through the
            // existing infrastructure task mechanism (MR job queue)
            repairTask.State = RepairTaskState.Claimed;

            await repairManager.UpdateRepairExecutionStateAsync(activityId, repairTask).ConfigureAwait(false);
        }
        public static IEnumerable <string> GetTargetRoleInstances(this IRepairTask repairTask)
        {
            var nodeNames = repairTask.GetTargetNodeNames();

            if (nodeNames == null)
            {
                return(null);
            }

            return(nodeNames.Select(e => e.TranslateNodeNameToRoleInstance()));
        }
        // Does repairTask represent a VendorRepair, via action/target match?
        public static bool MatchesVendorRepairJobByActionAndTarget(this IRepairTask repairTask, RepairActionProvider repairActionProvider, IConfigSection configSection, ITenantJob tenantJob)
        {
            repairTask.Validate("repairTask");
            tenantJob.Validate("tenantJob");

            // 1. check action
            RepairActionTypeEnum?actionFromRepairTask = repairActionProvider.GetRepairAction(repairTask.Action);

            if (!actionFromRepairTask.HasValue || RepairActionTypeEnum.Heal != actionFromRepairTask.Value)
            {
                return(false);
            }

            // 2. check targets (nodes)
            // TODO should this be RoleInstancesToBeImpacted or JobStep.CurrentlyImpactedRoleInstances?
            if (tenantJob.RoleInstancesToBeImpacted == null || tenantJob.RoleInstancesToBeImpacted.Count != 1)
            {
                Constants.TraceType.WriteInfo(
                    "Task '{0}' does not match VendorRepair job {1} since RoleInstancesToBeImpacted does not have exactly one instance: {2}",
                    repairTask.TaskId,
                    tenantJob.Id,
                    tenantJob.ToJson());
                return(false);
            }

            var nodeNames = repairTask.GetTargetNodeNames();

            if (nodeNames == null || nodeNames.Count != 1)
            {
                Constants.TraceType.WriteInfo(
                    "Task '{0}' does not match VendorRepair job {1} since task target does not have exactly one node: {2}",
                    repairTask.TaskId,
                    tenantJob.Id,
                    nodeNames.ToJson());
                return(false);
            }

            var repairTaskTargetRoleInstance = nodeNames[0].TranslateNodeNameToRoleInstance();
            var jobRoleInstance = tenantJob.RoleInstancesToBeImpacted[0];

            bool targetsMatch = string.Equals(repairTaskTargetRoleInstance, jobRoleInstance, StringComparison.OrdinalIgnoreCase);

            return(targetsMatch);
        }