agent/sdkutil/stoppolicy.go (51 lines of code) (raw):
// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may not
// use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing
// permissions and limitations under the License.
// Package sdkutil provides utilities used to call awssdk.
package sdkutil
import (
"fmt"
"sync"
)
// StopPolicy specifies the execution policy on data points like errors, duration
type StopPolicy struct {
Name string
errorCount int
MaximumErrorThreshold int
SyncObject *sync.Mutex
}
// NewStopPolicy creates an object of StopPolicy
func NewStopPolicy(name string, errorThreshold int) *StopPolicy {
s := new(StopPolicy)
s.Name = name
s.errorCount = 0
s.MaximumErrorThreshold = errorThreshold
s.SyncObject = new(sync.Mutex)
return s
}
// ProcessException sets provides a default implementation when errors occur
func (s *StopPolicy) ProcessException(err error) {
s.AddErrorCount(1)
}
// IsHealthy returns true if the policy determines the handler is safe to call otherwise false.
func (s *StopPolicy) IsHealthy() (healthy bool) {
s.SyncObject.Lock()
defer s.SyncObject.Unlock()
if s.MaximumErrorThreshold == 0 {
return true
}
// now if either of policy allows we allow the agent to proceed
return (0 < s.MaximumErrorThreshold && s.errorCount < s.MaximumErrorThreshold)
}
// HasError returns true if the policy contains error
func (s *StopPolicy) HasError() bool {
s.SyncObject.Lock()
defer s.SyncObject.Unlock()
return s.errorCount > 0
}
// AddErrorCount increments the error count by the set amount
func (s *StopPolicy) AddErrorCount(x int) {
s.SyncObject.Lock()
defer s.SyncObject.Unlock()
s.errorCount += x
}
// ResetErrorCount resets the error count, typically on successful operation
func (s *StopPolicy) ResetErrorCount() {
s.SyncObject.Lock()
defer s.SyncObject.Unlock()
s.errorCount = 0
}
// String returns the string representation of the stop policy
func (s *StopPolicy) String() string {
s.SyncObject.Lock()
defer s.SyncObject.Unlock()
return fmt.Sprintf("{Name: %v; errorCount: %v; MaximumErrorThreshold: %v}",
s.Name, s.errorCount, s.MaximumErrorThreshold)
}