86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Kubernetes
 | 
						|
    class Node
 | 
						|
      def initialize(cluster)
 | 
						|
        @cluster = cluster
 | 
						|
      end
 | 
						|
 | 
						|
      def all
 | 
						|
        {
 | 
						|
          nodes: metadata.presence,
 | 
						|
          node_connection_error: nodes_from_cluster[:connection_error],
 | 
						|
          metrics_connection_error: nodes_metrics_from_cluster[:connection_error]
 | 
						|
        }.compact
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      attr_reader :cluster
 | 
						|
 | 
						|
      def metadata
 | 
						|
        nodes.map do |node|
 | 
						|
          base_data(node).merge(node_metrics(node))
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def nodes_from_cluster
 | 
						|
        @nodes_from_cluster ||= graceful_request { cluster.kubeclient.get_nodes }
 | 
						|
      end
 | 
						|
 | 
						|
      def nodes_metrics_from_cluster
 | 
						|
        @nodes_metrics_from_cluster ||= graceful_request { cluster.kubeclient.metrics_client.get_nodes }
 | 
						|
      end
 | 
						|
 | 
						|
      def nodes
 | 
						|
        @nodes ||= nodes_from_cluster[:response].to_a
 | 
						|
      end
 | 
						|
 | 
						|
      def nodes_metrics
 | 
						|
        @nodes_metrics ||= nodes_metrics_from_cluster[:response].to_a
 | 
						|
      end
 | 
						|
 | 
						|
      def node_metrics_from_node(node)
 | 
						|
        nodes_metrics.find do |node_metric|
 | 
						|
          node_metric.metadata.name == node.metadata.name
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def graceful_request(&block)
 | 
						|
        ::Gitlab::Kubernetes::KubeClient.graceful_request(cluster.id, &block)
 | 
						|
      end
 | 
						|
 | 
						|
      def base_data(node)
 | 
						|
        {
 | 
						|
          'metadata' => {
 | 
						|
            'name' => node.metadata.name
 | 
						|
          },
 | 
						|
          'status' => {
 | 
						|
            'capacity' => {
 | 
						|
              'cpu' => node.status.capacity.cpu,
 | 
						|
              'memory' => node.status.capacity.memory
 | 
						|
            },
 | 
						|
            'allocatable' => {
 | 
						|
              'cpu' => node.status.allocatable.cpu,
 | 
						|
              'memory' => node.status.allocatable.memory
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      end
 | 
						|
 | 
						|
      def node_metrics(node)
 | 
						|
        node_metrics = node_metrics_from_node(node)
 | 
						|
        return {} unless node_metrics
 | 
						|
 | 
						|
        {
 | 
						|
          'usage' => {
 | 
						|
            'cpu' => node_metrics.usage.cpu,
 | 
						|
            'memory' => node_metrics.usage.memory
 | 
						|
          }
 | 
						|
        }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |