github.com/segmentio/kafka-go@v0.4.48-0.20240318174348-3f6244eb34fd/describeconfigs.go (about)

     1  package kafka
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net"
     7  	"time"
     8  
     9  	"github.com/segmentio/kafka-go/protocol/describeconfigs"
    10  )
    11  
    12  // DescribeConfigsRequest represents a request sent to a kafka broker to describe configs.
    13  type DescribeConfigsRequest struct {
    14  	// Address of the kafka broker to send the request to.
    15  	Addr net.Addr
    16  
    17  	// List of resources to get details for.
    18  	Resources []DescribeConfigRequestResource
    19  
    20  	// Ignored if API version is less than v1
    21  	IncludeSynonyms bool
    22  
    23  	// Ignored if API version is less than v3
    24  	IncludeDocumentation bool
    25  }
    26  
    27  type DescribeConfigRequestResource struct {
    28  	// Resource Type
    29  	ResourceType ResourceType
    30  
    31  	// Resource Name
    32  	ResourceName string
    33  
    34  	// ConfigNames is a list of configurations to update.
    35  	ConfigNames []string
    36  }
    37  
    38  // DescribeConfigsResponse represents a response from a kafka broker to a describe config request.
    39  type DescribeConfigsResponse struct {
    40  	// The amount of time that the broker throttled the request.
    41  	Throttle time.Duration
    42  
    43  	// Resources
    44  	Resources []DescribeConfigResponseResource
    45  }
    46  
    47  // DescribeConfigResponseResource.
    48  type DescribeConfigResponseResource struct {
    49  	// Resource Type
    50  	ResourceType int8
    51  
    52  	// Resource Name
    53  	ResourceName string
    54  
    55  	// Error
    56  	Error error
    57  
    58  	// ConfigEntries
    59  	ConfigEntries []DescribeConfigResponseConfigEntry
    60  }
    61  
    62  // DescribeConfigResponseConfigEntry.
    63  type DescribeConfigResponseConfigEntry struct {
    64  	ConfigName  string
    65  	ConfigValue string
    66  	ReadOnly    bool
    67  
    68  	// Ignored if API version is greater than v0
    69  	IsDefault bool
    70  
    71  	// Ignored if API version is less than v1
    72  	ConfigSource int8
    73  
    74  	IsSensitive bool
    75  
    76  	// Ignored if API version is less than v1
    77  	ConfigSynonyms []DescribeConfigResponseConfigSynonym
    78  
    79  	// Ignored if API version is less than v3
    80  	ConfigType int8
    81  
    82  	// Ignored if API version is less than v3
    83  	ConfigDocumentation string
    84  }
    85  
    86  // DescribeConfigResponseConfigSynonym.
    87  type DescribeConfigResponseConfigSynonym struct {
    88  	// Ignored if API version is less than v1
    89  	ConfigName string
    90  
    91  	// Ignored if API version is less than v1
    92  	ConfigValue string
    93  
    94  	// Ignored if API version is less than v1
    95  	ConfigSource int8
    96  }
    97  
    98  // DescribeConfigs sends a config altering request to a kafka broker and returns the
    99  // response.
   100  func (c *Client) DescribeConfigs(ctx context.Context, req *DescribeConfigsRequest) (*DescribeConfigsResponse, error) {
   101  	resources := make([]describeconfigs.RequestResource, len(req.Resources))
   102  
   103  	for i, t := range req.Resources {
   104  		resources[i] = describeconfigs.RequestResource{
   105  			ResourceType: int8(t.ResourceType),
   106  			ResourceName: t.ResourceName,
   107  			ConfigNames:  t.ConfigNames,
   108  		}
   109  	}
   110  
   111  	m, err := c.roundTrip(ctx, req.Addr, &describeconfigs.Request{
   112  		Resources:            resources,
   113  		IncludeSynonyms:      req.IncludeSynonyms,
   114  		IncludeDocumentation: req.IncludeDocumentation,
   115  	})
   116  	if err != nil {
   117  		return nil, fmt.Errorf("kafka.(*Client).DescribeConfigs: %w", err)
   118  	}
   119  
   120  	res := m.(*describeconfigs.Response)
   121  	ret := &DescribeConfigsResponse{
   122  		Throttle:  makeDuration(res.ThrottleTimeMs),
   123  		Resources: make([]DescribeConfigResponseResource, len(res.Resources)),
   124  	}
   125  
   126  	for i, t := range res.Resources {
   127  
   128  		configEntries := make([]DescribeConfigResponseConfigEntry, len(t.ConfigEntries))
   129  		for j, v := range t.ConfigEntries {
   130  
   131  			configSynonyms := make([]DescribeConfigResponseConfigSynonym, len(v.ConfigSynonyms))
   132  			for k, cs := range v.ConfigSynonyms {
   133  				configSynonyms[k] = DescribeConfigResponseConfigSynonym{
   134  					ConfigName:   cs.ConfigName,
   135  					ConfigValue:  cs.ConfigValue,
   136  					ConfigSource: cs.ConfigSource,
   137  				}
   138  			}
   139  
   140  			configEntries[j] = DescribeConfigResponseConfigEntry{
   141  				ConfigName:          v.ConfigName,
   142  				ConfigValue:         v.ConfigValue,
   143  				ReadOnly:            v.ReadOnly,
   144  				ConfigSource:        v.ConfigSource,
   145  				IsDefault:           v.IsDefault,
   146  				IsSensitive:         v.IsSensitive,
   147  				ConfigSynonyms:      configSynonyms,
   148  				ConfigType:          v.ConfigType,
   149  				ConfigDocumentation: v.ConfigDocumentation,
   150  			}
   151  		}
   152  
   153  		ret.Resources[i] = DescribeConfigResponseResource{
   154  			ResourceType:  t.ResourceType,
   155  			ResourceName:  t.ResourceName,
   156  			Error:         makeError(t.ErrorCode, t.ErrorMessage),
   157  			ConfigEntries: configEntries,
   158  		}
   159  	}
   160  
   161  	return ret, nil
   162  }