public VMListForm(MessageSendRecieve msr)
 {
     vms      = new Dictionary <string, bool>();
     this.msr = msr;
     InitializeComponent();
     RefreshUI();
 }
Ejemplo n.º 2
0
        public static void PingServs(FormClient formClient)
        {
            Program.msgsWithHosts_Semaphore.WaitOne();
            List <MessageSendRecieve> msgsWithHosts = new List <MessageSendRecieve>();

            foreach (var host in Program.msgsWithHosts)
            {
                msgsWithHosts.Add(host);
            }
            Program.msgsWithHosts_Semaphore.Release();

            for (int i = 0; i < msgsWithHosts.Count; i++)
            {
                MessageSendRecieve host = msgsWithHosts[i];
                try
                {
                    IPAddress  ipAddr     = IPAddress.Parse(host.IP);
                    IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, portPingServers);
                    Socket     sender     = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    sender.Connect(ipEndPoint);
                    Byte[] buf = new Byte[1];
                    sender.Send(buf);
                    sender.Receive(buf);
                    formClient.AppendOnOffImg(host.mqName, true);
                }
                catch (Exception)
                {
                    formClient.AppendOnOffImg(host.mqName, false);
                }
            }
        }
Ejemplo n.º 3
0
        private void WaitForVMList(object arg)
        {
            object[] args = (object[])arg;
            MessageSendRecieve msr = (MessageSendRecieve)args[0];
            string msgID = (string)args[1];

            VMRequestReturn vmList = msr.WaitForVMList(msgID, TimeSpan.FromMinutes(5));

            if (vmList != null)
            {
                Dictionary<string, bool> vmMap = new Dictionary<string, bool>();
                foreach (string vm in vmList.VMPaths)
                {
                    vmMap[vm] = false;
                }
                foreach (string lockedVM in vmList.LockedVMs)
                {
                    vmMap[lockedVM] = true;
                }
                Invoke(new MethodInvoker(delegate() { ShowVMList(vmMap); }));
            }
            else
            {
                Invoke(new MethodInvoker(delegate() { ShowVMList("error while getting list of vms"); }));
            }
        }
        public static void SocketSend(MessageSendRecieve msg, string ip)
        {
            IPAddress  ipAddr     = IPAddress.Parse(ip);
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, portDispatcherServer);
            Socket     sender     = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                sender.Connect(ipEndPoint);

                SendMsg <MessageSendRecieve>(sender, msg);


                Byte[] buf = BinFormatter.ToBytes(false);
                sender.Receive(buf);
                if (BinFormatter.FromBytes <bool>(buf))
                {
                    Console.WriteLine("Server connected");
                }
                else
                {
                    Console.WriteLine("Server denied");
                }

                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        public void TestNullDirPathInJob()
        {
            sut.EmulateServiceStart(null);
            List <ExecutablePackage> packages = new List <ExecutablePackage>();
            ExecutablePackage        package  = new ExecutablePackage("mock.xml", null, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary <string, string>(), new SerializableDictionary <string, string>());

            packages.Add(package);
            Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary <string, string>(), packages, new SerializableDictionary <string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime           queuedJobsDateTime = DateTime.Now;
            string             job1msgID          = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Exception: Value cannot be null.\nParameter name: path");

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);
        }
        public void TestNullISOs()
        {
            sut.EmulateServiceStart(null);
            DirectoryInfo tempDir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempdll"));

            tempDir.Create();
            try
            {
                List <ExecutablePackage> packages = new List <ExecutablePackage>();
                ExecutablePackage        package  = new ExecutablePackage("mock.xml", tempDir.FullName, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary <string, string>(), new SerializableDictionary <string, string>());
                packages.Add(package);

                Job j1 = new Job(null, "MockVMConfig1", null, packages, new SerializableDictionary <string, string>());
                MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
                DateTime           queuedJobsDateTime = DateTime.Now;
                string             job1msgID          = msr.QueueJob(j1);

                //wait for job 1 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName1"], VMActionType.Start, queuedJobsDateTime, TimeSpan.FromSeconds(5)));

                //send request for job 1
                AutomationMessage m = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName1";
                Job j = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                Assert.That(j.JobID, Is.EqualTo(j1.JobID));

                //send finished for job 1
                DateTime  finishedSentDateTime = DateTime.Now;
                JobResult jr = new JobResult();
                jr.Completed = true;
                ExecutionResult er = new ExecutionResult();
                er.Success = true;
                jr.ExecutionResults.Add(er);
                msr.ReportJobStatus(new JobCompleted(j1, jr));

                //wait for job completion
                JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

                sut.EmulateServiceStop();

                VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
                VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

                Assert.That(jobCompleted, Is.Not.Null);
                Assert.That(jobCompleted.Job, Is.Not.Null);
                Assert.That(jobCompleted.Result, Is.Not.Null);
                Assert.That(jobCompleted.Result.Errors, Is.Empty);
                Assert.That(jobCompleted.Result.Success, Is.True);
                Assert.That(jobCompleted.Result.Completed, Is.True);
            }
            finally
            {
                tempDir.Delete(true);
            }
        }
        public void RunDependentJob()
        {
            sut.EmulateServiceStart(null);
            DirectoryInfo tempDir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempdll"));

            tempDir.Create();
            try
            {
                List <ExecutablePackage> packages = new List <ExecutablePackage>();
                ExecutablePackage        package  = new ExecutablePackage("mock.xml", tempDir.FullName, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary <string, string>(), new SerializableDictionary <string, string>());
                packages.Add(package);
                Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary <string, string>(), packages, new SerializableDictionary <string, string>());
                Job j2 = new Job("nobuildpath", "MockVMConfig2", new SerializableDictionary <string, string>(), packages, new SerializableDictionary <string, string>());
                j2.DependsOnJobIds.Add(j1.JobID);
                MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
                DateTime           queuedJobsDateTime = DateTime.Now;
                string             job2msgID          = msr.QueueJob(j2);
                string             job1msgID          = msr.QueueJob(j1);
                //wait for job 1 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName1"], VMActionType.Start, queuedJobsDateTime, TimeSpan.FromSeconds(10)));
                //send request for job 1
                AutomationMessage m = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName1";
                Job j = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                //send finished for job 1
                DateTime finishedSentDateTime = DateTime.Now;
                msr.ReportJobStatus(new JobCompleted(j1, new JobResult()));
                //wait for job 2 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName2"], VMActionType.Start, finishedSentDateTime, TimeSpan.FromSeconds(10)));
                //send request for job 2
                m      = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName2";
                j      = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                //send finished for job2
                msr.ReportJobStatus(new JobCompleted(j2, new JobResult()));

                Assert.That(msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT), Is.Not.Null);
                Assert.That(msr.WaitForJobCompletion(job2msgID, DEFAULT_WAIT), Is.Not.Null);

                sut.EmulateServiceStop();

                VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
                VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

                VerifyMockVMActionInvoked(vmHash["MockVMName1"], VMActionType.RevertToNamedSnapshot, "Snapshot1");
                VerifyMockVMActionInvoked(vmHash["MockVMName2"], VMActionType.RevertToNamedSnapshot, "Snapshot2");
            }
            finally
            {
                tempDir.Delete(true);
            }
        }
Ejemplo n.º 8
0
        private ListViewItem addServInLvServs(MessageSendRecieve serv, bool subscribed)
        {
            ListViewItem item = new ListViewItem(new string[] { "     " + serv.mqName });

            item.Tag             = serv.mqName;
            item.SubItems[0].Tag = subscribed;
            item.StateImageIndex = 0;
            item.ImageIndex      = (subscribed) ? 0 : 1;
            lvServs.Items.Add(item);
            return(item);
        }
Ejemplo n.º 9
0
 public void Subscribe(MessageSendRecieve sub)
 {
     try
     {
         RMQS.Add(new RabbitMQClient(sub));
         RMQS[RMQS.Count - 1].consumer.Received += sender;
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message + " in " + ex.TargetSite);
     }
 }
Ejemplo n.º 10
0
        public static async Task SocketRecieve(CancellationToken ct)
        {
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            sender.Bind(new IPEndPoint(IPAddress.Any, portDispatcherServer));
            sender.Listen(10);
            while (!ct.IsCancellationRequested)
            {
                MessageSendRecieve msg = new MessageSendRecieve();
                try
                {
                    Socket receiver = sender.Accept();
                    msg    = RecieveMsg <MessageSendRecieve>(receiver);
                    msg.IP = (receiver.RemoteEndPoint as IPEndPoint).Address.ToString();


                    Program.msgsWithHosts_Semaphore.WaitOne();
                    bool nameRepeats = false;
                    for (int i = 0; i < Program.msgsWithHosts.Count && !nameRepeats; i++)
                    {
                        nameRepeats = Program.msgsWithHosts[i].mqName == msg.mqName;
                    }
                    Program.msgsWithHosts_Semaphore.Release();

                    if (!nameRepeats)
                    {
                        receiver.Send(BinFormatter.ToBytes <bool>(true));
                    }
                    else
                    {
                        Console.WriteLine($"Server {msg.mqIP} denied");
                        receiver.Send(BinFormatter.ToBytes <bool>(false));
                        receiver.Shutdown(SocketShutdown.Both);
                        receiver.Close();
                        break;
                    }

                    receiver.Shutdown(SocketShutdown.Both);
                    receiver.Close();

                    Program.msgsWithHosts_Semaphore.WaitOne();
                    Program.msgsWithHosts.Add(msg);
                    Console.WriteLine("New server connected");
                    Program.msgsWithHosts_Semaphore.Release();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
        static void Main(string[] args)
        {
            var pingReply_cts = new CancellationToken();

            Task.Run(() => SocketServer.pingReply(pingReply_cts));

            MessageSendRecieve msg = new MessageSendRecieve(null, rabbitMqIp, rabbitMqName, username, password);
            //try
            {
                using (mq = new RabbitMQServer(msg.mqIP, msg.mqName, msg.login, msg.password))
                    using (INewsReader reader = new WebhoseReader())
                    {
                        SocketServer.SocketSend(msg, dispatcherIp);
                        mq.MessageSend      += Pr;
                        reader.NewsReceived += NewNewsReceived;
                        reader.Start();
                        Console.WriteLine("Write \"Exit\" to finish");
                        string input = Console.ReadLine();
                        while (input.ToUpper() != "EXIT")
                        {
                            if (input.ToUpper() == "GET")
                            {
                                reader.GetNews();
                            }
                            if (input.ToUpper() == "GETALL")
                            {
                                reader.GetAllNews();
                            }
                            if (input.ToUpper() == "GETSOME")
                            {
                                reader.GetSomeNews();
                            }
                            if (input.ToUpper() == "REG")
                            {
                                SocketServer.SocketSend(msg, dispatcherIp);
                            }
                            input = Console.ReadLine();
                        }
                    }
            }

            /*catch(Exception ex)
             * {
             *  Console.WriteLine(ex.Message + " in " + ex.TargetSite);
             *  Console.ReadKey();
             * }*/
        }
Ejemplo n.º 12
0
        private void InitializeOurMQ()
        {
            string mqIp   = ConfigManager.Get("rabbitMqIp");
            string mqName = ConfigManager.Get("rabbitMqName");
            string mqLog  = ConfigManager.Get("rabbitMqNLogin");
            string mqPass = ConfigManager.Get("rabbitMqPassword");

            try
            {
                MessageSendRecieve ourMqMessage = new MessageSendRecieve(null, mqIp, mqName, mqLog, mqPass);
                ourMQ = new RabbitMQClient(ourMqMessage);
                ourMQ.consumer.Received += sender;
            }
            catch (Exception ex)
            {
                MessageBox.Show("rabbitMq doesn't answer");
            }
        }
Ejemplo n.º 13
0
        private void WaitForResponses(object arg)
        {
            object[] args = (object[])arg;
            MessageSendRecieve msr = (MessageSendRecieve)args[0];
            string msgID = (string)args[1];

            JobReportReturn jr = msr.WaitForStatus(msgID, TimeSpan.FromMinutes(1));

            if (jr != null)
            {
                Invoke(new MethodInvoker(delegate() { listViewStatus.BeginUpdate(); }));
                foreach (Job j in jr.Jobs.Keys)
                {
                    JobStatus js = jr.Jobs[j];
                    FullJob fj = new FullJob(j, js);
                    Invoke(new MethodInvoker(delegate()
                    {
                        ListViewItem lvi = listViewStatus.Items.Add(new ListViewItem(j.StartDate.ToString("yyyy/MM/dd HH:mm:ss")));
                        lvi.SubItems.Add(j.Configuration.ToString());
                        lvi.SubItems.Add(js.State.ToString());
                        if (js.Result != null)
                        {
                            lvi.SubItems.Add(js.Result.Success ? "Yes" : "No");
                        }
                        else
                        {
                            lvi.SubItems.Add("N/A");
                        }
                        lvi.SubItems.Add(j.JobXML);
                        if (js.Result != null && js.Result.Errors != null && js.Result.Errors.Count > 0)
                        {
                            lvi.SubItems.Add(js.Result.Errors[0]);
                        }
                        else
                        {
                            lvi.SubItems.Add(String.Empty);
                        }
                        lvi.Tag = fj;
                    }));
                }
                Invoke(new MethodInvoker(delegate() { listViewStatus.EndUpdate(); }));
            }
            Invoke(new MethodInvoker(delegate() { button1.Enabled = true; }));
        }
Ejemplo n.º 14
0
 public void Unsubscribe(MessageSendRecieve Unsub)
 {
     try
     {
         for (int i = RMQS.Count - 1; i >= 0; i--)
         {
             var mq = RMQS[i];
             if (mq.serv.mqName == Unsub.mqName)
             {
                 RMQS.Remove(mq);
                 mq.Dispose();
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message + " in " + ex.TargetSite);
     }
 }
        public static async Task ServersListSend(CancellationToken ct)
        {
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            sender.Bind(new IPEndPoint(IPAddress.Any, portDispatcherClient));
            sender.Listen(10);
            while (!ct.IsCancellationRequested)
            {
                try
                {
                    Socket handler = sender.Accept();
                    Program.msgsWithHosts_Semaphore.WaitOne();
                    int serversCount             = Program.msgsWithHosts.Count;
                    MessageSendRecieve[] servers = new MessageSendRecieve[serversCount];
                    if (serversCount != 0)
                    {
                        int i = 0;
                        foreach (var elem in Program.msgsWithHosts)
                        {
                            MessageSendRecieve msg = elem;
                            servers[i] = msg;
                            i++;
                        }
                        SendMsg <MessageSendRecieve[]>(handler, servers);
                        Console.WriteLine("Server list send");
                    }
                    else
                    {
                        byte[] byteSet = BinFormatter.ToBytes <int>(0);
                        handler.Send(byteSet);
                    }
                    Program.msgsWithHosts_Semaphore.Release();

                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
        public RabbitMQClient(MessageSendRecieve serv, string queueName = "")
        {
            this.serv = serv;
            factory   = new ConnectionFactory()
            {
                UserName    = serv.login,
                Password    = serv.password,
                VirtualHost = "/",
                HostName    = serv.mqIP,
                Port        = 5672
            };

            connection = factory.CreateConnection();
            channel    = connection.CreateModel();
            channel.ExchangeDeclare(exchange: serv.mqName, type: "fanout");
            this.queueName = (queueName == "")?channel.QueueDeclare(durable: true, exclusive: false, autoDelete: false).QueueName:queueName;
            channel.QueueBind(queue: this.queueName, exchange: serv.mqName, routingKey: "");
            consumer = new EventingBasicConsumer(channel);
            channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
        }
Ejemplo n.º 17
0
        public static MessageSendRecieve[] RecieveServersList()
        {
            MessageSendRecieve[] servers    = null;
            IPAddress            ipAddr     = IPAddress.Parse(dispatcherIp);
            IPEndPoint           ipEndPoint = new IPEndPoint(ipAddr, portDispatcherClient);
            Socket receiver = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            receiver.Connect(ipEndPoint);

            try
            {
                servers = ReceiveMsg <MessageSendRecieve[]>(receiver);
            }
            catch (FormatException)
            {
                servers = new MessageSendRecieve[0];
            }
            receiver.Shutdown(SocketShutdown.Both);
            receiver.Close();
            return(servers);
        }
        public void TestNullConfiguration()
        {
            sut.EmulateServiceStart(null);
            Job j1 = new Job("abc", null, new SerializableDictionary <string, string>(), new List <ExecutablePackage>(), new SerializableDictionary <string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime           queuedJobsDateTime = DateTime.Now;
            string             job1msgID          = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Configuration cannot be null or empty");
        }
        public void TestNullPackageList()
        {
            sut.EmulateServiceStart(null);
            Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary <string, string>(), null, new SerializableDictionary <string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime           queuedJobsDateTime = DateTime.Now;
            string             job1msgID          = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Job does not have any packages defined");
        }
Ejemplo n.º 20
0
        public void Run()
        {
            try
            {
                FileInfo mapNetBatchFile = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "map.bat"));
                //if the network drive is disconected, then we will be unable to get to the server inbox, in which case we should try to remap
                if (!AppConfig.ServerInbox.Exists && mapNetBatchFile.Exists)
                {
                    using (System.Diagnostics.Process p = new System.Diagnostics.Process())
                    {
                        p.StartInfo.WorkingDirectory = mapNetBatchFile.Directory.FullName;
                        p.StartInfo.FileName         = mapNetBatchFile.Name;
                        p.StartInfo.CreateNoWindow   = true;
                        p.StartInfo.UseShellExecute  = true;
                        p.Start();
                        p.WaitForExit();
                    }
                }
                int       packageToRun = 0;
                JobResult result       = new JobResult();
                result.Completed = true;

                //string sendQueueName = @"FormatName:DIRECT=OS:hammerbuildvm\Private$\jobmanager";
                //string sendQueueName = @"FormatName:DIRECT=OS:ryanadams2\Private$\test2";
                //jci.LogString("Connecting to Job Manager receive queue (" + sendQueueName + ")");
                MessageSendRecieve msr = new MessageSendRecieve(AppConfig.ServerInbox, AppConfig.ServerOutbox);
                //jci.LogString("Permission = " + msr.RemoteMessageQueue.AccessMode.ToString());

                //look for an existing job to run/continue before getting a new job from the server
                FileInfo jobXML = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "job.xml"));
                if (jobXML.Exists)
                {
                    using (TextReader tr = new StreamReader(jobXML.FullName))
                    {
                        j = XMLSerializable.FromXML <Job>(tr.ReadToEnd());
                        if (j.Properties.ContainsKey("PackageToRun"))
                        {
                            packageToRun = Int32.Parse(j.Properties["PackageToRun"]);
                        }
                    }
                    try
                    {
                        //rename the job file so the next run doesn't automatically use it.  The job.xml file will be put back
                        //as part of jci.StartupOnNextRun if it is meant to be continued after a restart
                        string lastFile = jobXML.FullName + ".old";
                        if (File.Exists(lastFile))
                        {
                            File.Delete(lastFile);
                        }
                        File.Move(jobXML.FullName, lastFile);
                    }
                    catch (Exception ex)
                    {
                        //if the delete fails lets log it, but it isn't critical so let's eat the exception
                        LogString("Could not delete existing job.xml file: " + ex.ToString());
                    }
                    //look for an existing JobResult to pull in
                    FileInfo jobResultXML = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"));
                    if (jobResultXML.Exists)
                    {
                        try
                        {
                            using (TextReader tr = new StreamReader(jobResultXML.FullName))
                            {
                                result = XMLSerializable.FromXML <JobResult>(tr.ReadToEnd());
                            }
                        }
                        catch (Exception ex)
                        {
                            //log, but eat it
                            LogString(ex.ToString());
                        }
                    }
                }
                else
                {
                    LogString("Requesting Jobs from Job Manager");
                    string messageID = msr.RequestJob();
                    LogString("Sent request with message id: " + messageID);

                    LogString("Waiting for Job response from Job Manager");
                    j = msr.WaitForJob(messageID, DEFAULT_JOB_WAIT);
                    if (j == null)
                    {
                        LogString("No Jobs Available");
                        return;
                    }
                    try
                    {
                        LogString("Found Job: " + j.JobID);

                        if (baseDir.Exists)
                        {
                            baseDir.Delete(true);
                            //TODO wait for files to be deleted?
                        }
                        baseDir.Create();

                        List <string> keys = new List <string>(j.ISOs.Keys);
                        foreach (string isoName in keys)
                        {
                            FileInfo isoPath  = new FileInfo(j.ISOs[isoName]);
                            string   destPath = Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, isoPath.Name);
                            LogString("Copying ISO from \"" + isoPath.Directory.FullName + "\" to \"" + destPath + "\"");
                            isoPath.CopyTo(destPath);
                            j.ISOs[isoName] = destPath;
                        }

                        if (j.Properties == null)
                        {
                            j.Properties = new SerializableDictionary <string, string>();
                        }
                    }
                    catch (Exception ex)
                    {
                        LogString(ex.ToString());
                        result.Completed = false;
                        ExecutionResult er = new ExecutionResult(ex.ToString(), null);
                        result.ExecutionResults.Add(er);
                        Logger.Instance.Pause();
                        result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                        Logger.Instance.Resume();
                        LogString("Sending Job Result");
                        msr.ReportJobStatus(new JobCompleted(j, result));
                        LogString("Job Result Sent");
                        return;
                    }
                }
                if (j.Packages.Count == 0)
                {
                    Logger.Instance.Pause();
                    result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                    Logger.Instance.Resume();
                }
                while (packageToRun < j.Packages.Count)
                {
                    runningPackageDir = new DirectoryInfo(Path.Combine(baseDir.FullName, packageToRun.ToString()));

                    ExecutablePackage ep = j.Packages[packageToRun];
                    runningPackage = ep;
                    ExecutionResult er = new ExecutionResult();
                    try
                    {
                        if (!ep.ContentDirectory.ToLower().Equals(runningPackageDir.FullName.ToLower()))
                        {
                            if (runningPackageDir.Exists)
                            {
                                runningPackageDir.Delete(true);
                            }
                            runningPackageDir.Create();

                            LogString("Copying data from \"" + ep.ContentDirectory + "\" to \"" + runningPackageDir.FullName + "\"");
                            DirectoryData.FromDirectory(new DirectoryInfo(ep.ContentDirectory)).DumpContentsToDir(runningPackageDir);
                            ep.ContentDirectory = runningPackageDir.FullName;
                        }
                        LogString("Loading external test DLL: " + ep.JobRunnerDLLName + " , " + ep.JobRunnerClassName);
                        JobRunner jr = LoadJobRunner(ep.JobRunnerClassName, Path.Combine(runningPackageDir.FullName, ep.JobRunnerDLLName));

                        LogString("Executing Execute() method on external DLL");

                        er = jr.Execute(this);
                    }
                    catch (Exception ex)
                    {
                        LogString(ex.ToString());
                        result.Completed = false;
                        er = new ExecutionResult(ex.ToString(), null);
                    }

                    Logger.Instance.Pause();
                    result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                    Logger.Instance.Resume();

                    if (er != null)
                    {
                        result.ExecutionResults.Add(er);
                    }

                    //lets save the current job result
                    using (TextWriter tw = new StreamWriter(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"), false))
                    {
                        tw.Write(result.ToXML());
                    }

                    if (er == null)
                    {
                        //The automation is likely not finished, the computer is likely going to reboot and
                        //we want this execution to continue after reboot so we should exit now instead of going to the next package.
                        //the executable package should have already called startuponnextrun
                        return;
                    }


                    if (!er.Success)
                    {
                        //stop on first error
                        break;
                    }

                    packageToRun++;
                    j.Properties["PackageToRun"] = packageToRun.ToString();
                    if (er.Success && er.RestartAfter)
                    {
                        StartupOnNextRun();
                        LogString("Restarting ...");
                        system.Shutdown(true);
                        return;
                    }
                }
                LogString("Sending Job Result");
                msr.ReportJobStatus(new JobCompleted(j, result));
                LogString("Job Result Sent");
                //cleanup
                if (File.Exists(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml")))
                {
                    File.Delete(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"));
                }
                if (ShutdownOnCompletion)
                {
                    LogString("Shuting Down ...");
                    system.Shutdown(false);

                    //so, lets exit the program
                    System.Windows.Forms.Application.Exit();
                }
            }
            catch (ThreadAbortException)
            {
                //eat it, get out right away.  Program is exiting or user has stopped automation
                return;
            }
            catch (Exception e)
            {
                LogString("Exception in thread: " + e.ToString());
                return;
            }
        }
 public SaveMq(MessageSendRecieve messageSendRecieve, string mqName)
 {
     this.messageSendRecieve = messageSendRecieve;
     this.mqName             = mqName;
 }
Ejemplo n.º 22
0
 public Form1()
 {
     InitializeComponent();
     msr = new MessageSendRecieve(AppConfig.ServerInbox, AppConfig.ServerOutbox);
 }