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

     1  // generated code; DO NOT EDIT
     2  
     3  package choria_utilclient
     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  // ChoriaUtilClient to the choria_util agent
    91  type ChoriaUtilClient 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 *ChoriaUtilClient) {
   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_util agent
   129  func New(fw inter.Framework, opts ...InitializationOption) (client *ChoriaUtilClient, err error) {
   130  	c := &ChoriaUtilClient{
   131  		fw:            fw,
   132  		ddl:           &agent.DDL{},
   133  		clientRPCOpts: []rpcclient.RequestOption{},
   134  		filters: []FilterFunc{
   135  			FilterFunc(coreclient.AgentFilter("choria_util")),
   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_util")
   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 *ChoriaUtilClient) 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 *ChoriaUtilClient) 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  // Info performs the info action
   199  //
   200  // Description: Choria related information from the running Daemon and Middleware
   201  func (p *ChoriaUtilClient) Info() *InfoRequester {
   202  	d := &InfoRequester{
   203  		outc: nil,
   204  		r: &requester{
   205  			args:   map[string]any{},
   206  			action: "info",
   207  			client: p,
   208  		},
   209  	}
   210  
   211  	action, _ := p.ddl.ActionInterface(d.r.action)
   212  	action.SetDefaults(d.r.args)
   213  
   214  	return d
   215  }
   216  
   217  // MachineState performs the machine_state action
   218  //
   219  // Description: Retrieves the current state of a specific Choria Autonomous Agent
   220  //
   221  // Optional Inputs:
   222  //   - instance (string) - Machine Instance ID
   223  //   - name (string) - Machine Name
   224  //   - path (string) - Machine Path
   225  func (p *ChoriaUtilClient) MachineState() *MachineStateRequester {
   226  	d := &MachineStateRequester{
   227  		outc: nil,
   228  		r: &requester{
   229  			args:   map[string]any{},
   230  			action: "machine_state",
   231  			client: p,
   232  		},
   233  	}
   234  
   235  	action, _ := p.ddl.ActionInterface(d.r.action)
   236  	action.SetDefaults(d.r.args)
   237  
   238  	return d
   239  }
   240  
   241  // MachineStates performs the machine_states action
   242  //
   243  // Description: States of the hosted Choria Autonomous Agents
   244  func (p *ChoriaUtilClient) MachineStates() *MachineStatesRequester {
   245  	d := &MachineStatesRequester{
   246  		outc: nil,
   247  		r: &requester{
   248  			args:   map[string]any{},
   249  			action: "machine_states",
   250  			client: p,
   251  		},
   252  	}
   253  
   254  	action, _ := p.ddl.ActionInterface(d.r.action)
   255  	action.SetDefaults(d.r.args)
   256  
   257  	return d
   258  }
   259  
   260  // MachineTransition performs the machine_transition action
   261  //
   262  // Description: Attempts to force a transition in a hosted Choria Autonomous Agent
   263  //
   264  // Required Inputs:
   265  //   - transition (string) - The transition event to send to the machine
   266  //
   267  // Optional Inputs:
   268  //   - instance (string) - Machine Instance ID
   269  //   - name (string) - Machine Name
   270  //   - path (string) - Machine Path
   271  //   - version (string) - Machine Version
   272  func (p *ChoriaUtilClient) MachineTransition(inputTransition string) *MachineTransitionRequester {
   273  	d := &MachineTransitionRequester{
   274  		outc: nil,
   275  		r: &requester{
   276  			args: map[string]any{
   277  				"transition": inputTransition,
   278  			},
   279  			action: "machine_transition",
   280  			client: p,
   281  		},
   282  	}
   283  
   284  	action, _ := p.ddl.ActionInterface(d.r.action)
   285  	action.SetDefaults(d.r.args)
   286  
   287  	return d
   288  }