Documentation ¶
Overview ¶
Package resolve is a heart of Aptomi that performs policy resolution, taking policy and consumption claims as input, producing a set of components to be instantiated in the cloud (desired state) as output, along with their discovery parameters, code parameters, and component instance graph.
Index ¶
- Constants
- Variables
- type ClaimResolution
- type ComponentInstance
- func (instance *ComponentInstance) GetDeployName() string
- func (instance *ComponentInstance) GetKey() string
- func (instance *ComponentInstance) GetName() string
- func (instance *ComponentInstance) GetNamespace() string
- func (instance *ComponentInstance) GetRunningTime() time.Duration
- func (instance *ComponentInstance) UpdateTimes(createdAt time.Time, updatedAt time.Time)
- type ComponentInstanceKey
- func (cik ComponentInstanceKey) GetDeployName() string
- func (cik ComponentInstanceKey) GetKey() string
- func (cik *ComponentInstanceKey) GetParentBundleKey() *ComponentInstanceKey
- func (cik *ComponentInstanceKey) IsBundle() bool
- func (cik *ComponentInstanceKey) IsComponent() bool
- func (cik *ComponentInstanceKey) MakeCopy() *ComponentInstanceKey
- type ComponentInstanceMetadata
- type PolicyResolution
- func (resolution *PolicyResolution) AppendData(ops *PolicyResolution)
- func (resolution *PolicyResolution) GetClaimResolution(claim *lang.Claim) *ClaimResolution
- func (resolution *PolicyResolution) GetComponentInstanceEntry(cik *ComponentInstanceKey) *ComponentInstance
- func (resolution *PolicyResolution) RecordCodeParams(cik *ComponentInstanceKey, codeParams util.NestedParameterMap) error
- func (resolution *PolicyResolution) RecordDiscoveryParams(cik *ComponentInstanceKey, discoveryParams util.NestedParameterMap) error
- func (resolution *PolicyResolution) RecordLabels(cik *ComponentInstanceKey, labels *lang.LabelSet)
- func (resolution *PolicyResolution) RecordResolved(cik *ComponentInstanceKey, claim *lang.Claim, depth int, ...)
- func (resolution *PolicyResolution) StoreEdge(src *ComponentInstanceKey, dst *ComponentInstanceKey)
- func (resolution *PolicyResolution) Validate(policy *lang.Policy) error
- type PolicyResolver
Constants ¶
const AllowIngres = "allow_ingress"
AllowIngres is an special key, which is used in DataForPlugins to indicate whether ingress traffic should be allowed for a given component instance
Variables ¶
var ComponentInstanceObject = &runtime.Info{ Kind: "component-instance", Storable: true, Versioned: false, Constructor: func() runtime.Object { return &ComponentInstance{} }, }
ComponentInstanceObject is an informational data structure with Kind and Constructor for component instance object
var MaxConcurrentGoRoutines = sysruntime.NumCPU()
MaxConcurrentGoRoutines is the number of concurrently running goroutines for policy evaluation and processing. We don't necessarily want to run a lot of them due to CPU/memory constraints and due to the fact that there is minimal io wait time in policy processing (goroutines are mostly busy doing calculations as opposed to waiting).
Functions ¶
This section is empty.
Types ¶
type ClaimResolution ¶ added in v0.1.15
type ClaimResolution struct { // Resolved indicates whether or not claim has been resolved. If it has been resolved, // then ComponentInstanceKey will contain where it got resolved. Otherwise, you can filter event log by this // claim and find out the associated events leading to an error. Resolved bool // ComponentInstanceKey holds the reference to component instance, to which claim got resolved ComponentInstanceKey string }
ClaimResolution contains resolution status for a given claim
type ComponentInstance ¶
type ComponentInstance struct { runtime.TypeKind `yaml:",inline"` // Metadata is an object metadata for component instance Metadata *ComponentInstanceMetadata // Error means that a critical error happened with a component (e.g. conflict of parameters) Error error // ClaimKeys is a list of claim keys which are keeping this component instantiated (if claim resolves to this component directly, then the value is 0. otherwise it's depth in policy resolution) ClaimKeys map[string]int // IsCode means the component is code IsCode bool // CalculatedLabels is a set of calculated labels for the component, aggregated over all uses CalculatedLabels *lang.LabelSet // CalculatedDiscovery is a set of calculated discovery parameters for the component (non-conflicting over all uses of this component) CalculatedDiscovery util.NestedParameterMap // CalculatedCodeParams is a set of calculated code parameters for the component (non-conflicting over all uses of this component) CalculatedCodeParams util.NestedParameterMap // DataForPlugins is an additional data recorded for use in plugins DataForPlugins map[string]string // EdgesOut is a set of outgoing graph edges ('key' -> true) from this component instance. Only makes sense as a part of desired state EdgesOut map[string]bool // CreatedAt is when this component instance was created CreatedAt time.Time // UpdatedAt is the last time when this component instance was updated UpdatedAt time.Time // EndpointsUpToDate is true if endpoints are up to date and false otherwise EndpointsUpToDate bool // Endpoints represents all URLs that could be used to access deployed bundle Endpoints map[string]string }
ComponentInstance is an instance of a particular code component within a bundle, which indicate that this component has to be instantiated and configured in a certain cluster. Policy resolver produces a map of component instances and their parameters in desired state (PolicyResolution) as result of policy resolution.
When a bundle gets instantiated, a special "root" component instance gets created with component name set to Metadata.Key.ComponentName == componentRootName. Then all "child" component instances get created, one per bundle component with type code.
Every ComponentInstance contains full information about for a given component instance - who is consuming this instance, labels, code params, discovery params, in & out graph edges (what component instances we depend on, what component instances depend on us), creation/update times, and endpoints retrieved from the underlying cloud.
func (*ComponentInstance) GetDeployName ¶
func (instance *ComponentInstance) GetDeployName() string
GetDeployName returns a string that could be used as name for deployment inside the cluster
func (*ComponentInstance) GetKey ¶
func (instance *ComponentInstance) GetKey() string
GetKey returns an object key. It's a component instance key, as generated by the engine
func (*ComponentInstance) GetName ¶
func (instance *ComponentInstance) GetName() string
GetName returns object name
func (*ComponentInstance) GetNamespace ¶
func (instance *ComponentInstance) GetNamespace() string
GetNamespace returns an object namespace. It's a system namespace for all component instances
func (*ComponentInstance) GetRunningTime ¶
func (instance *ComponentInstance) GetRunningTime() time.Duration
GetRunningTime returns the total lifetime of a component instance (since it was launched till now)
func (*ComponentInstance) UpdateTimes ¶
func (instance *ComponentInstance) UpdateTimes(createdAt time.Time, updatedAt time.Time)
UpdateTimes updates component creation and update times
type ComponentInstanceKey ¶
type ComponentInstanceKey struct { // required fields ClusterNameSpace string // mandatory ClusterName string // mandatory TargetSuffix string // mandatory Namespace string // determined from the service ServiceName string // mandatory ContextName string // mandatory KeysResolved string // mandatory ContextNameWithKeys string // calculated BundleName string // determined from the context (included into key for readability) ComponentName string // component name // contains filtered or unexported fields }
ComponentInstanceKey is a key for component instance. During policy resolution every component instance gets assigned a unique string key. It's important to form those keys correctly, so that we can make actual comparison of actual state (components with their keys) and desired state (components with their keys).
Currently, component keys are formed from multiple parameters as follows. Cluster gets included as a part of the key (components running on different clusters must have different keys). Namespace gets included as a part of the key (components from different namespaces must have different keys). Service, Context (with allocation keys), Bundle get included as a part of the key (Bundle must be within the same namespace as Service). ComponentName gets included as a part of the key. For bundle-level component instances, ComponentName is set to componentRootName, while for all component instances within a bundle an actual Component.Name is used.
func NewComponentInstanceKey ¶
func NewComponentInstanceKey(cluster *lang.Cluster, targetSuffix string, service *lang.Service, context *lang.Context, allocationKeysResolved []string, bundle *lang.Bundle, component *lang.BundleComponent) *ComponentInstanceKey
NewComponentInstanceKey creates a new ComponentInstanceKey
func (ComponentInstanceKey) GetDeployName ¶
func (cik ComponentInstanceKey) GetDeployName() string
GetDeployName returns a string that could be used as name for deployment inside the cluster
func (ComponentInstanceKey) GetKey ¶
func (cik ComponentInstanceKey) GetKey() string
GetKey returns a string key
func (*ComponentInstanceKey) GetParentBundleKey ¶ added in v0.1.15
func (cik *ComponentInstanceKey) GetParentBundleKey() *ComponentInstanceKey
GetParentBundleKey returns a key for the parent bundle, replacing componentName with componentRootName
func (*ComponentInstanceKey) IsBundle ¶ added in v0.1.15
func (cik *ComponentInstanceKey) IsBundle() bool
IsBundle returns 'true' if it's a bundle instance key and we can't go up anymore. And it will return 'false' if it's a component instance key
func (*ComponentInstanceKey) IsComponent ¶
func (cik *ComponentInstanceKey) IsComponent() bool
IsComponent returns 'true' if it's a component instance key and we can go up to the corresponding bundle. And it will return 'false' if it's a bundle instance key
func (*ComponentInstanceKey) MakeCopy ¶
func (cik *ComponentInstanceKey) MakeCopy() *ComponentInstanceKey
MakeCopy creates a copy of ComponentInstanceKey
type ComponentInstanceMetadata ¶
type ComponentInstanceMetadata struct {
Key *ComponentInstanceKey
}
ComponentInstanceMetadata is object metadata for ComponentInstance
type PolicyResolution ¶
type PolicyResolution struct { // Resolved component instances: componentKey -> componentInstance ComponentInstanceMap map[string]*ComponentInstance }
PolicyResolution contains resolution data for the policy. It essentially represents the desired state calculated by policy resolver. It contains a calculated map of component instances with their data, with information about resolved claims.
func NewPolicyResolution ¶
func NewPolicyResolution() *PolicyResolution
NewPolicyResolution creates new empty PolicyResolution, given a flag indicating whether it's a desired state (generated by a resolver), or actual state (loaded from the store)
func (*PolicyResolution) AppendData ¶
func (resolution *PolicyResolution) AppendData(ops *PolicyResolution)
AppendData appends data to the current PolicyResolution record by aggregating data over component instances. If there is a conflict (e.g. components have different code parameters), then the corresponding component instances will be marked with errors.
func (*PolicyResolution) GetClaimResolution ¶ added in v0.1.15
func (resolution *PolicyResolution) GetClaimResolution(claim *lang.Claim) *ClaimResolution
GetClaimResolution returns resolution status for a particular claim
func (*PolicyResolution) GetComponentInstanceEntry ¶
func (resolution *PolicyResolution) GetComponentInstanceEntry(cik *ComponentInstanceKey) *ComponentInstance
GetComponentInstanceEntry retrieves a component instance entry by key, or creates an new entry if it doesn't exist
func (*PolicyResolution) RecordCodeParams ¶
func (resolution *PolicyResolution) RecordCodeParams(cik *ComponentInstanceKey, codeParams util.NestedParameterMap) error
RecordCodeParams stores calculated code params for component instance
func (*PolicyResolution) RecordDiscoveryParams ¶
func (resolution *PolicyResolution) RecordDiscoveryParams(cik *ComponentInstanceKey, discoveryParams util.NestedParameterMap) error
RecordDiscoveryParams stores calculated discovery params for component instance
func (*PolicyResolution) RecordLabels ¶
func (resolution *PolicyResolution) RecordLabels(cik *ComponentInstanceKey, labels *lang.LabelSet)
RecordLabels stores calculated labels for component instance
func (*PolicyResolution) RecordResolved ¶
func (resolution *PolicyResolution) RecordResolved(cik *ComponentInstanceKey, claim *lang.Claim, depth int, ruleResult *lang.RuleActionResult)
RecordResolved takes a component instance and adds a new claim record into it
func (*PolicyResolution) StoreEdge ¶
func (resolution *PolicyResolution) StoreEdge(src *ComponentInstanceKey, dst *ComponentInstanceKey)
StoreEdge stores incoming/outgoing graph edges for component instance for observability and reporting
func (*PolicyResolution) Validate ¶ added in v0.1.2
func (resolution *PolicyResolution) Validate(policy *lang.Policy) error
Validate checks that the state is valid, meaning that all objects references are valid and all components are valid
- it takes all the instances and verifies that all bundles exist, all clusters exist, etc
- it also verifies that there are no components with global errors (e.g. conflicting code/discovery params)
type PolicyResolver ¶
type PolicyResolver struct {
// contains filtered or unexported fields
}
PolicyResolver is a core of Aptomi for policy resolution and translating all claims into a single PolicyResolution object which represents desired state of components running in a cloud.
func NewPolicyResolver ¶
func NewPolicyResolver(policy *lang.Policy, externalData *external.Data, eventLog *event.Log) *PolicyResolver
NewPolicyResolver creates a new policy resolver. You must call policy.Validate() before calling this method, to ensure that the policy is valid.
func (*PolicyResolver) ResolveAllClaims ¶ added in v0.1.15
func (resolver *PolicyResolver) ResolveAllClaims() *PolicyResolution
ResolveAllClaims takes policy as input and calculates PolicyResolution (desired state) as output.
The method resolves all recorded claims for consuming services ("instantiate <service> with <labels>"), calculating which components have to be allocated and with which parameters. Once PolicyResolution (desired state) is calculated, it can be rendered by the engine diff/apply by deploying and configuring required components in the cloud.
As a result, status of every claim will be stored in resolution state.