diff --git a/internal/blueprint/blueprint.go b/internal/blueprint/blueprint.go index df997c499..7b588eda5 100644 --- a/internal/blueprint/blueprint.go +++ b/internal/blueprint/blueprint.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/osbuild/images/pkg/crypt" + "github.com/osbuild/osbuild-composer/internal/common" "github.com/coreos/go-semver/semver" iblueprint "github.com/osbuild/images/pkg/blueprint" @@ -371,6 +372,41 @@ func Convert(bp Blueprint) iblueprint.Blueprint { } customizations.RPM = &irpm } + if rhsm := c.RHSM; rhsm != nil && rhsm.Config != nil { + irhsm := iblueprint.RHSMCustomization{ + Config: &iblueprint.RHSMConfig{}, + } + + if plugins := rhsm.Config.DNFPlugins; plugins != nil { + irhsm.Config.DNFPlugins = &iblueprint.SubManDNFPluginsConfig{} + if plugins.ProductID != nil && plugins.ProductID.Enabled != nil { + irhsm.Config.DNFPlugins.ProductID = &iblueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*plugins.ProductID.Enabled), + } + } + if plugins.SubscriptionManager != nil && plugins.SubscriptionManager.Enabled != nil { + irhsm.Config.DNFPlugins.SubscriptionManager = &iblueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*plugins.SubscriptionManager.Enabled), + } + } + } + + if subManConf := rhsm.Config.SubscriptionManager; subManConf != nil { + irhsm.Config.SubscriptionManager = &iblueprint.SubManConfig{} + if subManConf.RHSMConfig != nil && subManConf.RHSMConfig.ManageRepos != nil { + irhsm.Config.SubscriptionManager.RHSMConfig = &iblueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(*subManConf.RHSMConfig.ManageRepos), + } + } + if subManConf.RHSMCertdConfig != nil && subManConf.RHSMCertdConfig.AutoRegistration != nil { + irhsm.Config.SubscriptionManager.RHSMCertdConfig = &iblueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(*subManConf.RHSMCertdConfig.AutoRegistration), + } + } + } + + customizations.RHSM = &irhsm + } } ibp := iblueprint.Blueprint{ diff --git a/internal/blueprint/blueprint_convert_test.go b/internal/blueprint/blueprint_convert_test.go index 81ea93762..39a725d3b 100644 --- a/internal/blueprint/blueprint_convert_test.go +++ b/internal/blueprint/blueprint_convert_test.go @@ -179,6 +179,26 @@ func TestConvert(t *testing.T) { Files: []string{"/root/gpg-key"}, }, }, + RHSM: &RHSMCustomization{ + Config: &RHSMConfig{ + DNFPlugins: &SubManDNFPluginsConfig{ + ProductID: &DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &SubManConfig{ + RHSMConfig: &SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + RHSMCertdConfig: &SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, }, Distro: "distro", }, @@ -339,6 +359,26 @@ func TestConvert(t *testing.T) { Files: []string{"/root/gpg-key"}, }, }, + RHSM: &iblueprint.RHSMCustomization{ + Config: &iblueprint.RHSMConfig{ + DNFPlugins: &iblueprint.SubManDNFPluginsConfig{ + ProductID: &iblueprint.DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &iblueprint.DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &iblueprint.SubManConfig{ + RHSMConfig: &iblueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + RHSMCertdConfig: &iblueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, }, Distro: "distro", }, diff --git a/internal/blueprint/customizations.go b/internal/blueprint/customizations.go index 7b73f3614..75638ba5d 100644 --- a/internal/blueprint/customizations.go +++ b/internal/blueprint/customizations.go @@ -30,6 +30,7 @@ type Customizations struct { FIPS *bool `json:"fips,omitempty" toml:"fips,omitempty"` Installer *InstallerCustomization `json:"installer,omitempty" toml:"installer,omitempty"` RPM *RPMCustomization `json:"rpm,omitempty" toml:"rpm,omitempty"` + RHSM *RHSMCustomization `json:"rhsm,omitempty" toml:"rhsm,omitempty"` } type IgnitionCustomization struct { diff --git a/internal/blueprint/rhsm_customizations.go b/internal/blueprint/rhsm_customizations.go new file mode 100644 index 000000000..627458ae4 --- /dev/null +++ b/internal/blueprint/rhsm_customizations.go @@ -0,0 +1,35 @@ +package blueprint + +// Subscription Manager [rhsm] configuration +type SubManRHSMConfig struct { + ManageRepos *bool `json:"manage_repos,omitempty" toml:"manage_repos,omitempty"` +} + +// Subscription Manager [rhsmcertd] configuration +type SubManRHSMCertdConfig struct { + AutoRegistration *bool `json:"auto_registration,omitempty" toml:"auto_registration,omitempty"` +} + +// Subscription Manager 'rhsm.conf' configuration +type SubManConfig struct { + RHSMConfig *SubManRHSMConfig `json:"rhsm,omitempty" toml:"rhsm,omitempty"` + RHSMCertdConfig *SubManRHSMCertdConfig `json:"rhsmcertd,omitempty" toml:"rhsmcertd,omitempty"` +} + +type DNFPluginConfig struct { + Enabled *bool `json:"enabled,omitempty" toml:"enabled,omitempty"` +} + +type SubManDNFPluginsConfig struct { + ProductID *DNFPluginConfig `json:"product_id,omitempty" toml:"product_id,omitempty"` + SubscriptionManager *DNFPluginConfig `json:"subscription_manager,omitempty" toml:"subscription_manager,omitempty"` +} + +type RHSMConfig struct { + DNFPlugins *SubManDNFPluginsConfig `json:"dnf_plugins,omitempty" toml:"dnf_plugins,omitempty"` + SubscriptionManager *SubManConfig `json:"subscription_manager,omitempty" toml:"subscription_manager,omitempty"` +} + +type RHSMCustomization struct { + Config *RHSMConfig `json:"config,omitempty" toml:"config,omitempty"` +} diff --git a/internal/cloudapi/v2/compose.go b/internal/cloudapi/v2/compose.go index 18007b415..2ff88c180 100644 --- a/internal/cloudapi/v2/compose.go +++ b/internal/cloudapi/v2/compose.go @@ -14,6 +14,7 @@ import ( "github.com/osbuild/images/pkg/reporegistry" "github.com/osbuild/images/pkg/rhsm/facts" "github.com/osbuild/osbuild-composer/internal/blueprint" + "github.com/osbuild/osbuild-composer/internal/common" "github.com/osbuild/osbuild-composer/internal/target" ) @@ -440,6 +441,43 @@ func (request *ComposeRequest) GetCustomizationsFromBlueprintRequest() (*bluepri } } + if rhsm := rbpc.Rhsm; rhsm != nil && rhsm.Config != nil { + bpRhsm := &blueprint.RHSMCustomization{ + Config: &blueprint.RHSMConfig{}, + } + + conf := rhsm.Config + if conf.DnfPlugins != nil { + bpRhsm.Config.DNFPlugins = &blueprint.SubManDNFPluginsConfig{} + if conf.DnfPlugins.ProductId != nil && conf.DnfPlugins.ProductId.Enabled != nil { + bpRhsm.Config.DNFPlugins.ProductID = &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*conf.DnfPlugins.ProductId.Enabled), + } + } + if conf.DnfPlugins.SubscriptionManager != nil && conf.DnfPlugins.SubscriptionManager.Enabled != nil { + bpRhsm.Config.DNFPlugins.SubscriptionManager = &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*conf.DnfPlugins.SubscriptionManager.Enabled), + } + } + } + + if conf.SubscriptionManager != nil { + bpRhsm.Config.SubscriptionManager = &blueprint.SubManConfig{} + if conf.SubscriptionManager.Rhsm != nil && conf.SubscriptionManager.Rhsm.ManageRepos != nil { + bpRhsm.Config.SubscriptionManager.RHSMConfig = &blueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(*conf.SubscriptionManager.Rhsm.ManageRepos), + } + } + if conf.SubscriptionManager.Rhsmcertd != nil && conf.SubscriptionManager.Rhsmcertd.AutoRegistration != nil { + bpRhsm.Config.SubscriptionManager.RHSMCertdConfig = &blueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(*conf.SubscriptionManager.Rhsmcertd.AutoRegistration), + } + } + } + + c.RHSM = bpRhsm + } + return c, nil } @@ -928,6 +966,43 @@ func (request *ComposeRequest) GetBlueprintFromCustomizations() (blueprint.Bluep } } + if rhsm := request.Customizations.Rhsm; rhsm != nil && rhsm.Config != nil { + bpRhsm := &blueprint.RHSMCustomization{ + Config: &blueprint.RHSMConfig{}, + } + + conf := rhsm.Config + if conf.DnfPlugins != nil { + bpRhsm.Config.DNFPlugins = &blueprint.SubManDNFPluginsConfig{} + if conf.DnfPlugins.ProductId != nil && conf.DnfPlugins.ProductId.Enabled != nil { + bpRhsm.Config.DNFPlugins.ProductID = &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*conf.DnfPlugins.ProductId.Enabled), + } + } + if conf.DnfPlugins.SubscriptionManager != nil && conf.DnfPlugins.SubscriptionManager.Enabled != nil { + bpRhsm.Config.DNFPlugins.SubscriptionManager = &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(*conf.DnfPlugins.SubscriptionManager.Enabled), + } + } + } + + if conf.SubscriptionManager != nil { + bpRhsm.Config.SubscriptionManager = &blueprint.SubManConfig{} + if conf.SubscriptionManager.Rhsm != nil && conf.SubscriptionManager.Rhsm.ManageRepos != nil { + bpRhsm.Config.SubscriptionManager.RHSMConfig = &blueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(*conf.SubscriptionManager.Rhsm.ManageRepos), + } + } + if conf.SubscriptionManager.Rhsmcertd != nil && conf.SubscriptionManager.Rhsmcertd.AutoRegistration != nil { + bpRhsm.Config.SubscriptionManager.RHSMCertdConfig = &blueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(*conf.SubscriptionManager.Rhsmcertd.AutoRegistration), + } + } + } + + bp.Customizations.RHSM = bpRhsm + } + // Did bp.Customizations get set at all? If not, set it back to nil if reflect.DeepEqual(*bp.Customizations, blueprint.Customizations{}) { bp.Customizations = nil diff --git a/internal/cloudapi/v2/compose_test.go b/internal/cloudapi/v2/compose_test.go index 8199a7229..6ed6e96af 100644 --- a/internal/cloudapi/v2/compose_test.go +++ b/internal/cloudapi/v2/compose_test.go @@ -142,6 +142,26 @@ func GetTestBlueprint() blueprint.Blueprint { }, }, }, + RHSM: &blueprint.RHSMCustomization{ + Config: &blueprint.RHSMConfig{ + DNFPlugins: &blueprint.SubManDNFPluginsConfig{ + ProductID: &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &blueprint.SubManConfig{ + RHSMConfig: &blueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + RHSMCertdConfig: &blueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, } return expected @@ -273,6 +293,26 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { }, }, }, + Rhsm: &RHSMCustomization{ + Config: &RHSMConfig{ + DnfPlugins: &SubManDNFPluginsConfig{ + ProductId: &DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &SubManConfig{ + Rhsm: &SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + Rhsmcertd: &SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, }} bp, err = cr.GetBlueprintFromCustomizations() @@ -427,6 +467,26 @@ func TestGetBlueprintFromCompose(t *testing.T) { }, }, }, + Rhsm: &RHSMCustomization{ + Config: &RHSMConfig{ + DnfPlugins: &SubManDNFPluginsConfig{ + ProductId: &DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &SubManConfig{ + Rhsm: &SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + Rhsmcertd: &SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, }, }} diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index f6711b657..9bc16727e 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -289,6 +289,7 @@ type BlueprintCustomizations struct { // Repositories to write to /etc/yum.repos.d/ in the final image. Note // that these are not used at build time. Repositories *[]BlueprintRepository `json:"repositories,omitempty"` + Rhsm *RHSMCustomization `json:"rhsm,omitempty"` Rpm *RPMCustomization `json:"rpm,omitempty"` Services *Services `json:"services,omitempty"` @@ -585,10 +586,11 @@ type Customizations struct { // for the OS itself (they will not be available for the build root or // any other part of the build process). The package_sets field for these // repositories is ignored. - PayloadRepositories *[]Repository `json:"payload_repositories,omitempty"` - Rpm *RPMCustomization `json:"rpm,omitempty"` - Services *Services `json:"services,omitempty"` - Subscription *Subscription `json:"subscription,omitempty"` + PayloadRepositories *[]Repository `json:"payload_repositories,omitempty"` + Rhsm *RHSMCustomization `json:"rhsm,omitempty"` + Rpm *RPMCustomization `json:"rpm,omitempty"` + Services *Services `json:"services,omitempty"` + Subscription *Subscription `json:"subscription,omitempty"` // Timezone configuration Timezone *Timezone `json:"timezone,omitempty"` @@ -601,6 +603,11 @@ type Customizations struct { // even when there are one or more mountpoints. type CustomizationsPartitioningMode string +// DNFPluginConfig defines model for DNFPluginConfig. +type DNFPluginConfig struct { + Enabled *bool `json:"enabled,omitempty"` +} + // A custom directory to create in the final artifact. type Directory struct { // Ensure that the parent directories exist @@ -975,6 +982,17 @@ type PulpOSTreeUploadStatus struct { RepoUrl string `json:"repo_url"` } +// RHSMConfig defines model for RHSMConfig. +type RHSMConfig struct { + DnfPlugins *SubManDNFPluginsConfig `json:"dnf_plugins,omitempty"` + SubscriptionManager *SubManConfig `json:"subscription_manager,omitempty"` +} + +// RHSMCustomization defines model for RHSMCustomization. +type RHSMCustomization struct { + Config *RHSMConfig `json:"config,omitempty"` +} + // RPMCustomization defines model for RPMCustomization. type RPMCustomization struct { ImportKeys *ImportKeys `json:"import_keys,omitempty"` @@ -1029,6 +1047,28 @@ type Services struct { Masked *[]string `json:"masked,omitempty"` } +// SubManConfig defines model for SubManConfig. +type SubManConfig struct { + Rhsm *SubManRHSMConfig `json:"rhsm,omitempty"` + Rhsmcertd *SubManRHSMCertdConfig `json:"rhsmcertd,omitempty"` +} + +// SubManDNFPluginsConfig defines model for SubManDNFPluginsConfig. +type SubManDNFPluginsConfig struct { + ProductId *DNFPluginConfig `json:"product_id,omitempty"` + SubscriptionManager *DNFPluginConfig `json:"subscription_manager,omitempty"` +} + +// SubManRHSMCertdConfig defines model for SubManRHSMCertdConfig. +type SubManRHSMCertdConfig struct { + AutoRegistration *bool `json:"auto_registration,omitempty"` +} + +// SubManRHSMConfig defines model for SubManRHSMConfig. +type SubManRHSMConfig struct { + ManageRepos *bool `json:"manage_repos,omitempty"` +} + // Subscription defines model for Subscription. type Subscription struct { ActivationKey string `json:"activation_key"` @@ -1375,179 +1415,182 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "fOsTvj27Pji4PGi3WvVjfHSETnd85h6f7oYP/Pbi8rJafmpYzy55e2oet3zFQ+2TSfO4PRl1+uRg0jk5", + "vqVn7RZvHxw8tVuTo/apc9Q+rrdabWd0O+v96eqpVdo9eAocb9ptPT+duq/Tc7dPSp+GO+83w4fx4LRa", + "PvpaG3V2r48Prsrk4vOng/uKH467n772wm7t8YId1PzaSeiJ4Pzu6Oz8QviNo8M+qbCT988t2qtMg72n", + "TvOidWhfttvX09fWK6eP983dp/uw/ak0IK+sh+6qF3fX7eH0pr2787jXbODrhz7xG91PA357ONltVy+Y", + "Z7cu65eHIZ0+V7pYnMDn+vntxYP41DuClTrmT92T9us73b15aj7Uzq5HjXKfOF8fnWb1qjTwq0fv3d1e", + "s/Z4dDioeOPXescbvzmdr+fIqVTePz+9+eyp+3x21h6O34efvKvuTvjmnPbJ61vprDz1nqsXeHDCdk5a", + "ren13v0jaz13J93L8pH12mtOjtrkbdQ9DKdf/cfJw/jq4HN41HloXqPaU59c4vvK8Oyqye3dw4AfvzUu", + "P322ySW57X46Za+9m/PDmv/IvJZNjnqu/fTQfH0eBY/u4ZTXSnt76LpP3FGZXZBp+fVqMoLhsITvm9fW", + "zufx5ej14u7yzGnc7z2cT8/Cx0fxPvlMXi+vGo93xwdfz+v8mfqXl30yFIPeaeVTYzq4eyy1auODAXy7", + "e6yK3fv3q1frHY26z0cYXlztXZROrbN2565ye9zcaVYP7ZZ3dLxn98mo6tzip+5tC8Kz8tlZ6/10fDe6", + "O7u4cM6rT7dP+PTqYVoVtbPp8ZAz6Dcm3fbj9dC9QZ3pxUHv+axPxiy48m4GaMh7e43d3rB6cNUJnfdn", + "1m48vB12z0fPzp1beTgZdzu3pD19H91Od47uq19vAvzY2JMyyr3pfH5m59Q6r51fdPdK+P3stnfnidfL", + "1h998sfNsLfbJ+p0Obo6XHX0LCllQxl64dzLPqR/VTRb/+bDSk/pz3oDIlnZI9PrIuFFjg1d/kP5mxNa", + "EeRSoeFAmVyJaHFVVaRPfg9wgDxM0MfMCiML8cJRCUm6ZRWdn+tiTnuRwRIn8oZpx+Y5te3s6kxVsmXb", + "8R1WFI1gXneAoXApw+/IVvbMYu7qRo81tLqPWIyuT+v3zd36kc0P7slUDGqDyfjOcU69W2/w9NnbJZXy", + "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", + "//9Cpq87zb8AAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/cloudapi/v2/openapi.v2.yml b/internal/cloudapi/v2/openapi.v2.yml index afafc34a9..9999a0c36 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -1036,6 +1036,47 @@ components: properties: import_keys: $ref: '#/components/schemas/ImportKeys' + DNFPluginConfig: + type: object + properties: + enabled: + type: boolean + SubManDNFPluginsConfig: + type: object + properties: + product_id: + $ref: '#/components/schemas/DNFPluginConfig' + subscription_manager: + $ref: '#/components/schemas/DNFPluginConfig' + SubManRHSMConfig: + type: object + properties: + manage_repos: + type: boolean + SubManRHSMCertdConfig: + type: object + properties: + auto_registration: + type: boolean + SubManConfig: + type: object + properties: + rhsm: + $ref: '#/components/schemas/SubManRHSMConfig' + rhsmcertd: + $ref: '#/components/schemas/SubManRHSMCertdConfig' + RHSMConfig: + type: object + properties: + dnf_plugins: + $ref: '#/components/schemas/SubManDNFPluginsConfig' + subscription_manager: + $ref: '#/components/schemas/SubManConfig' + RHSMCustomization: + type: object + properties: + config: + $ref: '#/components/schemas/RHSMConfig' UploadTarget: type: object required: @@ -1368,6 +1409,8 @@ components: $ref: '#/components/schemas/Installer' rpm: $ref: '#/components/schemas/RPMCustomization' + rhsm: + $ref: '#/components/schemas/RHSMCustomization' SSHKey: type: object additionalProperties: false @@ -1514,6 +1557,8 @@ components: $ref: '#/components/schemas/Installer' rpm: $ref: '#/components/schemas/RPMCustomization' + rhsm: + $ref: '#/components/schemas/RHSMCustomization' Container: type: object required: diff --git a/internal/weldr/api_test.go b/internal/weldr/api_test.go index 74c0d2adc..2239fc5ec 100644 --- a/internal/weldr/api_test.go +++ b/internal/weldr/api_test.go @@ -556,6 +556,26 @@ func TestBlueprintsCustomizationInfoToml(t *testing.T) { "/root/gpg-key" ] } + }, + "rhsm": { + "config": { + "dnf_plugins": { + "product_id": { + "enabled": true + }, + "subscription_manager": { + "enabled": false + } + }, + "subscription_manager": { + "rhsm": { + "manage_repos": true + }, + "rhsmcertd": { + "auto_registration": false + } + } + } } } }` @@ -657,6 +677,26 @@ func TestBlueprintsCustomizationInfoToml(t *testing.T) { Files: []string{"/root/gpg-key"}, }, }, + RHSM: &blueprint.RHSMCustomization{ + Config: &blueprint.RHSMConfig{ + DNFPlugins: &blueprint.SubManDNFPluginsConfig{ + ProductID: &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(true), + }, + SubscriptionManager: &blueprint.DNFPluginConfig{ + Enabled: common.ToPtr(false), + }, + }, + SubscriptionManager: &blueprint.SubManConfig{ + RHSMConfig: &blueprint.SubManRHSMConfig{ + ManageRepos: common.ToPtr(true), + }, + RHSMCertdConfig: &blueprint.SubManRHSMCertdConfig{ + AutoRegistration: common.ToPtr(false), + }, + }, + }, + }, }, } diff --git a/test/cases/api.sh b/test/cases/api.sh index f0e1116ce..83c72b5be 100755 --- a/test/cases/api.sh +++ b/test/cases/api.sh @@ -456,6 +456,32 @@ EOF ) export RPM_CUSTOMIZATION_BLOCK +RHSM_CUSTOMIZATION_BLOCK=$(cat <