예제 #1
0
        public void TransferPackageFile(StitchGroupName groupName, string toNodeId, string filePath, string fileName, InstanceAdaptorDetails adaptor, string jobId, string taskId)
        {
            // TODO: More validation and error handling
            // TODO: We need to get more sophisticated about this, such as doing the transfer in chunks and allowing restarts
            if (!groupName.IsValid() || !groupName.IsVersionGroup())
            {
                throw new Exception("Must use a valid version name for a package upload file");
            }
            if (adaptor == null)
            {
                throw new Exception("Adaptor details must be provided");
            }

            var bytes    = File.ReadAllBytes(filePath);
            var envelope = new FileTransferEnvelope
            {
                Contents             = bytes,
                GroupName            = groupName.VersionString,
                JobId                = jobId,
                TaskId               = taskId,
                PacketNumber         = 1,
                TotalNumberOfPackets = 1,
                FileName             = fileName,
                Adaptor              = adaptor
            };
            var message = new ClusterMessageBuilder()
                          .ToNode(toNodeId)
                          .FromNode()
                          .WithInternalObjectPayload(envelope)
                          .Build();

            Send(message);
        }
예제 #2
0
        public ClusterMessage Map(NetMQMessage source)
        {
            var envelope = new ClusterMessageBuilder().Build();

            envelope.Header = _byteSerializer.Deserialize <MessageHeader>(source.Pop().Buffer);
            if (envelope.Header.PayloadType == MessagePayloadType.Raw)
            {
                envelope.RawFrames = source.Select(f => f.ToByteArray()).ToList();
            }
            else if (envelope.Header.PayloadType == MessagePayloadType.Object || envelope.Header.PayloadType == MessagePayloadType.InternalObject)
            {
                var bytes = source.FirstOrDefault()?.ToByteArray();
                if (bytes != null)
                {
                    envelope.PayloadObject = _byteSerializer.DeserializeObject(bytes);
                }
            }
            else if (envelope.Header.PayloadType == MessagePayloadType.CommandString)
            {
                envelope.CommandStrings = source
                                          .Select(f => f.ToByteArray())
                                          .Select(b => Encoding.Unicode.GetString(b))
                                          .ToList();
            }
            return(envelope);
        }
예제 #3
0
        private void GenerateAndPublishNodeStatus()
        {
            var message = _service.GenerateCurrentNodeStatus();

            if (message == null)
            {
                return;
            }

            // Save it to the data module, for quick lookup
            _data.Save(message, true);

            // Broadcast it locally, so any modules can get it if they want
            _messageBus.Publish(NodeStatus.BroadcastEvent, message);

            // Send it over the backplane, so all other nodes can be aware of it.
            var envelope = new ClusterMessageBuilder()
                           .ToCluster()
                           .FromNode()
                           .WithObjectPayload(message)
                           .Build();

            _messageBus.Publish(ClusterMessage.SendEventName, envelope);

            _log.LogDebug("Published updated node status");
        }
예제 #4
0
        private void ReceiveFileTransferRequest(ClusterMessage envelope, FileTransferEnvelope request)
        {
            using (var stream = new MemoryStream(request.Contents))
            {
                // TODO: Get more sophisticated with chunking, restart/retry, checksums, etc
                var response = _messageBus.Request <PackageFileUploadRequest, PackageFileUploadResponse>(PackageFileUploadRequest.ChannelFromRemote, new PackageFileUploadRequest
                {
                    Contents  = stream,
                    FileName  = request.FileName,
                    GroupName = new StitchGroupName(request.GroupName),
                    LocalOnly = true,
                    Adaptor   = request.Adaptor
                });

                var outEnvelope = new ClusterMessageBuilder()
                                  .FromNode()
                                  .ToNode(envelope.Header.FromNetworkId)
                                  .WithObjectPayload(new CommandReceipt
                {
                    Success       = response.IsSuccess,
                    ReplyToJobId  = request.JobId,
                    ReplyToTaskId = request.TaskId
                })
                                  .Build();
                _backplane.Send(outEnvelope);
            }
        }
예제 #5
0
        public void Build_FromNode()
        {
            var target = new ClusterMessageBuilder();

            target.FromNode();
            var result = target.Build();

            result.Header.FromType.Should().Be(TargetType.Node);
        }
예제 #6
0
        public void Build_ToCluster()
        {
            var target = new ClusterMessageBuilder();

            target.ToCluster();
            var result = target.Build();

            result.Header.ToType.Should().Be(TargetType.Cluster);
        }
예제 #7
0
        public void Build_Test()
        {
            var target = new ClusterMessageBuilder();

            var result = target.Build();

            result.Should().NotBeNull();
            result.Header.Should().NotBeNull();
        }
예제 #8
0
        public void Build_ToZone()
        {
            var target = new ClusterMessageBuilder();

            target.ToZone("ABC");
            var result = target.Build();

            result.Header.ToType.Should().Be(TargetType.Zone);
            result.Header.ZoneName.Should().Be("ABC");
        }
예제 #9
0
        public void Build_ToNode()
        {
            var target = new ClusterMessageBuilder();

            target.ToNode("ABC");
            var result = target.Build();

            result.Header.ToType.Should().Be(TargetType.Node);
            result.Header.ToNetworkId.Should().Be("ABC");
        }
예제 #10
0
        public void Build_WithPayloadObject()
        {
            var target = new ClusterMessageBuilder();
            var obj    = new object();

            target.WithObjectPayload(obj);
            var result = target.Build();

            result.PayloadObject.Should().BeSameAs(obj);
        }
예제 #11
0
            public void SendCommandRequest(string networkNodeId, CommandRequest request, CommandJob job, CommandJobTask task)
            {
                request.SetJobDetails(job.Id, task.Id);
                var message = new ClusterMessageBuilder()
                              .FromNode()
                              .ToNode(networkNodeId)
                              .WithObjectPayload(request)
                              .Build();

                Send(message);
            }
예제 #12
0
 public LocalCreateInstanceResponse CreateInstances(CreateInstanceRequest request, string networkNodeId, bool remote)
 {
     if (remote)
     {
         var message = new ClusterMessageBuilder()
                       .FromNode()
                       .ToNode(networkNodeId)
                       .WithObjectPayload(request)
                       .Build();
         _messageBus.Publish(ClusterMessage.SendEventName, message);
         return(null);
     }
     return(_messageBus.Request <LocalCreateInstanceRequest, LocalCreateInstanceResponse>(request));
 }
예제 #13
0
            public void SendReceipt(bool success, string networkNodeId, string jobId, string taskId)
            {
                var message = new ClusterMessageBuilder()
                              .FromNode()
                              .ToNode(networkNodeId)
                              .WithObjectPayload(new CommandReceipt
                {
                    Success       = success,
                    ReplyToJobId  = jobId,
                    ReplyToTaskId = taskId
                })
                              .Build();

                _messageBus.Publish(ClusterMessage.SendEventName, message);
            }
예제 #14
0
 public void SendStitchData(StitchDataMessage message, bool remote)
 {
     if (remote)
     {
         var envelope = new ClusterMessageBuilder()
                        .ToNode(message.ToNetworkId)
                        .FromNode()
                        .WithObjectPayload(message)
                        .Build();
         _messageBus.Publish(ClusterMessage.SendEventName, envelope);
     }
     else
     {
         _messageBus.Publish(StitchDataMessage.ChannelSendLocal, message);
     }
 }
예제 #15
0
        private void SendNodeStatusToNewClusterNode(ClusterMemberEvent obj)
        {
            var message = _service.GenerateCurrentNodeStatus();

            if (message == null)
            {
                return;
            }

            var envelope = new ClusterMessageBuilder()
                           .FromNode()
                           .ToNode(obj.NetworkNodeId)
                           .WithObjectPayload(message)
                           .Build();

            _messageBus.Publish(ClusterMessage.SendEventName, envelope);
            _log.LogDebug("Published node status to node Id={0}", obj.NodeId);
        }