cloudapi: Add module_hotfixes flag

Allow passing module_hotfixes flag through the cloudapi.
This will enable depsolving on repositories that might be affected by modularity filtering.

Refs HMS-3202
This commit is contained in:
Ondrej Ezr 2023-12-01 16:55:14 +01:00 committed by Tomáš Hozza
parent 61e6f75281
commit 4b3b942dde
10 changed files with 281 additions and 246 deletions

View file

@ -20,17 +20,18 @@ import (
)
type repository struct {
Id string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
BaseURL string `json:"baseurl,omitempty"`
Metalink string `json:"metalink,omitempty"`
MirrorList string `json:"mirrorlist,omitempty"`
GPGKey string `json:"gpgkey,omitempty"`
CheckGPG bool `json:"check_gpg,omitempty"`
CheckRepoGPG bool `json:"repo_check_gpg,omitempty"`
IgnoreSSL bool `json:"ignore_ssl,omitempty"`
PackageSets []string `json:"package_sets,omitempty"`
RHSM bool `json:"rhsm,omitempty"`
Id string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
BaseURL string `json:"baseurl,omitempty"`
Metalink string `json:"metalink,omitempty"`
MirrorList string `json:"mirrorlist,omitempty"`
GPGKey string `json:"gpgkey,omitempty"`
CheckGPG bool `json:"check_gpg,omitempty"`
CheckRepoGPG bool `json:"repo_check_gpg,omitempty"`
IgnoreSSL bool `json:"ignore_ssl,omitempty"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
PackageSets []string `json:"package_sets,omitempty"`
RHSM bool `json:"rhsm,omitempty"`
}
type ostreeOptions struct {
@ -159,17 +160,18 @@ func main() {
}
checkGPG := repo.CheckGPG
repos[i] = rpmmd.RepoConfig{
Id: repoId,
Name: repoName,
BaseURLs: urls,
Metalink: repo.Metalink,
MirrorList: repo.MirrorList,
GPGKeys: keys,
CheckGPG: &checkGPG,
CheckRepoGPG: common.ToPtr(false),
IgnoreSSL: common.ToPtr(false),
PackageSets: repo.PackageSets,
RHSM: repo.RHSM,
Id: repoId,
Name: repoName,
BaseURLs: urls,
Metalink: repo.Metalink,
MirrorList: repo.MirrorList,
GPGKeys: keys,
CheckGPG: &checkGPG,
CheckRepoGPG: common.ToPtr(false),
IgnoreSSL: common.ToPtr(false),
ModuleHotfixes: repo.ModuleHotfixes,
PackageSets: repo.PackageSets,
RHSM: repo.RHSM,
}
}

View file

@ -251,6 +251,10 @@ func (request *ComposeRequest) GetBlueprintWithCustomizations() (blueprint.Bluep
repoCustomization.Priority = repo.Priority
}
if repo.ModuleHotfixes != nil {
repoCustomization.ModuleHotfixes = repo.ModuleHotfixes
}
repoCustomizations = append(repoCustomizations, repoCustomization)
}
bp.Customizations.Repositories = repoCustomizations

View file

@ -86,10 +86,11 @@ func TestGetBlueprintWithCustomizations(t *testing.T) {
Openscap: &OpenSCAP{ProfileId: "B 263-59"},
CustomRepositories: &[]CustomRepository{
CustomRepository{
Id: "custom repo",
Metalink: common.ToPtr("http://example.org/metalink"),
CheckGpg: common.ToPtr(true),
Enabled: common.ToPtr(true),
Id: "custom repo",
Metalink: common.ToPtr("http://example.org/metalink"),
CheckGpg: common.ToPtr(true),
Enabled: common.ToPtr(true),
ModuleHotfixes: common.ToPtr(true),
},
},
Firewall: &FirewallCustomization{
@ -188,10 +189,11 @@ func TestGetBlueprintWithCustomizations(t *testing.T) {
},
Repositories: []blueprint.RepositoryCustomization{
blueprint.RepositoryCustomization{
Id: "custom repo",
Metalink: "http://example.org/metalink",
Enabled: common.ToPtr(true),
GPGCheck: common.ToPtr(true),
Id: "custom repo",
Metalink: "http://example.org/metalink",
Enabled: common.ToPtr(true),
GPGCheck: common.ToPtr(true),
ModuleHotfixes: common.ToPtr(true),
},
},
Firewall: &blueprint.FirewallCustomization{
@ -249,20 +251,22 @@ func TestGetPayloadRepositories(t *testing.T) {
cr = ComposeRequest{Customizations: &Customizations{
PayloadRepositories: &[]Repository{
Repository{
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
ModuleHotfixes: common.ToPtr(true),
},
},
}}
expected := []Repository{
Repository{
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
ModuleHotfixes: common.ToPtr(true),
},
}
repos = cr.GetPayloadRepositories()

View file

@ -1051,6 +1051,9 @@ func genRepoConfig(repo Repository) (*rpmmd.RepoConfig, error) {
if repo.CheckRepoGpg != nil {
repoConfig.CheckRepoGPG = repo.CheckRepoGpg
}
if repo.ModuleHotfixes != nil {
repoConfig.ModuleHotfixes = repo.ModuleHotfixes
}
if repoConfig.CheckGPG != nil && *repoConfig.CheckGPG && len(repoConfig.GPGKeys) == 0 {
return nil, HTTPError(ErrorNoGPGKey)

View file

@ -318,18 +318,19 @@ type ContainerUploadStatus struct {
// CustomRepository defines model for CustomRepository.
type CustomRepository struct {
Baseurl *[]string `json:"baseurl,omitempty"`
CheckGpg *bool `json:"check_gpg,omitempty"`
CheckRepoGpg *bool `json:"check_repo_gpg,omitempty"`
Enabled *bool `json:"enabled,omitempty"`
Filename *string `json:"filename,omitempty"`
Gpgkey *[]string `json:"gpgkey,omitempty"`
Id string `json:"id"`
Metalink *string `json:"metalink,omitempty"`
Mirrorlist *string `json:"mirrorlist,omitempty"`
Name *string `json:"name,omitempty"`
Priority *int `json:"priority,omitempty"`
SslVerify *bool `json:"ssl_verify,omitempty"`
Baseurl *[]string `json:"baseurl,omitempty"`
CheckGpg *bool `json:"check_gpg,omitempty"`
CheckRepoGpg *bool `json:"check_repo_gpg,omitempty"`
Enabled *bool `json:"enabled,omitempty"`
Filename *string `json:"filename,omitempty"`
Gpgkey *[]string `json:"gpgkey,omitempty"`
Id string `json:"id"`
Metalink *string `json:"metalink,omitempty"`
Mirrorlist *string `json:"mirrorlist,omitempty"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
Name *string `json:"name,omitempty"`
Priority *int `json:"priority,omitempty"`
SslVerify *bool `json:"ssl_verify,omitempty"`
}
// Customizations defines model for Customizations.
@ -739,6 +740,9 @@ type Repository struct {
Metalink *string `json:"metalink,omitempty"`
Mirrorlist *string `json:"mirrorlist,omitempty"`
// Disables modularity filtering for this repository.
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
// Naming package sets for a repository assigns it to a specific part
// (pipeline) of the build process.
PackageSets *[]string `json:"package_sets,omitempty"`
@ -1097,158 +1101,158 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"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",
"AAA=",
"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",
}
// GetSwagger returns the content of the embedded swagger specification file

View file

@ -866,6 +866,11 @@ components:
Enables gpg verification of the repository metadata
ignore_ssl:
type: boolean
module_hotfixes:
type: boolean
default: false
description: |
Disables modularity filtering for this repository.
package_sets:
type: array
example: ["build", "os"]
@ -913,6 +918,8 @@ components:
type: boolean
priority:
type: integer
module_hotfixes:
type: boolean
OpenSCAP:
type: object
required:

View file

@ -282,6 +282,10 @@ func (s *Solver) reposFromRPMMD(rpmRepos []rpmmd.RepoConfig) ([]repoConfig, erro
dr.IgnoreSSL = *rr.IgnoreSSL
}
if rr.ModuleHotfixes != nil {
dr.ModuleHotfixes = rr.ModuleHotfixes
}
if rr.RHSM {
if s.subscriptions == nil {
return nil, fmt.Errorf("This system does not have any valid subscriptions. Subscribe it before specifying rhsm: true in sources.")
@ -315,6 +319,7 @@ type repoConfig struct {
SSLClientKey string `json:"sslclientkey,omitempty"`
SSLClientCert string `json:"sslclientcert,omitempty"`
MetadataExpire string `json:"metadata_expire,omitempty"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
// set the repo hass from `rpmmd.RepoConfig.Hash()` function
// rather than re-calculating it
repoHash string

View file

@ -59,16 +59,17 @@ type imageBuildV0 struct {
}
type sourceV0 struct {
Name string `json:"name"`
Type string `json:"type"`
URL string `json:"url"`
CheckGPG bool `json:"check_gpg"`
CheckSSL bool `json:"check_ssl"`
System bool `json:"system"`
Distros []string `json:"distros"`
RHSM bool `json:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg"`
GPGKeys []string `json:"gpgkeys"`
Name string `json:"name"`
Type string `json:"type"`
URL string `json:"url"`
CheckGPG bool `json:"check_gpg"`
CheckSSL bool `json:"check_ssl"`
System bool `json:"system"`
Distros []string `json:"distros"`
RHSM bool `json:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg"`
GPGKeys []string `json:"gpgkeys"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
}
type sourcesV0 map[string]sourceV0

View file

@ -57,16 +57,17 @@ type Store struct {
}
type SourceConfig struct {
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Distros []string `json:"distros" toml:"distros"`
RHSM bool `json:"rhsm" toml:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg" toml:"check_repogpg"`
GPGKeys []string `json:"gpgkeys"`
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Distros []string `json:"distros" toml:"distros"`
RHSM bool `json:"rhsm" toml:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg" toml:"check_repogpg"`
GPGKeys []string `json:"gpgkeys"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
}
type NotFoundError struct {
@ -583,10 +584,11 @@ func (s *Store) GetAllDistroSources(distro string) map[string]SourceConfig {
func NewSourceConfig(repo rpmmd.RepoConfig, system bool) SourceConfig {
sc := SourceConfig{
Name: repo.Name,
System: system,
RHSM: repo.RHSM,
GPGKeys: repo.GPGKeys,
Name: repo.Name,
System: system,
RHSM: repo.RHSM,
GPGKeys: repo.GPGKeys,
ModuleHotfixes: repo.ModuleHotfixes,
}
if repo.CheckGPG != nil {
@ -628,6 +630,7 @@ func (s *SourceConfig) RepoConfig(name string) rpmmd.RepoConfig {
repo.RHSM = s.RHSM
repo.CheckRepoGPG = common.ToPtr(s.CheckRepoGPG)
repo.GPGKeys = s.GPGKeys
repo.ModuleHotfixes = s.ModuleHotfixes
var urls []string
if s.URL != "" {

View file

@ -136,14 +136,15 @@ func NewSourceConfigV0(s store.SourceConfig) SourceConfigV0 {
// SourceConfigV0 holds the source repository information
type SourceConfigV0 struct {
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Proxy string `json:"proxy,omitempty" toml:"proxy,omitempty"`
GPGKeys []string `json:"gpgkeys,omitempty" toml:"gpgkeys,omitempty"`
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Proxy string `json:"proxy,omitempty" toml:"proxy,omitempty"`
GPGKeys []string `json:"gpgkeys,omitempty" toml:"gpgkeys,omitempty"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty"`
}
// Key return the key, .Name in this case
@ -201,18 +202,19 @@ func NewSourceConfigV1(id string, s store.SourceConfig) SourceConfigV1 {
// SourceConfigV1 holds the source repository information
type SourceConfigV1 struct {
ID string `json:"id" toml:"id"`
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Proxy string `json:"proxy,omitempty" toml:"proxy,omitempty"`
GPGKeys []string `json:"gpgkeys,omitempty" toml:"gpgkeys,omitempty"`
Distros []string `json:"distros,omitempty" toml:"distros,omitempty"`
RHSM bool `json:"rhsm" toml:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg" toml:"check_repogpg"`
ID string `json:"id" toml:"id"`
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
URL string `json:"url" toml:"url"`
CheckGPG bool `json:"check_gpg" toml:"check_gpg"`
CheckSSL bool `json:"check_ssl" toml:"check_ssl"`
System bool `json:"system" toml:"system"`
Proxy string `json:"proxy,omitempty" toml:"proxy,omitempty"`
GPGKeys []string `json:"gpgkeys,omitempty" toml:"gpgkeys,omitempty"`
Distros []string `json:"distros,omitempty" toml:"distros,omitempty"`
RHSM bool `json:"rhsm" toml:"rhsm"`
CheckRepoGPG bool `json:"check_repogpg" toml:"check_repogpg"`
ModuleHotfixes *bool `json:"module_hotfixes,omitempty" toml:"module_hotfixes,omitempty"`
}
// Key returns the key, .ID in this case