github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/core/base/supportedbases.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package base 5 6 import ( 7 "time" 8 9 "github.com/juju/collections/set" 10 "github.com/juju/errors" 11 "github.com/juju/os/v2/series" 12 ) 13 14 // UbuntuDistroInfo is the path for the Ubuntu distro info file. 15 var UbuntuDistroInfo = series.UbuntuDistroInfo 16 17 // ControllerBases returns the supported workload bases available to it at the 18 // execution time. 19 func ControllerBases(now time.Time, requestedBase Base, imageStream string) ([]Base, error) { 20 supported, err := supportedInfoForType(UbuntuDistroInfo, now, requestedBase, imageStream) 21 if err != nil { 22 return nil, errors.Trace(err) 23 } 24 return supported.controllerBases(), nil 25 } 26 27 // WorkloadBases returns the supported workload bases available to it at the 28 // execution time. 29 func WorkloadBases(now time.Time, requestedBase Base, imageStream string) ([]Base, error) { 30 supported, err := supportedInfoForType(UbuntuDistroInfo, now, requestedBase, imageStream) 31 if err != nil { 32 return nil, errors.Trace(err) 33 } 34 return supported.workloadBases(false), nil 35 } 36 37 // AllWorkloadVersions returns all the workload versions (supported or not). 38 func AllWorkloadVersions() (set.Strings, error) { 39 supported, err := supportedInfoForType(UbuntuDistroInfo, time.Now(), Base{}, "") 40 if err != nil { 41 return nil, errors.Trace(err) 42 } 43 return set.NewStrings(supported.workloadVersions(true)...), nil 44 } 45 46 // AllWorkloadOSTypes returns all the workload os types (supported or not). 47 func AllWorkloadOSTypes() (set.Strings, error) { 48 supported, err := supportedInfoForType(UbuntuDistroInfo, time.Now(), Base{}, "") 49 if err != nil { 50 return nil, errors.Trace(err) 51 } 52 result := set.NewStrings() 53 for _, wBase := range supported.workloadBases(true) { 54 result.Add(wBase.OS) 55 } 56 return result, nil 57 } 58 59 func supportedInfoForType(path string, now time.Time, requestedBase Base, imageStream string) (*supportedInfo, error) { 60 // For non-LTS releases; they'll appear in juju/os as default available, but 61 // after reading the `/usr/share/distro-info/ubuntu.csv` on the Ubuntu distro 62 // the non-LTS should disappear if they're not in the release window for that 63 // series. 64 seriesVersionsMutex.Lock() 65 defer seriesVersionsMutex.Unlock() 66 updateSeriesVersionsOnce() 67 all := getAllSeriesVersions() 68 if !requestedBase.Empty() && imageStream == Daily { 69 setSupported(all, requestedBase) 70 } 71 source := series.NewDistroInfo(path) 72 supported := newSupportedInfo(source, all) 73 if err := supported.compile(now); err != nil { 74 return nil, errors.Trace(err) 75 } 76 77 return supported, nil 78 }