internal/tracker/artifacts.go (86 lines of code) (raw):
package tracker
import (
"fmt"
"io/fs"
"os"
"path"
"github.com/pkg/errors"
"sigs.k8s.io/yaml"
"github.com/aws/eks-hybrid/internal/artifact"
"github.com/aws/eks-hybrid/internal/util"
)
const trackerFile = "/opt/nodeadm/tracker"
type Tracker struct {
Artifacts *InstalledArtifacts
}
type InstalledArtifacts struct {
Containerd string
CniPlugins bool
IamAuthenticator bool
IamRolesAnywhere bool
ImageCredentialProvider bool
Kubectl bool
Kubelet bool
Ssm bool
Iptables bool
}
// Add adds a components as installed to the tracker
func (tracker *Tracker) Add(componentName string) error {
switch componentName {
case artifact.CniPlugins:
tracker.Artifacts.CniPlugins = true
case artifact.IamAuthenticator:
tracker.Artifacts.IamAuthenticator = true
case artifact.IamRolesAnywhere:
tracker.Artifacts.IamRolesAnywhere = true
case artifact.ImageCredentialProvider:
tracker.Artifacts.ImageCredentialProvider = true
case artifact.Kubectl:
tracker.Artifacts.Kubectl = true
case artifact.Kubelet:
tracker.Artifacts.Kubelet = true
case artifact.Ssm:
tracker.Artifacts.Ssm = true
case artifact.Iptables:
tracker.Artifacts.Iptables = true
default:
return fmt.Errorf("invalid artifact to track")
}
return nil
}
func (tracker *Tracker) MarkContainerd(source string) {
tracker.Artifacts.Containerd = source
}
// Save() saves the tracker to file
func (tracker *Tracker) Save() error {
data, err := yaml.Marshal(tracker)
if err != nil {
return err
}
return util.WriteFileWithDir(trackerFile, data, 0o644)
}
func Clear() error {
return os.RemoveAll(path.Dir(trackerFile))
}
// GetInstalledArtifacts reads the tracker file and returns the current
// installed artifacts
func GetInstalledArtifacts() (*Tracker, error) {
yamlFileData, err := os.ReadFile(trackerFile)
if err != nil {
return nil, err
}
var artifacts Tracker
err = yaml.Unmarshal(yamlFileData, &artifacts)
if err != nil {
return nil, errors.Wrap(err, "invalid yaml data in tracker")
}
return &artifacts, nil
}
// GetCurrentState reads the tracker file and returns current state
// If tracker file does not exist, it creates a new tracker
func GetCurrentState() (*Tracker, error) {
tracker, err := GetInstalledArtifacts()
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return &Tracker{
Artifacts: &InstalledArtifacts{},
}, nil
}
return nil, err
}
return tracker, nil
}