github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/client/choria_registryclient/client.go (about)

     1  // generated code; DO NOT EDIT
     2  
     3  package choria_registryclient
     4  
     5  import (
     6  	"fmt"
     7  	"sync"
     8  	"time"
     9  
    10  	"context"
    11  
    12  	coreclient "github.com/choria-io/go-choria/client/client"
    13  	"github.com/choria-io/go-choria/config"
    14  	"github.com/choria-io/go-choria/inter"
    15  	"github.com/choria-io/go-choria/protocol"
    16  	rpcclient "github.com/choria-io/go-choria/providers/agent/mcorpc/client"
    17  	"github.com/choria-io/go-choria/providers/agent/mcorpc/ddl/agent"
    18  )
    19  
    20  // Stats are the statistics for a request
    21  type Stats interface {
    22  	Agent() string
    23  	Action() string
    24  	All() bool
    25  	NoResponseFrom() []string
    26  	UnexpectedResponseFrom() []string
    27  	DiscoveredCount() int
    28  	DiscoveredNodes() *[]string
    29  	FailCount() int
    30  	OKCount() int
    31  	ResponsesCount() int
    32  	PublishDuration() (time.Duration, error)
    33  	RequestDuration() (time.Duration, error)
    34  	DiscoveryDuration() (time.Duration, error)
    35  	OverrideDiscoveryTime(start time.Time, end time.Time)
    36  	UniqueRequestID() string
    37  }
    38  
    39  // NodeSource discovers nodes
    40  type NodeSource interface {
    41  	Reset()
    42  	Discover(ctx context.Context, fw inter.Framework, filters []FilterFunc) ([]string, error)
    43  }
    44  
    45  // FilterFunc can generate a Choria filter
    46  type FilterFunc func(f *protocol.Filter) error
    47  
    48  // RenderFormat is the format used by the RenderResults helper
    49  type RenderFormat int
    50  
    51  const (
    52  	// JSONFormat renders the results as a JSON document
    53  	JSONFormat RenderFormat = iota
    54  
    55  	// TextFormat renders the results as a Choria typical result set in line with choria req output
    56  	TextFormat
    57  
    58  	// TableFormat renders all successful responses in a table
    59  	TableFormat
    60  
    61  	// TXTFooter renders only the request summary statistics
    62  	TXTFooter
    63  )
    64  
    65  // DisplayMode overrides the DDL display hints
    66  type DisplayMode uint8
    67  
    68  const (
    69  	// DisplayDDL shows results based on the configuration in the DDL file
    70  	DisplayDDL = DisplayMode(iota)
    71  	// DisplayOK shows only passing results
    72  	DisplayOK
    73  	// DisplayFailed shows only failed results
    74  	DisplayFailed
    75  	// DisplayAll shows all results
    76  	DisplayAll
    77  	// DisplayNone shows no results
    78  	DisplayNone
    79  )
    80  
    81  type Log interface {
    82  	Debugf(format string, args ...any)
    83  	Infof(format string, args ...any)
    84  	Warnf(format string, args ...any)
    85  	Errorf(format string, args ...any)
    86  	Fatalf(format string, args ...any)
    87  	Panicf(format string, args ...any)
    88  }
    89  
    90  // ChoriaRegistryClient to the choria_registry agent
    91  type ChoriaRegistryClient struct {
    92  	fw            inter.Framework
    93  	cfg           *config.Config
    94  	ddl           *agent.DDL
    95  	ns            NodeSource
    96  	clientOpts    *initOptions
    97  	clientRPCOpts []rpcclient.RequestOption
    98  	filters       []FilterFunc
    99  	targets       []string
   100  	workers       int
   101  	exprFilter    string
   102  	noReplies     bool
   103  
   104  	sync.Mutex
   105  }
   106  
   107  // Metadata is the agent metadata
   108  type Metadata struct {
   109  	License     string `json:"license"`
   110  	Author      string `json:"author"`
   111  	Timeout     int    `json:"timeout"`
   112  	Name        string `json:"name"`
   113  	Version     string `json:"version"`
   114  	URL         string `json:"url"`
   115  	Description string `json:"description"`
   116  }
   117  
   118  // Must create a new client and panics on error
   119  func Must(fw inter.Framework, opts ...InitializationOption) (client *ChoriaRegistryClient) {
   120  	c, err := New(fw, opts...)
   121  	if err != nil {
   122  		panic(err)
   123  	}
   124  
   125  	return c
   126  }
   127  
   128  // New creates a new client to the choria_registry agent
   129  func New(fw inter.Framework, opts ...InitializationOption) (client *ChoriaRegistryClient, err error) {
   130  	c := &ChoriaRegistryClient{
   131  		fw:            fw,
   132  		ddl:           &agent.DDL{},
   133  		clientRPCOpts: []rpcclient.RequestOption{},
   134  		filters: []FilterFunc{
   135  			FilterFunc(coreclient.AgentFilter("choria_registry")),
   136  		},
   137  		clientOpts: &initOptions{
   138  			cfgFile: coreclient.UserConfig(),
   139  		},
   140  		targets: []string{},
   141  	}
   142  
   143  	for _, opt := range opts {
   144  		opt(c.clientOpts)
   145  	}
   146  
   147  	c.cfg = c.fw.Configuration()
   148  
   149  	if c.clientOpts.dt > 0 {
   150  		c.cfg.DiscoveryTimeout = int(c.clientOpts.dt.Seconds())
   151  	}
   152  
   153  	if c.clientOpts.ns == nil {
   154  		switch c.cfg.DefaultDiscoveryMethod {
   155  		case "choria":
   156  			c.clientOpts.ns = &PuppetDBNS{}
   157  		default:
   158  			c.clientOpts.ns = &BroadcastNS{}
   159  		}
   160  	}
   161  	c.ns = c.clientOpts.ns
   162  
   163  	if c.clientOpts.logger == nil {
   164  		c.clientOpts.logger = c.fw.Logger("choria_registry")
   165  	} else {
   166  		c.fw.SetLogger(c.clientOpts.logger.Logger)
   167  	}
   168  
   169  	c.ddl, err = DDL()
   170  	if err != nil {
   171  		return nil, fmt.Errorf("could not parse embedded DDL: %s", err)
   172  	}
   173  
   174  	return c, nil
   175  }
   176  
   177  // AgentMetadata is the agent metadata this client supports
   178  func (p *ChoriaRegistryClient) AgentMetadata() *Metadata {
   179  	return &Metadata{
   180  		License:     p.ddl.Metadata.License,
   181  		Author:      p.ddl.Metadata.Author,
   182  		Timeout:     p.ddl.Metadata.Timeout,
   183  		Name:        p.ddl.Metadata.Name,
   184  		Version:     p.ddl.Metadata.Version,
   185  		URL:         p.ddl.Metadata.URL,
   186  		Description: p.ddl.Metadata.Description,
   187  	}
   188  }
   189  
   190  // DiscoverNodes performs a discovery using the configured filter and node source
   191  func (p *ChoriaRegistryClient) DiscoverNodes(ctx context.Context) (nodes []string, err error) {
   192  	p.Lock()
   193  	defer p.Unlock()
   194  
   195  	return p.ns.Discover(ctx, p.fw, p.filters)
   196  }
   197  
   198  // Names performs the names action
   199  //
   200  // Description: List of all known DDLs for a specific plugin type
   201  //
   202  // Required Inputs:
   203  //   - plugin_type (string) - The type of plugin
   204  func (p *ChoriaRegistryClient) Names(inputPluginType string) *NamesRequester {
   205  	d := &NamesRequester{
   206  		outc: nil,
   207  		r: &requester{
   208  			args: map[string]any{
   209  				"plugin_type": inputPluginType,
   210  			},
   211  			action: "names",
   212  			client: p,
   213  		},
   214  	}
   215  
   216  	action, _ := p.ddl.ActionInterface(d.r.action)
   217  	action.SetDefaults(d.r.args)
   218  
   219  	return d
   220  }
   221  
   222  // Ddl performs the ddl action
   223  //
   224  // Description: Retrieve the DDL for a specific plugin
   225  //
   226  // Required Inputs:
   227  //   - name (string) - The name of the plugin
   228  //   - plugin_type (string) - The type of plugin
   229  //
   230  // Optional Inputs:
   231  //   - format (string) - The result format the plugin should be retrieved in
   232  func (p *ChoriaRegistryClient) Ddl(inputName string, inputPluginType string) *DdlRequester {
   233  	d := &DdlRequester{
   234  		outc: nil,
   235  		r: &requester{
   236  			args: map[string]any{
   237  				"name":        inputName,
   238  				"plugin_type": inputPluginType,
   239  			},
   240  			action: "ddl",
   241  			client: p,
   242  		},
   243  	}
   244  
   245  	action, _ := p.ddl.ActionInterface(d.r.action)
   246  	action.SetDefaults(d.r.args)
   247  
   248  	return d
   249  }