Repository: osbuild/osbuild-composer
Pull request #3418 (2023-05-02 14:35:21)

cloudapi: custom repos add missing fields
Some fields set in the blueprints and through the service were being ignored. This PR adds the changes to fix this.

- add missing custom repository filename validation
- change repo gpgcheck variable name and `json` serialization field to match image-builder. This ensures that the json tag is the same as the `payload_repository` and makes things more consistent
- set the value for `priority` in cloudapi

<!--
Thanks for proposing a change to osbuild-composer!

Please don't remove the above check list. These are things that each pull
request must have before it is merged. It helps maintainers to not forget
anything.

If the reason for ticking any of the boxes is ambiguous, please add a short
note explaining why.

In addition, if this pull request fixes a downstream issue, please refer to
test/README.md and add these additional items:

- [ ] 1st commit of any `rhbz#` related PR contains bug reproducer; CI reports FAIL or
- [ ] PR contains automated tests for new functionality and
- [ ] QE has approved reproducer/new tests and
- [ ] Subsequent commits provide bug fixes without modifying the reproducer; CI reports PASS and
- [ ] QE approves this PR; RHBZ status is set to `MODIFIED + Verified=Tested`

Information regarding our GitLab pipeline (Schutzbot):

CI will not be ran automatically if WIP label is applied or the PR is in DRAFT state, instead only
a link will be provided to the pipeline which can then be triggered manually if desired. To run the
CI automatically either switch the PR to ready or apply WIP+test label.

Outside contributors need manual approval from one of the osbuild-composer maintainers.

Schutzbot will only be triggered if all Tests jobs in GitHub workflow succeed.
-->


achilleas-k: There's a tricky situation here now.  If we merge this, it'll get released tomorrow, which will mean that we will have an option in osbuild-composer that isn't supported by osbuild yet, and can potentially create manifests that fail the schema validation.  If we release composer as it is now, we will have a blueprint option that's ignored, which isn't as bad.
kingsleyzissou: > There's a tricky situation here now. If we merge this, it'll get released tomorrow, which will mean that we will have an option in osbuild-composer that isn't supported by osbuild yet, and can potentially create manifests that fail the schema validation. If we release composer as it is now, we will have a blueprint option that's ignored, which isn't as bad.

Oh good point. I could split this PR out and keep the first two commits? Or just leave it for after the release.
achilleas-k: > > There's a tricky situation here now. If we merge this, it'll get released tomorrow, which will mean that we will have an option in osbuild-composer that isn't supported by osbuild yet, and can potentially create manifests that fail the schema validation. If we release composer as it is now, we will have a blueprint option that's ignored, which isn't as bad.
> 
> Oh good point. I could split this PR out and keep the first two commits? Or just leave it for after the release.

Yeah, splitting would be good to get the validation in and the names fixed.
kingsleyzissou: Rebased because #3420. Hopefully CI will go green now

Patch:
diff --git a/internal/blueprint/repository_customizations.go b/internal/blueprint/repository_customizations.go
index 652aca82d..43d61abc5 100644
--- a/internal/blueprint/repository_customizations.go
+++ b/internal/blueprint/repository_customizations.go
@@ -3,6 +3,7 @@ package blueprint
 import (
 	"fmt"
 	"net/url"
+	"regexp"
 	"strings"
 
 	"github.com/osbuild/osbuild-composer/internal/fsnode"
@@ -24,11 +25,18 @@ type RepositoryCustomization struct {
 	Filename     string   `json:"filename,omitempty" toml:"filename,omitempty"`
 }
 
+const repoFilenameRegex = "^[\\w.-]{1,250}\\.repo$"
+
 func validateCustomRepository(repo *RepositoryCustomization) error {
 	if repo.Id == "" {
 		return fmt.Errorf("Repository ID is required")
 	}
 
+	filenameRegex := regexp.MustCompile(repoFilenameRegex)
+	if !filenameRegex.MatchString(repo.getFilename()) {
+		return fmt.Errorf("Repository filename %q is invalid", repo.getFilename())
+	}
+
 	if len(repo.BaseURLs) == 0 && repo.Mirrorlist == "" && repo.Metalink == "" {
 		return fmt.Errorf("Repository base URL, mirrorlist or metalink is required")
 	}
@@ -60,6 +68,9 @@ func (rc *RepositoryCustomization) getFilename() string {
 	if rc.Filename == "" {
 		return fmt.Sprintf("%s.repo", rc.Id)
 	}
+	if !strings.HasSuffix(rc.Filename, ".repo") {
+		return fmt.Sprintf("%s.repo", rc.Filename)
+	}
 	return rc.Filename
 }
 
diff --git a/internal/cloudapi/v2/handler.go b/internal/cloudapi/v2/handler.go
index be1bf6a9a..dac7a3709 100644
--- a/internal/cloudapi/v2/handler.go
+++ b/internal/cloudapi/v2/handler.go
@@ -353,8 +353,8 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
 				repoCustomization.GPGCheck = repo.CheckGpg
 			}
 
-			if repo.RepoCheckGpg != nil {
-				repoCustomization.RepoGPGCheck = repo.RepoCheckGpg
+			if repo.CheckRepoGpg != nil {
+				repoCustomization.RepoGPGCheck = repo.CheckRepoGpg
 			}
 
 			if repo.Enabled != nil {
@@ -373,6 +373,10 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
 				repoCustomization.SSLVerify = *repo.SslVerify
 			}
 
+			if repo.Priority != nil {
+				repoCustomization.Priority = repo.Priority
+			}
+
 			repoCustomizations = append(repoCustomizations, repoCustomization)
 		}
 		if bp.Customizations == nil {
diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go
index 437b49a9a..e4ba4f005 100644
--- a/internal/cloudapi/v2/openapi.v2.gen.go
+++ b/internal/cloudapi/v2/openapi.v2.gen.go
@@ -297,6 +297,7 @@ type ContainerUploadStatus struct {
 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"`
@@ -304,7 +305,7 @@ type CustomRepository struct {
 	Metalink     *string   `json:"metalink,omitempty"`
 	Mirrorlist   *string   `json:"mirrorlist,omitempty"`
 	Name         *string   `json:"name,omitempty"`
-	RepoCheckGpg *bool     `json:"repo_check_gpg,omitempty"`
+	Priority     *int      `json:"priority,omitempty"`
 	SslVerify    *bool     `json:"ssl_verify,omitempty"`
 }
 
@@ -876,132 +877,132 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
 // Base64 encoded, gzipped, json marshaled Swagger object
 var swaggerSpec = []string{
 
-	"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",
-	"cL59//8BAAD//wGZi7xIegAA",
+	"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",
+	"S9Ew++B8/f7/BwAA///MrvtUZnoAAA==",
 }
 
 // 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 5755a3dd0..40a77e0d1 100644
--- a/internal/cloudapi/v2/openapi.v2.yml
+++ b/internal/cloudapi/v2/openapi.v2.yml
@@ -855,10 +855,12 @@ components:
             type: string
         check_gpg:
           type: boolean
-        repo_check_gpg:
+        check_repo_gpg:
           type: boolean
         ssl_verify:
           type: boolean
+        priority:
+          type: integer
     UploadOptions:
       anyOf:
       - $ref: '#/components/schemas/AWSEC2UploadOptions'


Test patch:
diff --git a/internal/blueprint/repository_customizations_test.go b/internal/blueprint/repository_customizations_test.go
index 1c59f8c6e..acd3c634c 100644
--- a/internal/blueprint/repository_customizations_test.go
+++ b/internal/blueprint/repository_customizations_test.go
@@ -79,6 +79,19 @@ func TestGetCustomRepositories(t *testing.T) {
 			},
 			wantErr: fmt.Errorf("Repository gpg key is not a valid URL or a valid gpg key"),
 		},
+		{
+			name: "Test invalid repository filename error",
+			expectedCustomizations: Customizations{
+				Repositories: []RepositoryCustomization{
+					{
+						Id:       "example-1",
+						BaseURLs: []string{"http://example-1.com"},
+						Filename: "!nval!d",
+					},
+				},
+			},
+			wantErr: fmt.Errorf("Repository filename %q is invalid", "!nval!d.repo"),
+		},
 	}
 
 	for _, tt := range testCases {
@@ -126,6 +139,15 @@ func TestCustomRepoFilename(t *testing.T) {
 			},
 			WantFilename: "test.repo",
 		},
+		{
+			Name: "Test custom filename without extension",
+			Repo: RepositoryCustomization{
+				Id:       "example-1",
+				BaseURLs: []string{"http://example-1.com"},
+				Filename: "test",
+			},
+			WantFilename: "test.repo",
+		},
 	}
 
 	for _, tt := range testCases {