internal/seqno/seqno.go (36 lines of code) (raw):
package seqno
import (
"log/slog"
"github.com/Azure/applicationhealth-extension-linux/pkg/logging"
"github.com/Azure/azure-extension-platform/pkg/extensionerrors"
"github.com/Azure/azure-extension-platform/pkg/seqno"
)
type SequenceNumberManager interface {
// GetCurrentSequenceNumber returns the current sequence number the extension is using
GetCurrentSequenceNumber(el *slog.Logger, name, version string) (uint, error)
// GetSequenceNumber retrieves the sequence number from the MRSEQ file
GetSequenceNumber(name, version string) (uint, error)
// SetSequenceNumber sets the sequence number to the MRSEQ file.
SetSequenceNumber(name, version string, seqNo uint) error
// FindSeqNum returns the requested the sequence number from either the environment variable or
// the most recently used file under the config folder.
// Note that this is different than just choosing the highest number, which may be incorrect
FindSeqNum(configFolder string) (uint, error)
}
type SeqNumManager struct {
}
func (s *SeqNumManager) GetSequenceNumber(name string, version string) (uint, error) {
retriever := &seqno.ProdSequenceNumberRetriever{}
return retriever.GetSequenceNumber(name, version)
}
// SetSequenceNumber sets the sequence number for the given extension name and version.
// It takes the extension name, extension version, and sequence number as parameters.
// The sequence number is an integer that represents the order in which the extension was installed.
// It returns an error if there was a problem setting the sequence number.
func (s *SeqNumManager) SetSequenceNumber(name, version string, seqNo uint) error {
return seqno.SetSequenceNumber(name, version, seqNo)
}
// FindSeqNum returns the requested the sequence number from either the environment variable or
// the most recently used file under the config folder.
// Note that this is different than just choosing the highest number, which may be incorrect
func (s *SeqNumManager) FindSeqNum(configFolder string) (uint, error) {
return seqno.FindSeqNum(logging.NewNopLogger(), configFolder)
}
// GetCurrentSequenceNumber returns the current sequence number the extension is using
func (s *SeqNumManager) GetCurrentSequenceNumber(el *slog.Logger, name, version string) (sn uint, _ error) {
sequenceNumber, err := s.GetSequenceNumber(name, version)
if err == extensionerrors.ErrNotFound || err == extensionerrors.ErrNoMrseqFile {
// If we can't find the sequence number, then it's possible that the extension
// hasn't been installed yet. Go back to 0.
el.Info("Couldn't find current sequence number, likely first execution of the extension, returning sequence number 0")
return 0, nil
}
return sequenceNumber, err
}
func New() SequenceNumberManager {
return &SeqNumManager{}
}