Skip to content

Commit

Permalink
Merge pull request #28 from DataDog/isabelle.sauve/add-support-yast2-…
Browse files Browse the repository at this point in the history
…repos

Add support for yast2 repos
  • Loading branch information
ISauve authored Dec 17, 2021
2 parents 3fb3adc + 0ddf544 commit a89c0f7
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 8 deletions.
21 changes: 17 additions & 4 deletions rpm/dnf/dnf.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (

"github.com/DataDog/nikos/extract"
"github.com/DataDog/nikos/types"
"github.com/DataDog/nikos/utils"
)

var logger types.Logger
Expand Down Expand Up @@ -186,10 +187,18 @@ func hostifyRepositories(reposDir string) (string, error) {
}

for _, repoFile := range repoFiles {
destFilename := filepath.Join(tmpDir, filepath.Base(repoFile))

logger.Infof("Reading repo file '%s'", repoFile)
cfg, err := ini.Load(repoFile)
if err != nil {
logger.Warnf("Fail to read file '%s': %v", repoFile, err)
logger.Warnf("Failed to read file '%s': %v", repoFile, err)

err = utils.CopyFile(repoFile, destFilename)
if err != nil {
logger.Warnf("Failed to copy %s to tmp dir: %v", repoFile, err)
}
continue
}

sections := cfg.Sections()
Expand All @@ -205,9 +214,13 @@ func hostifyRepositories(reposDir string) (string, error) {
}
}

filename := filepath.Join(tmpDir, filepath.Base(repoFile))
if err := cfg.SaveTo(filename); err != nil {
logger.Warnf("Fail to write file '%s': %v", filename, err)
if err := cfg.SaveTo(destFilename); err != nil {
logger.Warnf("Failed to write file '%s': %v", destFilename, err)

err = utils.CopyFile(repoFile, destFilename)
if err != nil {
logger.Warnf("Failed to copy %s to tmp dir: %v", repoFile, err)
}
}
}

Expand Down
89 changes: 87 additions & 2 deletions rpm/opensuse.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@ package rpm

import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"strings"

"github.com/DataDog/nikos/rpm/dnf"
"github.com/DataDog/nikos/types"
"github.com/DataDog/nikos/utils"
"github.com/go-ini/ini"
)

type OpenSUSEBackend struct {
Expand Down Expand Up @@ -41,21 +46,101 @@ func (b *OpenSUSEBackend) GetKernelHeaders(directory string) error {
}
err := b.dnfBackend.GetKernelHeaders(pkgNevra, directory)
if err == nil {
return nil
b.logger.Infof("successfully downloaded %s", pkgNevra)

// kernel-[flavour]-devel packages require kernel-devel
return b.dnfBackend.GetKernelHeaders("kernel-devel-"+kernelRelease, directory)
}

b.logger.Infof("Error downloading package: %s. Retrying with the full set of repositories", err)
for _, repo := range disabledRepositories {
b.dnfBackend.EnableRepository(repo)
}
return b.dnfBackend.GetKernelHeaders(pkgNevra, directory)
err = b.dnfBackend.GetKernelHeaders(pkgNevra, directory)
if err == nil {
b.logger.Infof("successfully downloaded %s", pkgNevra)
return b.dnfBackend.GetKernelHeaders("kernel-devel-"+kernelRelease, directory)
}
return err
}

// On newer versions of openSUSE, the repos are type yast2 instead of type yum.
// For now, librepo only supports yum, so we need to convert the yast2 repo baseurls
// to 'yum' format. Without this, attempting to download the repomd.xml file
// results in a 404 error.
func yumifyRepositories(reposDir string, logger types.Logger) (string, error) {
tmpDir, err := ioutil.TempDir("", "yum.repos.d")
if err != nil {
return "", err
}

repoFiles, err := filepath.Glob(reposDir + "/*.repo")
if err != nil {
os.RemoveAll(tmpDir)
return "", err
}

for _, repoFile := range repoFiles {
destFilename := filepath.Join(tmpDir, filepath.Base(repoFile))

logger.Debugf("Reading repo file '%s'", repoFile)
cfg, err := ini.Load(repoFile)
if err != nil {
logger.Warnf("Failed to read file '%s': %v", repoFile, err)

err = utils.CopyFile(repoFile, destFilename)
if err != nil {
logger.Warnf("Failed to copy %s to tmp dir: %v", repoFile, err)
}
continue
}

if isYast2(cfg) {
sections := cfg.Sections()
for _, section := range sections {
if section.HasKey("baseurl") {
baseurl := section.Key("baseurl").String()
section.Key("baseurl").SetValue(baseurl + "suse/")
}
}
}

if err := cfg.SaveTo(destFilename); err != nil {
logger.Warnf("Failed to write file '%s': %v", destFilename, err)

err = utils.CopyFile(repoFile, destFilename)
if err != nil {
logger.Warnf("Failed to copy %s to tmp dir: %v", repoFile, err)
}
}
}

return tmpDir, nil
}

func isYast2(repoFile *ini.File) bool {
sections := repoFile.Sections()
for _, section := range sections {
if section.HasKey("type") {
return section.Key("type").String() == "yast2"
}
}
return false
}

func (b *OpenSUSEBackend) Close() {
b.dnfBackend.Close()
}

func NewOpenSUSEBackend(target *types.Target, reposDir string, logger types.Logger) (types.Backend, error) {
tmpReposDir, err := yumifyRepositories(reposDir, logger)
if err != nil {
logger.Warnf("Fail to convert yast2 repos to yum repos: %v", err)
} else {
reposDir = tmpReposDir
defer os.RemoveAll(tmpReposDir)
}

dnfBackend, err := dnf.NewDnfBackend(target.Distro.Release, reposDir, logger, target)
if err != nil {
return nil, fmt.Errorf("failed to create DNF backend: %w", err)
Expand Down
6 changes: 6 additions & 0 deletions tests/molecule/opensuse-container/molecule.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ platforms:
cpus: 1
provider_options:
disk_bus: '"sata"'
- name: opensuse42
box: generic/opensuse42
memory: 512
cpus: 1
provider_options:
disk_bus: '"sata"'
provisioner:
name: ansible
env:
Expand Down
10 changes: 8 additions & 2 deletions tests/molecule/opensuse-container/prepare.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,20 @@
name: docker
state: present
become: true
when: ansible_distribution == 'openSUSE Leap' and ansible_os_family == 'Suse'

- name: Install docker-py
package:
name: python3-docker
state: present
become: true
when: ansible_distribution == 'openSUSE Leap' and ansible_os_family == 'Suse'
when: ansible_distribution_major_version == '15'

- name: Install docker-py
package:
name: python-docker-py
state: present
become: true
when: ansible_distribution_major_version == '42'

- name: Start docker
service:
Expand Down
6 changes: 6 additions & 0 deletions tests/molecule/opensuse-host/molecule.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ platforms:
cpus: 1
provider_options:
disk_bus: '"sata"'
- name: opensuse42
box: generic/opensuse42
memory: 512
cpus: 1
provider_options:
disk_bus: '"sata"'
provisioner:
name: ansible
env:
Expand Down
1 change: 1 addition & 0 deletions types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ func NewTarget() (Target, error) {
}

platform = strings.Trim(platform, "\"")
version = strings.Trim(version, "\"")

target := Target{
Distro: Distro{
Expand Down
23 changes: 23 additions & 0 deletions utils/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package utils

import (
"io"
"os"
)

func CopyFile(srcPath, destPath string) error {
dest, err := os.OpenFile(destPath, os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
return err
}
defer dest.Close()

src, err := os.Open(srcPath)
if err != nil {
return err
}
defer src.Close()

_, err = io.Copy(dest, src)
return err
}

0 comments on commit a89c0f7

Please sign in to comment.