public static NodeHealth ToNodeHealth()

in src/ccf/ccf-provider-common/AciUtils.cs [32:111]


    public static NodeHealth ToNodeHealth(ContainerGroupData data)
    {
        if (!data.Tags.TryGetValue(AciConstants.CcfNetworkResourceNameTag, out var nodeName))
        {
            nodeName = data.Name;
        }

        NodeStatus status = NodeStatus.Ok;
        var reasons = new List<Reason>();
        var restartedContainers = data.Containers.Where(
            c => c.InstanceView?.RestartCount > 0);
        var terminatedContainers = data.Containers.Where(
            c => c.InstanceView?.CurrentState?.State == "Terminated");
        var multipleStartedEventContainers = data.Containers.Where(
            c => c.InstanceView?.Events?.Count(e => e.Name == "Started") > 1);

        if (restartedContainers.Any())
        {
            status = NodeStatus.NeedsReplacement;
            var code = "ContainerRestarted";
            var message = "Following container(s) are reporting a restart count > 0.";
            foreach (var c in restartedContainers)
            {
                message += $" {c.Name}: {c.InstanceView.RestartCount}.";
            }

            reasons.Add(new() { Code = code, Message = message });
        }

        if (terminatedContainers.Any())
        {
            status = NodeStatus.NeedsReplacement;
            var code = "ContainerTerminated";
            var message = "Following container(s) are reporting as terminated.";
            foreach (var c in terminatedContainers)
            {
                message += $" {c.Name}.";
            }

            reasons.Add(new() { Code = code, Message = message });
        }

        if (data.ProvisioningState == "Failed")
        {
            status = NodeStatus.NeedsReplacement;
            var code = "ProvisioningFailed";
            var message = $"The container group {data.Name} is reporting provisioning failure.";
            reasons.Add(new() { Code = code, Message = message });
        }

        if (data.InstanceView?.State == "Stopped")
        {
            status = NodeStatus.NeedsReplacement;
            var code = "ContainerGroupStopped";
            var message = $"The container group {data.Name} is reporting state as stopped.";
            reasons.Add(new() { Code = code, Message = message });
        }

        if (multipleStartedEventContainers.Any())
        {
            status = NodeStatus.NeedsReplacement;
            var code = "MultipleStartedEvents";
            var message = "Following container(s) are reporting multiple Started events.";
            foreach (var c in multipleStartedEventContainers)
            {
                message += $" {c.Name}: {c.InstanceView.Events.Count(e => e.Name == "Started")}.";
            }

            reasons.Add(new() { Code = code, Message = message });
        }

        var ep = ToNodeEndpoint(data);
        return new NodeHealth
        {
            Name = nodeName,
            Endpoint = ep.ClientRpcAddress,
            Status = status.ToString(),
            Reasons = reasons
        };
    }