Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
            }
        }