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  }