diff --git a/vmaas/common.go b/vmaas/common.go index 1f978b1..ee29b9c 100644 --- a/vmaas/common.go +++ b/vmaas/common.go @@ -3,6 +3,7 @@ package vmaas import ( "regexp" "sort" + "strconv" "strings" "sync" @@ -606,6 +607,20 @@ func getRepoIDs(c *Cache, p *ProcessedRequest, opts *options) repoIDMaps { //nol return repoIDMaps{current, newer} } +// aliasReleasever maps RHEL major <= 7 numeric releasevers to {major}Server +func aliasReleasever(releasever string) string { + // As a guard for Atoi operation + dot := strings.IndexByte(releasever, '.') + if dot <= 0 { + return releasever + } + major, err := strconv.Atoi(releasever[:dot]) + if err != nil || major > 7 { + return releasever + } + return strconv.Itoa(major) + "Server" +} + func passReleasever(c *Cache, releasever *string, repoID RepoID) bool { detail, ok := c.RepoDetails[repoID] if !ok { @@ -614,7 +629,13 @@ func passReleasever(c *Cache, releasever *string, repoID RepoID) bool { if releasever == nil { return true } - return (detail.Releasever == "" && strings.Contains(detail.URL, *releasever)) || detail.Releasever == *releasever + + rv := *releasever + aliased := aliasReleasever(rv) + if detail.Releasever == "" { + return strings.Contains(detail.URL, rv) || strings.Contains(detail.URL, aliased) + } + return detail.Releasever == rv || detail.Releasever == aliased } func passBasearch(c *Cache, basearch *string, repoID RepoID) bool { diff --git a/vmaas/common_test.go b/vmaas/common_test.go index 134d24e..de48da9 100644 --- a/vmaas/common_test.go +++ b/vmaas/common_test.go @@ -266,6 +266,58 @@ func TestGetRepoIDs(t *testing.T) { assert.False(t, hasDuplicities(res.currentReleasever)) } +// Empty releasever + URL containing "7Server" (RHEL 7 Server stream indexing). +func rhel7ELSRepo() RepoDetail { + return RepoDetail{ + RepoDetailCommon: RepoDetailCommon{ + Label: "rhel-7-server-els-rpms", Releasever: "", Organization: defaultOrg, + }, + URL: "https://example.test/els/7/7Server/x86_64/os/", + } +} + +func rhel6ServerRepo() RepoDetail { + return RepoDetail{ + RepoDetailCommon: RepoDetailCommon{ + Label: "rhel-6-server-rpms", Releasever: "", Organization: defaultOrg, + }, + URL: "https://example.test/dist/rhel/server/6/6Server/x86_64/os/", + } +} + +func TestPassReleaseverRHEL7With7Server(t *testing.T) { + c := Cache{RepoDetails: map[RepoID]RepoDetail{1: rhel7ELSRepo()}} + releasever := "7Server" + assert.True(t, passReleasever(&c, &releasever, 1)) +} + +func TestPassReleaseverRHEL7NumericAliasesToServer(t *testing.T) { + c := Cache{RepoDetails: map[RepoID]RepoDetail{1: rhel7ELSRepo()}} + for _, rv := range []string{"7.9", "7.8"} { + releasever := rv + assert.True(t, passReleasever(&c, &releasever, 1), rv) + } +} + +func TestPassReleaseverRHEL6NumericAliasesToServer(t *testing.T) { + c := Cache{RepoDetails: map[RepoID]RepoDetail{1: rhel6ServerRepo()}} + releasever := "6.9" + assert.True(t, passReleasever(&c, &releasever, 1)) +} + +func TestAliasReleaseverBareMajorUnchanged(t *testing.T) { + assert.Equal(t, "6", aliasReleasever("6")) + assert.Equal(t, "6Server", aliasReleasever("6.9")) + assert.Equal(t, "7", aliasReleasever("7")) + assert.Equal(t, "7Server", aliasReleasever("7.9")) +} + +func TestPassReleaseverRHEL8Unaffected(t *testing.T) { + c := Cache{RepoDetails: map[RepoID]RepoDetail{1: rhel7ELSRepo()}} + releasever := "8.0" + assert.False(t, passReleasever(&c, &releasever, 1)) +} + func TestFilterPkgList(t *testing.T) { pkgs := []string{} diff --git a/vmaas/vulnerabilities.go b/vmaas/vulnerabilities.go index 0491445..1c6deb5 100644 --- a/vmaas/vulnerabilities.go +++ b/vmaas/vulnerabilities.go @@ -348,8 +348,8 @@ func repos2IDs(c *Cache, r *Request) ([]RepoID, []RepoID, []ContentSetID) { if r.Basearch != nil && c.RepoDetails[repoID].Basearch != *r.Basearch { continue } - candidateReleasever := c.RepoDetails[repoID].Releasever - if r.Releasever != nil && candidateReleasever != *r.Releasever { + if r.Releasever != nil && !passReleasever(c, r.Releasever, repoID) { + candidateReleasever := c.RepoDetails[repoID].Releasever parsedRequestReleasever, err := version.NewVersion(*r.Releasever) if err != nil { continue