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); }