Skip to content
This repository was archived by the owner on May 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions apis/mpas/v1alpha1/repository_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ type RepositorySpec struct {
//+required
Owner string `json:"owner"`
//+required
RepositoryName string `json:"repositoryName"`
//+required
Credentials Credentials `json:"credentials"`

//+optional
Expand Down Expand Up @@ -101,10 +99,10 @@ func (in Repository) GetRequeueAfter() time.Duration {
func (in Repository) GetRepositoryURL() string {
if in.Spec.Domain != "" {
if strings.Contains(in.Spec.Domain, "@") {
return fmt.Sprintf("%s:%s/%s", in.Spec.Domain, in.Spec.Owner, in.Spec.RepositoryName)
return fmt.Sprintf("%s:%s/%s", in.Spec.Domain, in.Spec.Owner, in.GetName())
}

return fmt.Sprintf("%s/%s/%s", in.Spec.Domain, in.Spec.Owner, in.Spec.RepositoryName)
return fmt.Sprintf("%s/%s/%s", in.Spec.Domain, in.Spec.Owner, in.GetName())
}

domain := ""
Expand All @@ -118,7 +116,7 @@ func (in Repository) GetRepositoryURL() string {
domain = "gitea.com"
}

return fmt.Sprintf("https://%s/%s/%s", domain, in.Spec.Owner, in.Spec.RepositoryName)
return fmt.Sprintf("https://%s/%s/%s", domain, in.Spec.Owner, in.GetName())
}

//+kubebuilder:object:root=true
Expand Down
3 changes: 0 additions & 3 deletions config/crd/bases/mpas.ocm.software_repositories.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,6 @@ spec:
type: string
provider:
type: string
repositoryName:
type: string
visibility:
default: private
enum:
Expand All @@ -107,7 +105,6 @@ spec:
- isOrganization
- owner
- provider
- repositoryName
type: object
status:
description: RepositoryStatus defines the observed state of Repository
Expand Down
10 changes: 4 additions & 6 deletions controllers/delivery/sync_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@ func TestSyncReconciler(t *testing.T) {
Namespace: "default",
},
Spec: mpasv1alpha1.RepositorySpec{
Provider: "github",
Owner: "Skarlso",
RepositoryName: "test",
Provider: "github",
Owner: "Skarlso",
Credentials: mpasv1alpha1.Credentials{
SecretRef: v1.LocalObjectReference{
Name: secret.Name,
Expand Down Expand Up @@ -178,9 +177,8 @@ func TestSyncReconcilerWithAutomaticPullRequest(t *testing.T) {
Namespace: "default",
},
Spec: mpasv1alpha1.RepositorySpec{
Provider: "github",
Owner: "Skarlso",
RepositoryName: "test",
Provider: "github",
Owner: "Skarlso",
Credentials: mpasv1alpha1.Credentials{
SecretRef: v1.LocalObjectReference{
Name: secret.Name,
Expand Down
5 changes: 2 additions & 3 deletions controllers/mpas/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ var (
Namespace: "default",
},
Spec: mpasv1alpha1.RepositorySpec{
Provider: "github",
Owner: "e2e-tester",
RepositoryName: "test-repository",
Provider: "github",
Owner: "e2e-tester",
Credentials: mpasv1alpha1.Credentials{
SecretRef: corev1.LocalObjectReference{
Name: "repository-creds",
Expand Down
8 changes: 4 additions & 4 deletions pkg/providers/gitea/gitea.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func (c *Client) CreateRepository(ctx context.Context, obj mpasv1alpha1.Reposito
}

if _, _, err := client.CreateRepo(gitea.CreateRepoOption{
Name: obj.Spec.RepositoryName,
Name: obj.GetName(),
Description: "Created by git-controller",
Private: private,
AutoInit: true,
Expand Down Expand Up @@ -127,15 +127,15 @@ func (f *fileCommitter) commitFile(client *gitea.Client, obj mpasv1alpha1.Reposi
return
}

_, _, err := client.CreateFile(obj.Spec.Owner, obj.Spec.RepositoryName, path, gitea.CreateFileOptions{
_, _, err := client.CreateFile(obj.Spec.Owner, obj.GetName(), path, gitea.CreateFileOptions{
FileOptions: gitea.FileOptions{
Message: fmt.Sprintf("Adding '%s' file.", path),
BranchName: obj.Spec.DefaultBranch,
},
Content: content,
})
if err != nil {
if _, derr := client.DeleteRepo(obj.Spec.Owner, obj.Spec.RepositoryName); derr != nil {
if _, derr := client.DeleteRepo(obj.Spec.Owner, obj.GetName()); derr != nil {
err = errors.Join(err, derr)
}

Expand Down Expand Up @@ -193,7 +193,7 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
description = sync.Spec.PullRequestTemplate.Description
}

if _, _, err := client.CreatePullRequest(repository.Spec.Owner, repository.Spec.RepositoryName, gitea.CreatePullRequestOption{
if _, _, err := client.CreatePullRequest(repository.Spec.Owner, repository.GetName(), gitea.CreatePullRequestOption{
Head: branch,
Base: base,
Title: title,
Expand Down
8 changes: 4 additions & 4 deletions pkg/providers/github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ func (c *Client) CreateRepository(ctx context.Context, obj mpasv1alpha1.Reposito
}

if obj.Spec.IsOrganization {
return gogit.CreateOrganizationRepository(ctx, gc, domain, obj.Spec)
return gogit.CreateOrganizationRepository(ctx, gc, domain, obj)
}

return gogit.CreateUserRepository(ctx, gc, domain, obj.Spec)
return gogit.CreateUserRepository(ctx, gc, domain, obj)
}

// constructAuthenticationOption will take the object and construct an authentication option.
Expand Down Expand Up @@ -117,8 +117,8 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
}

if repository.Spec.IsOrganization {
return gogit.CreateOrganizationPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository.Spec)
return gogit.CreateOrganizationPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository)
}

return gogit.CreateUserPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository.Spec)
return gogit.CreateUserPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository)
}
8 changes: 4 additions & 4 deletions pkg/providers/gitlab/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ func (c *Client) CreateRepository(ctx context.Context, obj mpasv1alpha1.Reposito
}

if obj.Spec.IsOrganization {
return gogit.CreateOrganizationRepository(ctx, gc, domain, obj.Spec)
return gogit.CreateOrganizationRepository(ctx, gc, domain, obj)
}

return gogit.CreateUserRepository(ctx, gc, domain, obj.Spec)
return gogit.CreateUserRepository(ctx, gc, domain, obj)
}

func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deliveryv1alpha1.Sync, repository mpasv1alpha1.Repository) error {
Expand Down Expand Up @@ -119,8 +119,8 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
}

if repository.Spec.IsOrganization {
return gogit.CreateOrganizationPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository.Spec)
return gogit.CreateOrganizationPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository)
}

return gogit.CreateUserPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository.Spec)
return gogit.CreateUserPullRequest(ctx, gc, domain, branch, sync.Spec.PullRequestTemplate, repository)
}
62 changes: 31 additions & 31 deletions pkg/providers/gogit/gogit.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ import (
)

// CreateOrganizationRepository creates a repository for an authenticated organization.
func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, domain string, spec mpasv1alpha1.RepositorySpec) error {
func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, domain string, obj mpasv1alpha1.Repository) error {
logger := log.FromContext(ctx)

visibility := gitprovider.RepositoryVisibility(spec.Visibility)
visibility := gitprovider.RepositoryVisibility(obj.Spec.Visibility)

if err := gitprovider.ValidateRepositoryVisibility(visibility); err != nil {
return fmt.Errorf("failed to validate visibility: %w", err)
Expand All @@ -30,12 +30,12 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do
ref := gitprovider.OrgRepositoryRef{
OrganizationRef: gitprovider.OrganizationRef{
Domain: domain,
Organization: spec.Owner,
Organization: obj.Spec.Owner,
},
RepositoryName: spec.RepositoryName,
RepositoryName: obj.GetName(),
}
info := gitprovider.RepositoryInfo{
DefaultBranch: gitprovider.StringVar(spec.DefaultBranch),
DefaultBranch: gitprovider.StringVar(obj.Spec.DefaultBranch),
Visibility: &visibility,
}

Expand All @@ -44,53 +44,53 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do
return fmt.Errorf("failed to create _create_ options for repository: %w", err)
}

switch spec.ExistingRepositoryPolicy {
switch obj.Spec.ExistingRepositoryPolicy {
case mpasv1alpha1.ExistingRepositoryPolicyFail:
repo, err := gc.OrgRepositories().Create(ctx, ref, info, &createOpts)
if err != nil {
return fmt.Errorf("failed to create repository: %w", err)
}

if err := setupProjectStructure(ctx, repo, spec.Maintainers); err != nil {
if err := setupProjectStructure(ctx, repo, obj.Spec.Maintainers); err != nil {
if cerr := repo.Delete(ctx); cerr != nil {
err = errors.Join(err, cerr)
}

return fmt.Errorf("failed to create initial project structure: %w", err)
}

logger.Info("successfully created organization repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("successfully created organization repository", "domain", domain, "repository", obj.GetName())
case mpasv1alpha1.ExistingRepositoryPolicyAdopt:
repo, created, err := gc.OrgRepositories().Reconcile(ctx, ref, info, &createOpts)
if err != nil {
return fmt.Errorf("failed to reconcile repository: %w", err)
}

if !created {
logger.Info("using existing repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("using existing repository", "domain", domain, "repository", obj.GetName())
} else {
if err := setupProjectStructure(ctx, repo, spec.Maintainers); err != nil {
if err := setupProjectStructure(ctx, repo, obj.Spec.Maintainers); err != nil {
if cerr := repo.Delete(ctx); cerr != nil {
err = errors.Join(err, cerr)
}

return fmt.Errorf("failed to create initial project structure: %w", err)
}

logger.Info("successfully created organization repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("successfully created organization repository", "domain", domain, "repository", obj.GetName())
}
default:
return fmt.Errorf("unknown repository policy '%s'", spec.ExistingRepositoryPolicy)
return fmt.Errorf("unknown repository policy '%s'", obj.Spec.ExistingRepositoryPolicy)
}

return nil
}

// CreateUserRepository creates a repository for an authenticated user.
func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain string, spec mpasv1alpha1.RepositorySpec) error {
func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain string, obj mpasv1alpha1.Repository) error {
logger := log.FromContext(ctx)

visibility := gitprovider.RepositoryVisibility(spec.Visibility)
visibility := gitprovider.RepositoryVisibility(obj.Spec.Visibility)

if err := gitprovider.ValidateRepositoryVisibility(visibility); err != nil {
return fmt.Errorf("failed to validate visibility: %w", err)
Expand All @@ -99,9 +99,9 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str
ref := gitprovider.UserRepositoryRef{
UserRef: gitprovider.UserRef{
Domain: domain,
UserLogin: spec.Owner,
UserLogin: obj.Spec.Owner,
},
RepositoryName: spec.RepositoryName,
RepositoryName: obj.GetName(),
}
info := gitprovider.RepositoryInfo{
DefaultBranch: gitprovider.StringVar("main"),
Expand All @@ -113,57 +113,57 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str
return fmt.Errorf("failed to create _create_ options for repository: %w", err)
}

switch spec.ExistingRepositoryPolicy {
switch obj.Spec.ExistingRepositoryPolicy {
case mpasv1alpha1.ExistingRepositoryPolicyFail:
repo, err := gc.UserRepositories().Create(ctx, ref, info, &createOpts)
if err != nil {
return fmt.Errorf("failed to create repository: %w", err)
}

if err := setupProjectStructure(ctx, repo, spec.Maintainers); err != nil {
if err := setupProjectStructure(ctx, repo, obj.Spec.Maintainers); err != nil {
if cerr := repo.Delete(ctx); cerr != nil {
err = errors.Join(err, cerr)
}

return fmt.Errorf("failed to create initial project structure: %w", err)
}

logger.Info("successfully created user repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("successfully created user repository", "domain", domain, "repository", obj.GetName())
case mpasv1alpha1.ExistingRepositoryPolicyAdopt:
repo, created, err := gc.UserRepositories().Reconcile(ctx, ref, info, &createOpts)
if err != nil {
return fmt.Errorf("failed to reconcile repository: %w", err)
}

if !created {
logger.Info("using existing repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("using existing repository", "domain", domain, "repository", obj.GetName())
} else {
if err := setupProjectStructure(ctx, repo, spec.Maintainers); err != nil {
if err := setupProjectStructure(ctx, repo, obj.Spec.Maintainers); err != nil {
if cerr := repo.Delete(ctx); cerr != nil {
err = errors.Join(err, cerr)
}

return fmt.Errorf("failed to create initial project structure: %w", err)
}

logger.Info("successfully created user repository", "domain", domain, "repository", spec.RepositoryName)
logger.Info("successfully created user repository", "domain", domain, "repository", obj.GetName())
}
default:
return fmt.Errorf("unknown repository policy '%s'", spec.ExistingRepositoryPolicy)
return fmt.Errorf("unknown repository policy '%s'", obj.Spec.ExistingRepositoryPolicy)
}

return nil
}

// CreateOrganizationPullRequest creates a pull-request for an organization owned repository.
func CreateOrganizationPullRequest(ctx context.Context, gc gitprovider.Client, domain, branch string, spec deliveryv1alpha1.PullRequestTemplate, repository mpasv1alpha1.RepositorySpec) error {
func CreateOrganizationPullRequest(ctx context.Context, gc gitprovider.Client, domain, branch string, spec deliveryv1alpha1.PullRequestTemplate, repository mpasv1alpha1.Repository) error {
// find the repository
repo, err := gc.OrgRepositories().Get(ctx, gitprovider.OrgRepositoryRef{
OrganizationRef: gitprovider.OrganizationRef{
Domain: domain,
Organization: repository.Owner,
Organization: repository.Spec.Owner,
},
RepositoryName: repository.RepositoryName,
RepositoryName: repository.GetName(),
})
if err != nil {
return fmt.Errorf("failed to find organization repository: %w", err)
Expand Down Expand Up @@ -193,20 +193,20 @@ func CreateOrganizationPullRequest(ctx context.Context, gc gitprovider.Client, d
}

logger := log.FromContext(ctx)
logger.Info("created pull request for organization repository", "organization", repository.Owner, "pull-request", pr.Get().Number)
logger.Info("created pull request for organization repository", "organization", repository.Spec.Owner, "pull-request", pr.Get().Number)

return nil
}

// CreateUserPullRequest creates a pull-request for a user owned repository.
func CreateUserPullRequest(ctx context.Context, gc gitprovider.Client, domain, branch string, spec deliveryv1alpha1.PullRequestTemplate, repository mpasv1alpha1.RepositorySpec) error {
func CreateUserPullRequest(ctx context.Context, gc gitprovider.Client, domain, branch string, spec deliveryv1alpha1.PullRequestTemplate, repository mpasv1alpha1.Repository) error {
// find the repository
repo, err := gc.UserRepositories().Get(ctx, gitprovider.UserRepositoryRef{
UserRef: gitprovider.UserRef{
Domain: domain,
UserLogin: repository.Owner,
UserLogin: repository.Spec.Owner,
},
RepositoryName: repository.RepositoryName,
RepositoryName: repository.GetName(),
})
if err != nil {
return fmt.Errorf("failed to find user repository: %w", err)
Expand Down Expand Up @@ -236,7 +236,7 @@ func CreateUserPullRequest(ctx context.Context, gc gitprovider.Client, domain, b
}

logger := log.FromContext(ctx)
logger.Info("created pull request for user repository", "user", repository.Owner, "pull-request", pr.Get().Number)
logger.Info("created pull request for user repository", "user", repository.Spec.Owner, "pull-request", pr.Get().Number)

return nil
}
Expand Down