static void NotifyFailedReplicas( string triggerType, List <Replica> failedReplicas, ErrorEmailSender emailSender) { if (failedReplicas.Count == 0) { return; } string subject = string.Format( "[syncservertrigger] {0} replication failed", triggerType); StringBuilder body = new StringBuilder(); body.AppendLine("The following replicas failed:"); foreach (Replica failedReplica in failedReplicas) { body.AppendLine( string.Format( "Source: br:{0}@rep:{1}@{2} --> Destination: rep:{3}@{4}", failedReplica.SrcBranch, failedReplica.SrcRepo, failedReplica.SrcServer, failedReplica.DstRepo, failedReplica.DstServer)); } string message = body.ToString(); Logger.LogError(message); emailSender.SendErrorEmail(subject, message); }
static void RunAfterMakeLabel( List <string> filteredRepos, List <string> dstServers, List <RepoMapping> mappings, string labelName, string repoName, string serverName, ErrorEmailSender emailSender) { Logger.LogInfo("Running as after-makelabel trigger..."); Branch branchToReplicate = null; if (!FindBranchForLabel( labelName, repoName, serverName, out branchToReplicate)) { return; } List <Replica> pendingReplicas = Replica.BuildPendingReplicas( branchToReplicate.BranchName, branchToReplicate.RepositoryName, branchToReplicate.ServerName, filteredRepos, dstServers, mappings); Logger.LogInfo( $"Found {pendingReplicas.Count} destinations to replicate to."); List <Replica> failedReplicas = new List <Replica>(); foreach (Replica pendingReplica in pendingReplicas) { if (!Replicate(pendingReplica)) { failedReplicas.Add(pendingReplica); } } NotifyFailedReplicas( "after-makelabel", failedReplicas, emailSender); }
static void RunAfterCheckin( List <string> filteredRepos, List <string> dstServers, List <RepoMapping> mappings, string csetSpecs, ErrorEmailSender emailSender) { Logger.LogInfo("Running as after-checkin trigger..."); List <Changeset> csets = Changeset.ParsePlasticChangesetEnvironVar(csetSpecs); List <Replica> pendingReplicas = new List <Replica>(); foreach (Changeset cset in csets) { pendingReplicas.AddRange( Replica.BuildPendingReplicas( cset.BranchName, cset.RepositoryName, cset.ServerName, filteredRepos, dstServers, mappings)); } Logger.LogInfo( $"Found {pendingReplicas.Count} destinations to replicate to."); List <Replica> failedReplicas = new List <Replica>(); foreach (Replica pendingReplica in pendingReplicas) { if (!Replicate(pendingReplica)) { failedReplicas.Add(pendingReplica); } } NotifyFailedReplicas( "after-checkin", failedReplicas, emailSender); }
static void RunAfterReplicationWrite( List <string> filteredRepos, List <string> dstServers, List <RepoMapping> mappings, string branchSpec, ErrorEmailSender emailSender) { Logger.LogInfo("Running as after-replicationwrite trigger..."); Branch branchToReplicate = Branch.ParsePlasticBranchEnvironVar(branchSpec); List <Replica> pendingReplicas = Replica.BuildPendingReplicas( branchToReplicate.BranchName, branchToReplicate.RepositoryName, branchToReplicate.ServerName, filteredRepos, dstServers, mappings); Logger.LogInfo( $"Found {pendingReplicas.Count} destinations to replicate to."); List <Replica> failedReplicas = new List <Replica>(); foreach (Replica pendingReplica in pendingReplicas) { if (!Replicate(pendingReplica)) { failedReplicas.Add(pendingReplica); } } NotifyFailedReplicas( "after-replicationwrite", failedReplicas, emailSender); }
static void RunAfterChangeAttributeValue( List <string> filteredRepos, List <string> dstServers, List <RepoMapping> mappings, string triggerStdIn, string repoName, string serverName, ErrorEmailSender emailSender) { Logger.LogInfo("Running as after-chattvalue trigger..."); string objectSpec = triggerStdIn.Substring( startIndex: 0, length: triggerStdIn.IndexOf("attribute:")).Trim(); string objectName = objectSpec.Substring( objectSpec.IndexOf(':') + 1); Branch branchToReplicate = null; if (objectSpec.StartsWith("br:")) { branchToReplicate = new Branch( objectName, repoName, serverName); } if (objectSpec.StartsWith("lb:")) { if (!FindBranchForLabel( objectName, repoName, serverName, out branchToReplicate)) { return; } } if (objectSpec.StartsWith("cs:")) { if (!FindBranchForChangeset( objectName, repoName, serverName, out branchToReplicate)) { return; } } List <Replica> pendingReplicas = Replica.BuildPendingReplicas( branchToReplicate.BranchName, branchToReplicate.RepositoryName, branchToReplicate.ServerName, filteredRepos, dstServers, mappings); Logger.LogInfo( $"Found {pendingReplicas.Count} destinations to replicate to."); List <Replica> failedReplicas = new List <Replica>(); foreach (Replica pendingReplica in pendingReplicas) { if (!Replicate(pendingReplica)) { failedReplicas.Add(pendingReplica); } } NotifyFailedReplicas( "after-chattvalue", failedReplicas, emailSender); }
void ICmd.Execute(string[] args) { if (args.Length == 1 || args.Length > 5) { Logger.LogError( $"RunCmd executed with wrong parameters: {string.Join(", ", args)}"); Environment.Exit(1); } Logger.LogInfo("Started running..."); ToolConfiguration toolConfig = ToolConfiguration.Load(); List <string> filteredRepos = toolConfig.RepoFilterConfig.GetFilteredRepos(); List <string> dstServers = toolConfig.ServerConfig.GetServers(); List <RepoMapping> repoMappings = toolConfig.RepoMapConfig.GetMappedRepos(); ErrorEmailSender emailSender = new ErrorEmailSender(toolConfig.EmailConfig); if (args.Length == 3 && args[1] == Trigger.Types.AfterCi) { RunAfterCheckin( filteredRepos, dstServers, repoMappings, args[2], emailSender); } if (args.Length == 3 && args[1] == Trigger.Types.AfterRW) { RunAfterReplicationWrite( filteredRepos, dstServers, repoMappings, args[2], emailSender); } if (args.Length == 5 && args[1] == Trigger.Types.AfterMkLb) { RunAfterMakeLabel( filteredRepos, dstServers, repoMappings, args[2], args[3], args[4], emailSender); } if (args.Length == 5 && args[1] == Trigger.Types.AfterChAttVal) { RunAfterChangeAttributeValue( filteredRepos, dstServers, repoMappings, args[2], args[3], args[4], emailSender); } }