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); }
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); }
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"); }
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); } }
public void Build_FromNode() { var target = new ClusterMessageBuilder(); target.FromNode(); var result = target.Build(); result.Header.FromType.Should().Be(TargetType.Node); }
public void Build_ToCluster() { var target = new ClusterMessageBuilder(); target.ToCluster(); var result = target.Build(); result.Header.ToType.Should().Be(TargetType.Cluster); }
public void Build_Test() { var target = new ClusterMessageBuilder(); var result = target.Build(); result.Should().NotBeNull(); result.Header.Should().NotBeNull(); }
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"); }
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"); }
public void Build_WithPayloadObject() { var target = new ClusterMessageBuilder(); var obj = new object(); target.WithObjectPayload(obj); var result = target.Build(); result.PayloadObject.Should().BeSameAs(obj); }
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); }
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)); }
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); }
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); } }
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); }