schema

package
v0.0.0-...-55ed90b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 11, 2024 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DiagJSONParsingFailure = iota + 1
	DiagModuleEvaluationFailure
	DiagTerragruntEvaluationFailure
	DiagTerragruntModuleEvaluationFailure
	DiagPrivateModuleDownloadFailure
	DiagPrivateRegistryModuleDownloadFailure
)

Variables

View Source
var (
	HourToMonthUnitMultiplier = decimal.NewFromInt(730)
	MonthToHourUnitMultiplier = decimal.NewFromInt(1).Div(HourToMonthUnitMultiplier)
	DaysInMonth               = HourToMonthUnitMultiplier.DivRound(decimal.NewFromInt(24), 24)
	DayToMonthUnitMultiplier  = DaysInMonth.DivRound(HourToMonthUnitMultiplier, 24)
)

Functions

func AddRawValue

func AddRawValue(r gjson.Result, key string, v interface{}) gjson.Result

func BuildResources

func BuildResources(projects []*Project, projectPtrToUsageMap map[*Project]UsageMap)

func CalculateCosts

func CalculateCosts(project *Project)

func MultiplyQuantities

func MultiplyQuantities(resource *Resource, multiplier decimal.Decimal)

func ParseAttributes

func ParseAttributes(i interface{}) map[string]gjson.Result

func SortResources

func SortResources(project *Project)

Types

type ActualCosts

type ActualCosts struct {
	ResourceID     string
	StartTimestamp time.Time
	EndTimestamp   time.Time
	CostComponents []*CostComponent
}

type AttributeFilter

type AttributeFilter struct {
	Key        string  `json:"key"`
	Value      *string `json:"value,omitempty"`
	ValueRegex *string `json:"value_regex,omitempty"`
}

type BlankCoreResource

type BlankCoreResource struct {
	Name string
	Type string
}

BlankCoreResource is a helper struct for NoPrice and Skipped resources that are evaluated as part of the Policy API. This implements the CoreResource interface and returns a skipped resource that doesn't affect the CLI output.

func (BlankCoreResource) BuildResource

func (b BlankCoreResource) BuildResource() *Resource

func (BlankCoreResource) CoreType

func (b BlankCoreResource) CoreType() string

func (BlankCoreResource) PopulateUsage

func (b BlankCoreResource) PopulateUsage(u *UsageData)

func (BlankCoreResource) UsageSchema

func (b BlankCoreResource) UsageSchema() []*UsageItem

type CloudResourceIDFunc

type CloudResourceIDFunc func(d *ResourceData) []string

CloudResourceIDFunc is used to calculate the cloud resource ids (AWS ARN, Google HREF, etc...) associated with the resource

type CoreResource

type CoreResource interface {
	CoreType() string
	UsageSchema() []*UsageItem
	PopulateUsage(u *UsageData)
	BuildResource() *Resource
}

CoreResource is the new/preferred way to represent provider-agnostic resources that support advanced features such as Infracost Cloud usage estimates and actual costs.

type CoreResourceFunc

type CoreResourceFunc func(*ResourceData) CoreResource

type CoreResourceWithUsageParams

type CoreResourceWithUsageParams interface {
	CoreResource
	UsageEstimationParams() []UsageParam
}

CoreResourceWithUsageParams is a CoreResource that sends additional parameters (e.g. Lambda memory size) to the Usage API when estimating usage.

type CostComponent

type CostComponent struct {
	Name           string
	Unit           string
	UnitMultiplier decimal.Decimal
	// UnitRounding specifies the number of decimal places that the output unit should be rounded to.
	// This should be set to 0 if using MonthToHourUnitMultiplier otherwise the unit will show with
	// redundant .000 decimal places.
	UnitRounding         *int32
	IgnoreIfMissingPrice bool
	ProductFilter        *ProductFilter
	PriceFilter          *PriceFilter
	HourlyQuantity       *decimal.Decimal
	MonthlyQuantity      *decimal.Decimal
	MonthlyDiscountPerc  float64

	HourlyCost  *decimal.Decimal
	MonthlyCost *decimal.Decimal
	// contains filtered or unexported fields
}

func (*CostComponent) CalculateCosts

func (c *CostComponent) CalculateCosts()

func (*CostComponent) CustomPrice

func (c *CostComponent) CustomPrice() *decimal.Decimal

func (*CostComponent) Price

func (c *CostComponent) Price() decimal.Decimal

func (*CostComponent) PriceHash

func (c *CostComponent) PriceHash() string

func (*CostComponent) SetCustomPrice

func (c *CostComponent) SetCustomPrice(price *decimal.Decimal)

func (*CostComponent) SetPrice

func (c *CostComponent) SetPrice(price decimal.Decimal)

func (*CostComponent) SetPriceHash

func (c *CostComponent) SetPriceHash(priceHash string)

func (*CostComponent) UnitMultiplierHourlyQuantity

func (c *CostComponent) UnitMultiplierHourlyQuantity() *decimal.Decimal

func (*CostComponent) UnitMultiplierMonthlyQuantity

func (c *CostComponent) UnitMultiplierMonthlyQuantity() *decimal.Decimal

func (*CostComponent) UnitMultiplierPrice

func (c *CostComponent) UnitMultiplierPrice() decimal.Decimal

type EstimateFunc

type EstimateFunc func(context.Context, map[string]interface{}) error

EstimateFunc queries cloud providers to gather past usage information, then projects future usage based on the results.

type PartialResource

type PartialResource struct {
	ResourceData *ResourceData

	// CoreResource is the new/preferred struct for providing an intermediate-object
	// that contains all provider-derived information, but has not yet been built into
	// a Resource.
	CoreResource CoreResource

	// Resource field is provided for backward compatibility with provider resource builders
	// that have not yet been converted to build CoreResource's
	Resource *Resource

	// CloudResourceIDs are collected during parsing in case they need to be uploaded to the
	// Cloud Usage API to be used in the usage estimate calculations.
	CloudResourceIDs []string
}

PartialResource is used to collect all information required to construct a resource that is generated by provider parser and pass it back up to top level functions that can supply additional provider-agnostic information (such as Infracost Cloud usage estimates) before the resource is built.

type Policies

type Policies []Policy

func (Policies) Len

func (r Policies) Len() int

func (Policies) Less

func (r Policies) Less(i, j int) bool

func (Policies) Swap

func (r Policies) Swap(i, j int)

type Policy

type Policy struct {
	ID                 string           `json:"id"`
	Title              string           `json:"title"`
	Description        string           `json:"description"`
	ResourceType       string           `json:"resource_type"`
	ResourceAttributes json.RawMessage  `json:"resource_attributes"`
	Address            string           `json:"address"`
	Suggested          string           `json:"suggested"`
	NoCost             bool             `json:"no_cost"`
	Cost               *decimal.Decimal `json:"cost"`
}

type PriceFilter

type PriceFilter struct {
	PurchaseOption     *string `json:"purchaseOption,omitempty"`
	Unit               *string `json:"unit,omitempty"`
	Description        *string `json:"description,omitempty"`
	DescriptionRegex   *string `json:"description_regex,omitempty"`
	StartUsageAmount   *string `json:"startUsageAmount,omitempty"`
	EndUsageAmount     *string `json:"endUsageAmount,omitempty"`
	TermLength         *string `json:"termLength,omitempty"`
	TermPurchaseOption *string `json:"termPurchaseOption,omitempty"`
	TermOfferingClass  *string `json:"termOfferingClass,omitempty"`
}

type ProductFilter

type ProductFilter struct {
	VendorName       *string            `json:"vendorName,omitempty"`
	Service          *string            `json:"service,omitempty"`
	ProductFamily    *string            `json:"productFamily,omitempty"`
	Region           *string            `json:"region,omitempty"`
	Sku              *string            `json:"sku,omitempty"`
	AttributeFilters []*AttributeFilter `json:"attributeFilters,omitempty"`
}

type Project

type Project struct {
	Name                 string
	Metadata             *ProjectMetadata
	PartialPastResources []*PartialResource
	PartialResources     []*PartialResource
	PastResources        []*Resource
	Resources            []*Resource
	Diff                 []*Resource
	HasDiff              bool
}

Project contains the existing, planned state of resources and the diff between them.

func NewProject

func NewProject(name string, metadata *ProjectMetadata) *Project

func (*Project) AddProviderMetadata

func (p *Project) AddProviderMetadata(metadatas []ProviderMetadata)

func (*Project) AllPartialResources

func (p *Project) AllPartialResources() []*PartialResource

AllPartialResources returns a pointer list of the current and past partial resources

func (*Project) AllResources

func (p *Project) AllResources() []*Resource

AllResources returns a pointer list of all resources of the state.

func (*Project) BuildResources

func (p *Project) BuildResources(usageMap UsageMap)

BuildResources builds the resources from the partial resources and sets the PastResources and Resources fields.

func (*Project) CalculateDiff

func (p *Project) CalculateDiff()

CalculateDiff calculates the diff of past and current resources

func (*Project) NameWithWorkspace

func (p *Project) NameWithWorkspace() string

NameWithWorkspace returns the proect Name appended with the paranenthized workspace name from Metadata if one exists.

type ProjectDiag

type ProjectDiag struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

ProjectDiag holds information about all diagnostics associated with a project. This can be both critical or warnings.

func (*ProjectDiag) Error

func (p *ProjectDiag) Error() string

type ProjectMetadata

type ProjectMetadata struct {
	Path                string             `json:"path"`
	Type                string             `json:"type"`
	ConfigSha           string             `json:"configSha,omitempty"`
	PolicySha           string             `json:"policySha,omitempty"`
	PastPolicySha       string             `json:"pastPolicySha,omitempty"`
	TerraformModulePath string             `json:"terraformModulePath,omitempty"`
	TerraformWorkspace  string             `json:"terraformWorkspace,omitempty"`
	VCSSubPath          string             `json:"vcsSubPath,omitempty"`
	VCSCodeChanged      *bool              `json:"vcsCodeChanged,omitempty"`
	Errors              []ProjectDiag      `json:"errors,omitempty"`
	Warnings            []ProjectDiag      `json:"warnings,omitempty"`
	Policies            Policies           `json:"policies,omitempty"`
	Providers           []ProviderMetadata `json:"providers,omitempty"`
}

func (*ProjectMetadata) AddError

func (m *ProjectMetadata) AddError(err error)

AddError pushes the provided error onto the metadata list. It does a naive conversion to ProjectDiag if the error provided is not already a diagnostic.

func (*ProjectMetadata) AddErrorWithCode

func (m *ProjectMetadata) AddErrorWithCode(err error, code int)

AddErrorWithCode is the same as AddError except adds a code to the fallback diagnostic.

func (*ProjectMetadata) HasErrors

func (m *ProjectMetadata) HasErrors() bool

func (*ProjectMetadata) WorkspaceLabel

func (m *ProjectMetadata) WorkspaceLabel() string

type Projects

type Projects []*Project

Projects is a slice of Project that is ordered alphabetically by project name.

func (Projects) Len

func (p Projects) Len() int

func (Projects) Less

func (p Projects) Less(i, j int) bool

func (Projects) Swap

func (p Projects) Swap(i, j int)

type Provider

type Provider interface {
	Type() string
	DisplayType() string
	AddMetadata(*ProjectMetadata)
	LoadResources(UsageMap) ([]*Project, error)
}

type ProviderMetadata

type ProviderMetadata struct {
	Name        string            `json:"name,omitempty"`
	DefaultTags map[string]string `json:"defaultTags,omitempty"`
	Filename    string            `json:"filename,omitempty"`
	StartLine   int64             `json:"startLine,omitempty"`
	EndLine     int64             `json:"endLine,omitempty"`
}

type ReferenceIDFunc

type ReferenceIDFunc func(d *ResourceData) []string

ReferenceIDFunc is used to let references be built using non-standard IDs (anything other than d.Get("id").string)

type RegistryItem

type RegistryItem struct {
	Name                string
	Notes               []string
	RFunc               ResourceFunc
	CoreRFunc           CoreResourceFunc
	ReferenceAttributes []string
	CustomRefIDFunc     ReferenceIDFunc
	DefaultRefIDFunc    ReferenceIDFunc
	CloudResourceIDFunc CloudResourceIDFunc
	NoPrice             bool
}

type Remediater

type Remediater interface {
	// Describe provides an English description of the remediation action X that
	// would fit into a sentence "May we X?" (e.g. "enable bucket metrics").
	// The description can be used to prompt the user before taking action.
	Describe() string

	// Remediate attempts to fix a problem in the cloud that prevents estimation,
	// e.g. by enabling metrics collection on certain resources.
	Remediate() error
}

Remediater allows correction of cloud configuration issues so that future runs of Infracost will provide more accurate results.

type Resource

type Resource struct {
	Name              string
	CostComponents    []*CostComponent
	ActualCosts       []*ActualCosts
	SubResources      []*Resource
	HourlyCost        *decimal.Decimal
	MonthlyCost       *decimal.Decimal
	IsSkipped         bool
	NoPrice           bool
	SkipMessage       string
	ResourceType      string
	Tags              *map[string]string
	UsageSchema       []*UsageItem
	EstimateUsage     EstimateFunc
	EstimationSummary map[string]bool
	Metadata          map[string]gjson.Result
}

func AllProjectResources

func AllProjectResources(projects []*Project) []*Resource

AllProjectResources returns the resources for all projects

func BuildResource

func BuildResource(partial *PartialResource, fetchedUsage *UsageData) *Resource

BuildResource create a new Resource from the CoreResource, or (for backward compatibility) returns a previously built Resource

func CalculateDiff

func CalculateDiff(past []*Resource, current []*Resource) []*Resource

CalculateDiff calculates the diff of past and current resources

func (*Resource) CalculateCosts

func (r *Resource) CalculateCosts()

func (*Resource) FlattenedSubResources

func (r *Resource) FlattenedSubResources() []*Resource

func (*Resource) RemoveCostComponent

func (r *Resource) RemoveCostComponent(costComponent *CostComponent)

type ResourceData

type ResourceData struct {
	Type          string
	ProviderName  string
	Address       string
	Tags          *map[string]string
	RawValues     gjson.Result
	ReferencesMap map[string][]*ResourceData
	CFResource    cloudformation.Resource
	UsageData     *UsageData
	Metadata      map[string]gjson.Result
}

func NewCFResourceData

func NewCFResourceData(resourceType string, providerName string, address string, tags *map[string]string, cfResource cloudformation.Resource) *ResourceData

func NewResourceData

func NewResourceData(resourceType string, providerName string, address string, tags *map[string]string, rawValues gjson.Result) *ResourceData

func (*ResourceData) AddReference

func (d *ResourceData) AddReference(key string, reference *ResourceData, reverseRefAttrs []string)

func (*ResourceData) Get

func (d *ResourceData) Get(key string) gjson.Result

func (*ResourceData) GetBoolOrDefault

func (d *ResourceData) GetBoolOrDefault(key string, def bool) bool

func (*ResourceData) GetFloat64OrDefault

func (d *ResourceData) GetFloat64OrDefault(key string, def float64) float64

GetFloat64OrDefault returns the value of key within ResourceData as a float64. If the retrieved value is not set GetFloat64OrDefault will return def.

func (*ResourceData) GetInt64OrDefault

func (d *ResourceData) GetInt64OrDefault(key string, def int64) int64

GetInt64OrDefault returns the value of key within ResourceData as an int64. If the retrieved value is not set GetInt64OrDefault will return def.

func (*ResourceData) GetStringOrDefault

func (d *ResourceData) GetStringOrDefault(key, def string) string

GetStringOrDefault returns the value of key within ResourceData as a string. If the retrieved value is not set GetStringOrDefault will return def.

func (*ResourceData) IsEmpty

func (d *ResourceData) IsEmpty(key string) bool

Return true if the key doesn't exist, is null, or is an empty string. Needed because gjson.Exists returns true as long as a key exists, even if it's empty or null.

func (*ResourceData) References

func (d *ResourceData) References(keys ...string) []*ResourceData

func (*ResourceData) Set

func (d *ResourceData) Set(key string, value interface{})

type ResourceFunc

type ResourceFunc func(*ResourceData, *UsageData) *Resource

type UsageData

type UsageData struct {
	Address    string
	Attributes map[string]gjson.Result
}

func NewUsageData

func NewUsageData(address string, attributes map[string]gjson.Result) *UsageData

func (*UsageData) CalcEstimationSummary

func (u *UsageData) CalcEstimationSummary() map[string]bool

CalcEstimationSummary returns a map where a value of true means the attribute key has an actual estimate, false means it is using the defaults

func (*UsageData) Copy

func (u *UsageData) Copy() *UsageData

Copy returns a clone of UsageData u.

func (*UsageData) Get

func (u *UsageData) Get(key string) gjson.Result

func (*UsageData) GetFloat

func (u *UsageData) GetFloat(key string) *float64

func (*UsageData) GetInt

func (u *UsageData) GetInt(key string) *int64

func (*UsageData) GetString

func (u *UsageData) GetString(key string) *string

func (*UsageData) GetStringArray

func (u *UsageData) GetStringArray(key string) *[]string

func (*UsageData) IsEmpty

func (u *UsageData) IsEmpty(key string) bool

Return true if the key doesn't exist, is null, or is an empty string. Needed because gjson.Exists returns true as long as a key exists, even if it's empty or null.

func (*UsageData) Merge

func (u *UsageData) Merge(other *UsageData) *UsageData

Merge returns a new UsageData which is the result of adding all keys from other that do not already exists in the usage data

type UsageItem

type UsageItem struct {
	Key          string
	DefaultValue interface{}
	Value        interface{}
	ValueType    UsageVariableType
	Description  string
}

type UsageMap

type UsageMap struct {
	// contains filtered or unexported fields
}

UsageMap is a map of address to UsageData built from a usage file. UsageMap is a standalone type so that we can do more involved matching functionality.

func NewUsageMap

func NewUsageMap(data map[string]*UsageData) UsageMap

NewUsageMap initialises a Usage map with the provided usage key data. It builds a set of wildcard keys if any are found and sorts them ready for searching by Attribute name at a later point.

func NewUsageMapFromInterface

func NewUsageMapFromInterface(m map[string]interface{}) UsageMap

NewUsageMapFromInterface returns an initialised UsageMap from interface map.

func (UsageMap) Data

func (usage UsageMap) Data() map[string]*UsageData

Data returns the entire map of usage data stored.

func (UsageMap) Get

func (usage UsageMap) Get(address string) *UsageData

Get returns UsageData for a given resource address, this can be a combined/merged UsageData from multiple keys. Usage data is merged adhering to the following hierarchy:

  1. Resource type defaults - e.g. aws_lambda:
  2. Wildcard specified data - e.g. aws_lambda.my_lambda[*]
  3. Exact resource data - e.g. aws_lambda.my_lambda["foo"]

Duplicate keys specified between levels are always overwritten by keys specified at a lower level, e.g:

aws_lambda.my_lambda[*]:
	monthly_requests: 700000000
	request_duration_ms: 750
aws_lambda.my_lambda["foo"]:
	request_duration_ms: 100 << this overwrites the 750 value given in the wildcard usage

If no usage key is found, Get will return nil.

type UsageParam

type UsageParam struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

type UsageVariableType

type UsageVariableType int
const (
	Int64 UsageVariableType = iota
	String
	Float64
	StringArray
	SubResourceUsage
	KeyValueMap
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL