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

     1  // generated code; DO NOT EDIT
     2  
     3  package {{ .Package }}
     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  	rpcclient "github.com/choria-io/go-choria/providers/agent/mcorpc/client"
    16  	"github.com/choria-io/go-choria/providers/agent/mcorpc/ddl/agent"
    17  	"github.com/choria-io/go-choria/protocol"
    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  // {{ .DDL.Metadata.Name | SnakeToCamel }}Client to the {{ .DDL.Metadata.Name }} agent
    91  type {{ .DDL.Metadata.Name | SnakeToCamel }}Client 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 *{{ .DDL.Metadata.Name | SnakeToCamel }}Client) {
   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 {{ .DDL.Metadata.Name }} agent
   129  func New(fw inter.Framework, opts ...InitializationOption) (client *{{ .DDL.Metadata.Name | SnakeToCamel }}Client, err error) {
   130  	c := &{{ .DDL.Metadata.Name | SnakeToCamel }}Client{
   131                  fw:            fw,
   132  		ddl:           &agent.DDL{},
   133  		clientRPCOpts: []rpcclient.RequestOption{},
   134  		filters:       []FilterFunc{
   135  		    FilterFunc(coreclient.AgentFilter("{{ .DDL.Metadata.Name }}")),
   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("{{ .DDL.Metadata.Name }}")
   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 *{{ .DDL.Metadata.Name | SnakeToCamel }}Client) 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 *{{ .DDL.Metadata.Name | SnakeToCamel }}Client) 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  {{ range $i, $action := .DDL.Actions }}
   199  // {{ $action.Name | SnakeToCamel }} performs the {{ $action.Name | ToLower }} action
   200  //
   201  // Description: {{ $action.Description }}
   202  {{- if ChoriaRequiredInputs $action }}
   203  //
   204  // Required Inputs:
   205  {{- range $name, $input := ChoriaRequiredInputs $action }}
   206  //    - {{ $name }} ({{ $input.Type | ChoriaTypeToGoType }}) - {{ $input.Description }}
   207  {{- end }}
   208  {{- end }}
   209  {{- if ChoriaOptionalInputs $action }}
   210  //
   211  // Optional Inputs:
   212  {{- range $name, $input := ChoriaOptionalInputs $action }}
   213  //    - {{ $name }} ({{ $input.Type | ChoriaTypeToGoType }}) - {{ $input.Description }}
   214  {{- end }}
   215  {{- end }}
   216  func (p *{{ $.DDL.Metadata.Name | SnakeToCamel }}Client) {{ $action.Name | SnakeToCamel }}({{ $action | ChoriaRequiredInputsToFuncArgs }}) *{{ $action.Name | SnakeToCamel }}Requester {
   217  	d := &{{ $action.Name | SnakeToCamel }}Requester{
   218  		outc: nil,
   219  		r: &requester{
   220  			args:   map[string]any{
   221  {{- range $name, $input := ChoriaRequiredInputs $action }}
   222  				"{{ $name }}": input{{ $name | SnakeToCamel }},
   223  {{- end }}
   224  			},
   225  			action: "{{ $action.Name | ToLower }}",
   226  			client: p,
   227  		},
   228  	}
   229  
   230  	action, _ := p.ddl.ActionInterface(d.r.action)
   231  	action.SetDefaults(d.r.args)
   232  
   233  	return d
   234  }
   235  {{ end }}