upgrade.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package upgrade
  2. import (
  3. semver "github.com/Masterminds/semver/v3"
  4. "sigs.k8s.io/yaml"
  5. )
  6. // UpgradeFile is a collection of upgrade notes between specific versions
  7. type UpgradeFile struct {
  8. UpgradeNotes []*UpgradeNote `yaml:"upgrade_notes" json:"upgrade_notes"`
  9. }
  10. // UpgradeNote is a single note for upgrading between a previous version and
  11. // a target version.
  12. type UpgradeNote struct {
  13. PreviousVersion string `yaml:"previous" json:"previous"`
  14. TargetVersion string `yaml:"target" json:"target"`
  15. Note string `yaml:"note" json:"note"`
  16. }
  17. // ParseUpgradeFileFromBytes parses the raw bytes of an upgrade file and returns an
  18. // UpgradeFile object. sigs.k8s.io/yaml parser is used.
  19. func ParseUpgradeFileFromBytes(upgradeNotes []byte) (*UpgradeFile, error) {
  20. // parse bytes into object
  21. res := &UpgradeFile{}
  22. err := yaml.Unmarshal(upgradeNotes, res)
  23. if err != nil {
  24. return nil, err
  25. }
  26. return res, err
  27. }
  28. // GetUpgradeFileBetweenVersions gets the set of upgrade notes that are applicable to an upgrade
  29. // between a previous and target version.
  30. func (u *UpgradeFile) GetUpgradeFileBetweenVersions(prev, target string) (*UpgradeFile, error) {
  31. prevVersion, err := semver.NewVersion(prev)
  32. if err != nil {
  33. return nil, err
  34. }
  35. // for each upgrade note, determine if it's geq than the previous version, leq the target
  36. // version
  37. resNotes := make([]*UpgradeNote, 0)
  38. for _, note := range u.UpgradeNotes {
  39. notePrevVersion, err := semver.NewVersion(note.PreviousVersion)
  40. if err != nil {
  41. return nil, err
  42. }
  43. noteTargetVersion, err := semver.NewVersion(note.TargetVersion)
  44. if err != nil {
  45. return nil, err
  46. }
  47. // if note(prev) <= prev and note(next) >= prev, render the note
  48. if comp := notePrevVersion.Compare(prevVersion); comp != -1 {
  49. if comp := noteTargetVersion.Compare(prevVersion); comp != -1 {
  50. resNotes = append(resNotes, note)
  51. }
  52. }
  53. }
  54. return &UpgradeFile{
  55. UpgradeNotes: resNotes,
  56. }, nil
  57. }