Files
influx-cli/clients/template/template.go
2021-07-02 10:19:51 -04:00

120 lines
2.8 KiB
Go

package template
import (
"context"
"fmt"
"github.com/influxdata/influx-cli/v2/api"
"github.com/influxdata/influx-cli/v2/clients"
"github.com/influxdata/influx-cli/v2/pkg/template"
)
type Client struct {
clients.CLI
api.TemplatesApi
api.OrganizationsApi
}
type SummarizeParams struct {
OrgId string
OrgName string
Sources []template.Source
RenderTableColors bool
RenderTableBorders bool
}
func (c Client) Summarize(ctx context.Context, params *SummarizeParams) error {
if params.OrgId == "" && params.OrgName == "" && c.ActiveConfig.Org == "" {
return clients.ErrMustSpecifyOrg
}
orgID := params.OrgId
if orgID == "" {
orgName := params.OrgName
if orgName == "" {
orgName = c.ActiveConfig.Org
}
orgs, err := c.GetOrgs(ctx).Org(orgName).Execute()
if err != nil {
return fmt.Errorf("failed to get ID for org %q: %w", orgName, err)
}
if len(orgs.GetOrgs()) == 0 {
return fmt.Errorf("no orgs found with name %q: %w", orgName, err)
}
orgID = orgs.GetOrgs()[0].GetId()
}
templates, err := template.ReadSources(ctx, params.Sources)
if err != nil {
return err
}
// Execute a dry-run to make the server summarize the template(s).
req := api.TemplateApply{
DryRun: true,
OrgID: orgID,
Templates: templates,
}
res, err := c.ApplyTemplate(ctx).TemplateApply(req).Execute()
if err != nil {
return fmt.Errorf("failed to summarize template: %w", err)
}
if c.PrintAsJSON {
return c.PrintJSON(res.Summary)
}
return template.PrintSummary(res.Summary, c.StdIO, params.RenderTableColors, params.RenderTableBorders)
}
type ValidateParams struct {
OrgId string
OrgName string
Sources []template.Source
}
func (c Client) Validate(ctx context.Context, params *ValidateParams) error {
if params.OrgId == "" && params.OrgName == "" && c.ActiveConfig.Org == "" {
return clients.ErrMustSpecifyOrg
}
orgID := params.OrgId
if orgID == "" {
orgName := params.OrgName
if orgName == "" {
orgName = c.ActiveConfig.Org
}
orgs, err := c.GetOrgs(ctx).Org(orgName).Execute()
if err != nil {
return fmt.Errorf("failed to get ID for org %q: %w", orgName, err)
}
if len(orgs.GetOrgs()) == 0 {
return fmt.Errorf("no orgs found with name %q: %w", orgName, err)
}
orgID = orgs.GetOrgs()[0].GetId()
}
templates, err := template.ReadSources(ctx, params.Sources)
if err != nil {
return err
}
// Execute a dry-run to make the server summarize the template(s).
req := api.TemplateApply{
DryRun: true,
OrgID: orgID,
Templates: templates,
}
_, err = c.ApplyTemplate(ctx).TemplateApply(req).Execute()
if err == nil {
return nil
}
if apiErr, ok := err.(api.GenericOpenAPIError); ok {
if summary, ok := apiErr.Model().(*api.TemplateSummary); ok {
return fmt.Errorf("template failed validation:\n\t%s", summary)
}
}
return fmt.Errorf("failed to validate template: %w", err)
}