コード例 #1
0
 /// <summary>
 /// Check whether valid node and return service result if not.
 /// </summary>
 /// <param name="endpoint"></param>
 /// <param name="request"></param>
 /// <returns></returns>
 private Task <ServiceResultModel> TestPublishNodeAsync(EndpointModel endpoint,
                                                        PublishStartRequestModel request)
 {
     // Test whether value exists and fail if not
     return(_opc.ExecuteServiceAsync(endpoint, null,
                                     TimeSpan.FromSeconds(10), async session => {
         var readNode = request.Item.NodeId.ToNodeId(session.MessageContext);
         if (NodeId.IsNull(readNode))
         {
             throw new ArgumentException(nameof(request.Item.NodeId));
         }
         var diagnostics = new List <OperationResultModel>();
         var response = await session.ReadAsync(
             (request.Header?.Diagnostics).ToStackModel(),
             0, TimestampsToReturn.Both, new ReadValueIdCollection {
             new ReadValueId {
                 NodeId = readNode,
                 AttributeId = Attributes.Value
             }
         });
         OperationResultEx.Validate("Publish_" + readNode, diagnostics,
                                    response.Results.Select(r => r.StatusCode),
                                    response.DiagnosticInfos, false);
         SessionClientEx.Validate(response.Results, response.DiagnosticInfos);
         if (response.Results == null || response.Results.Count == 0)
         {
             return diagnostics.ToServiceModel(request.Header?.Diagnostics,
                                               session.MessageContext);
         }
         return null;
     }));
 }
コード例 #2
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpointId,
            PublishStartRequestModel request,
            CancellationToken ct = default
            )
        {
            kNodePublishStart.Inc();
            if (string.IsNullOrEmpty(endpointId))
            {
                throw new ArgumentNullException(nameof(endpointId));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Item == null)
            {
                throw new ArgumentNullException(nameof(request.Item));
            }
            if (string.IsNullOrEmpty(request.Item.NodeId))
            {
                throw new ArgumentNullException(nameof(request.Item.NodeId));
            }

            var endpoint = await _endpoints.GetEndpointAsync(endpointId, ct : ct);

            if (endpoint == null)
            {
                throw new ArgumentException("Invalid endpointId");
            }

            var jobId  = GetDefaultId(endpointId);
            var result = await _jobs.NewOrUpdateJobAsync(jobId, job => {
                var publishJob = AsJob(job);
                // TODO change to application uri?
                job.Name = endpoint.ApplicationId;
                publishJob.WriterGroup.WriterGroupId = GetDefaultId(endpoint.Registration.EndpointUrl);
                // Add subscription
                var connection = new ConnectionModel {
                    Endpoint    = endpoint.Registration.Endpoint,
                    Diagnostics = request.Header?.Diagnostics,
                    User        = request.Header?.Elevation
                };
                AddOrUpdateItemInJob(publishJob, request.Item, endpointId, job.Id, connection);

                job.JobConfiguration = _serializer.SerializeJobConfiguration(
                    publishJob, out var jobType);
                job.JobConfigurationType = jobType;
                if (publishJob.WriterGroup.DataSetWriters.Count != 0 &&
                    job.LifetimeData.Status != JobStatus.Deleted)
                {
                    job.LifetimeData.Status = JobStatus.Active;
                }
                job.Demands = PublisherDemands(endpoint);
                return(Task.FromResult(true));
            }, ct);

            return(new PublishStartResultModel());
        }
コード例 #3
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpoint, PublishStartRequestModel request)
        {
            var result = await _client.NodePublishStartAsync(endpoint,
                                                             Map <PublishStartRequestApiModel>(request));

            return(Map <PublishStartResultModel>(result));
        }
コード例 #4
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpoint, PublishStartRequestModel request)
        {
            var result = await _client.NodePublishStartAsync(endpoint,
                                                             request.ToApiModel());

            return(result.ToServiceModel());
        }
コード例 #5
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            EndpointModel endpoint, PublishStartRequestModel request)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException(nameof(endpoint));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Item == null)
            {
                throw new ArgumentNullException(nameof(request.Item));
            }
            if (string.IsNullOrEmpty(request.Item.NodeId))
            {
                throw new ArgumentNullException(nameof(request.Item.NodeId));
            }

            var error = await TestPublishNodeAsync(endpoint, request);

            if (error != null)
            {
                return(new PublishStartResultModel {
                    ErrorInfo = error
                });
            }

            GetUserNamePassword(endpoint.User, out var user, out var password);
            var content = new PublishNodesRequestModel {
                EndpointUrl = endpoint.Url,
                Password    = password,
                UserName    = user,
                UseSecurity = endpoint.SecurityMode != SecurityMode.None,
                OpcNodes    = new List <PublisherNodeModel> {
                    new PublisherNodeModel {
                        Id = ToPublisherNodeId(request.Item.NodeId),
                        OpcPublishingInterval =
                            request.Item.PublishingInterval,
                        OpcSamplingInterval =
                            request.Item.SamplingInterval
                    }
                }
            };

            if (_client == null)
            {
                await StartAsync();
            }
            var(errorInfo, _) = await _client.CallMethodAsync("PublishNodes",
                                                              JsonConvertEx.SerializeObject(content), request.Header?.Diagnostics);

            return(new PublishStartResultModel {
                ErrorInfo = errorInfo
            });
        }
コード例 #6
0
 /// <summary>
 /// Create api model from service model
 /// </summary>
 /// <param name="model"></param>
 public PublishStartRequestApiModel(PublishStartRequestModel model)
 {
     if (model == null)
     {
         throw new ArgumentNullException(nameof(model));
     }
     Item = model.Item == null ? null :
            new PublishedItemApiModel(model.Item);
     Header = model.Header == null ? null :
              new RequestHeaderApiModel(model.Header);
 }
コード例 #7
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpoint,
            PublishStartRequestModel request,
            CancellationToken ct = default
            )
        {
            var result = await _client.NodePublishStartAsync(endpoint,
                                                             request.ToApiModel(), ct);

            return(result.ToServiceModel());
        }
コード例 #8
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(string endpointId,
                                                                          PublishStartRequestModel request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            var result = await CallServiceOnTwin <PublishStartRequestModel, PublishStartResultModel>(
                "PublishStart_V2", endpointId, request);

            return(result);
        }
コード例 #9
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpointId, PublishStartRequestModel request)
        {
            if (string.IsNullOrEmpty(endpointId))
            {
                throw new ArgumentNullException(nameof(endpointId));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Item == null)
            {
                throw new ArgumentNullException(nameof(request.Item));
            }
            if (string.IsNullOrEmpty(request.Item.NodeId))
            {
                throw new ArgumentNullException(nameof(request.Item.NodeId));
            }

            var(publisherId, endpoint) = await _publishers.FindPublisherEndpoint(
                endpointId);

            GetUserNamePassword(request.Header?.Elevation, out var user, out var password);
            var content = new PublishNodesRequestModel {
                EndpointUrl  = endpoint.Url,
                EndpointId   = endpointId,
                UseSecurity  = endpoint.SecurityMode != SecurityMode.None,
                SecurityMode = endpoint.SecurityMode == null ||
                               endpoint.SecurityMode == SecurityMode.Best ? null :
                               endpoint.SecurityMode.ToString(),
                SecurityProfileUri = endpoint.SecurityPolicy,
                Password           = password,
                UserName           = user,
                OpcNodes           = new List <PublisherNodeModel> {
                    new PublisherNodeModel {
                        Id                    = request.Item.NodeId,
                        DisplayName           = null,
                        OpcPublishingInterval = (int?)
                                                request.Item.PublishingInterval?.TotalMilliseconds,
                        OpcSamplingInterval = (int?)
                                              request.Item.SamplingInterval?.TotalMilliseconds
                    }
                }
            };

            var(errorInfo, _) = await CallMethodOnPublisherAsync(publisherId, "PublishNodes",
                                                                 JsonConvertEx.SerializeObject(content));

            return(new PublishStartResultModel {
                ErrorInfo = errorInfo
            });
        }
コード例 #10
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            EndpointRegistrationModel registration, PublishStartRequestModel request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Item == null)
            {
                throw new ArgumentNullException(nameof(request.Item));
            }
            var result = await CallServiceOnSupervisor <PublishStartRequestModel, PublishStartResultModel>(
                "PublishStart_V2", registration, request);

            return(result);
        }
コード例 #11
0
        /// <inheritdoc/>
        public async Task <PublishStartResultModel> NodePublishStartAsync(
            string endpointId, PublishStartRequestModel request)
        {
            if (string.IsNullOrEmpty(endpointId))
            {
                throw new ArgumentNullException(nameof(endpointId));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Item == null)
            {
                throw new ArgumentNullException(nameof(request.Item));
            }
            if (string.IsNullOrEmpty(request.Item.NodeId))
            {
                throw new ArgumentNullException(nameof(request.Item.NodeId));
            }

            var endpoint = await _endpoints.GetEndpointAsync(endpointId);

            var result = await _jobs.NewOrUpdateJobAsync(GetDefaultId(endpointId), job => {
                var publishJob = AsJob(job);

                // Add subscription
                AddOrUpdateItemInJob(publishJob, request.Item, endpointId,
                                     new ConnectionModel {
                    Endpoint    = endpoint.Registration.Endpoint,
                    Diagnostics = request.Header?.Diagnostics,
                    User        = request.Header?.Elevation
                });

                job.JobConfiguration = _serializer.SerializeJobConfiguration(
                    publishJob, out var jobType);
                job.JobConfigurationType = jobType;
                if (publishJob.WriterGroup.DataSetWriters.Count != 0 &&
                    job.LifetimeData.Status != JobStatus.Deleted)
                {
                    job.LifetimeData.Status = JobStatus.Active;
                }
                job.Demands = PublisherDemands(endpoint);
                return(Task.FromResult(true));
            });

            return(new PublishStartResultModel());
        }
コード例 #12
0
 /// <inheritdoc/>
 public Task <PublishStartResultModel> NodePublishStartAsync(string endpointId,
                                                             PublishStartRequestModel request)
 {
     return(_publish.NodePublishStartAsync(Endpoint, request));
 }
コード例 #13
0
 /// <inheritdoc/>
 public Task <PublishStartResultModel> NodePublishStartAsync(
     T endpoint, PublishStartRequestModel request)
 {
     throw new NotSupportedException("Publishing not supported");
 }