cloudbuild/pkg/distros/opensuse_tumbleweed.go

86 lines
2.9 KiB
Go

package distros
import (
"errors"
"fmt"
"github.com/rs/zerolog/log"
"libguestfs.org/guestfs"
"git.csclub.uwaterloo.ca/cloud/cloudbuild/pkg/config"
)
type OpensuseTumbleweedTemplateManager struct {
TemplateManager
}
func NewOpensuseTumbleweedTemplateManager(cfg *config.Config) *OpensuseTumbleweedTemplateManager {
logger := log.With().Str("distro", "opensuse-tumbleweed").Logger()
opensuseTumbleweedTemplateManager := OpensuseTumbleweedTemplateManager{
TemplateManager{
cfg: cfg,
logger: &logger,
impl: nil,
},
}
opensuseTumbleweedTemplateManager.TemplateManager.impl = &opensuseTumbleweedTemplateManager
return &opensuseTumbleweedTemplateManager
}
func (mgr *OpensuseTumbleweedTemplateManager) GetLatestVersion() (version string, codename string, err error) {
err = errors.New("rolling release")
return
}
func (mgr *OpensuseTumbleweedTemplateManager) DownloadTemplate(version, codename string) (path string, err error) {
return mgr.DownloadTemplateGeneric(
"openSUSE-Tumbleweed-Minimal-VM.x86_64-Cloud.qcow2",
"https://download.opensuse.org/tumbleweed/appliances/openSUSE-Tumbleweed-Minimal-VM.x86_64-Cloud.qcow2",
)
}
func (mgr *OpensuseTumbleweedTemplateManager) InstallNetworkManager(handle *guestfs.Guestfs) error {
args := []string{"zypper", "--non-interactive", "install", "NetworkManager"}
_, err := mgr.logAndRunCommand(handle, args)
if err != nil {
return fmt.Errorf("Could not install NetworkManager: %w", err)
}
// Make sure dhcp-client is installed because we use it as the
// DHCP backend
dhclientIsPresent, err := handle.Is_file("/sbin/dhclient", nil)
if err != nil {
return fmt.Errorf("Could not determine if /sbin/dhclient is a file: %w", err)
}
if !dhclientIsPresent {
return errors.New("dhclient is not present")
}
// Workaround for bug in cloud-init which prevents the NetworkManager
// backend from being selected if NetworkManager.conf does not exist
// https://github.com/canonical/cloud-init/blob/23.1.x/cloudinit/net/network_manager.py#L381
const cfgFilePath = "/etc/NetworkManager/NetworkManager.conf"
mgr.logger.Debug().Msg("Creating " + cfgFilePath)
return handle.Touch(cfgFilePath)
}
func (mgr *OpensuseTumbleweedTemplateManager) removeWelcomeMessage(handle *guestfs.Guestfs) error {
// Says "Have a lot of fun..."
mgr.logger.Debug().Msg("Removing /usr/lib/motd.d/welcome")
return handle.Rm_f("/usr/lib/motd.d/welcome")
}
func (mgr *OpensuseTumbleweedTemplateManager) CommandToUpdatePackageCache() []string {
return []string{"sudo", "zypper", "refresh", "--force"}
}
func (mgr *OpensuseTumbleweedTemplateManager) PerformDistroSpecificModifications(handle *guestfs.Guestfs) error {
// Newer Tumbleweed images shouldn't be using wickedd anymore
wickeddExists, err := handle.Is_file("/lib/systemd/system/wickedd.service", nil)
if err != nil {
return err
}
if wickeddExists {
return errors.New("wickedd.service was unexpectedly found")
}
return mgr.removeWelcomeMessage(handle)
}