From 82768b82ed71c0cc235c897e6147c8649c314ba1 Mon Sep 17 00:00:00 2001 From: Josh Michielsen Date: Thu, 11 May 2023 17:21:56 +0100 Subject: [PATCH 1/2] remove repo name from spec, use object name --- apis/mpas/v1alpha1/repository_types.go | 8 +-- .../bases/mpas.ocm.software_repositories.yaml | 3 - controllers/delivery/sync_controller_test.go | 10 ++- controllers/mpas/suite_test.go | 5 +- pkg/providers/gitea/gitea.go | 8 +-- pkg/providers/github/github.go | 8 +-- pkg/providers/gogit/gogit.go | 62 +++++++++---------- 7 files changed, 48 insertions(+), 56 deletions(-) diff --git a/apis/mpas/v1alpha1/repository_types.go b/apis/mpas/v1alpha1/repository_types.go index d7b4fe2..398b094 100644 --- a/apis/mpas/v1alpha1/repository_types.go +++ b/apis/mpas/v1alpha1/repository_types.go @@ -35,8 +35,6 @@ type RepositorySpec struct { //+required Owner string `json:"owner"` //+required - RepositoryName string `json:"repositoryName"` - //+required Credentials Credentials `json:"credentials"` //+optional @@ -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 := "" @@ -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 diff --git a/config/crd/bases/mpas.ocm.software_repositories.yaml b/config/crd/bases/mpas.ocm.software_repositories.yaml index 37fccb3..84e4917 100644 --- a/config/crd/bases/mpas.ocm.software_repositories.yaml +++ b/config/crd/bases/mpas.ocm.software_repositories.yaml @@ -93,8 +93,6 @@ spec: type: string provider: type: string - repositoryName: - type: string visibility: default: private enum: @@ -107,7 +105,6 @@ spec: - isOrganization - owner - provider - - repositoryName type: object status: description: RepositoryStatus defines the observed state of Repository diff --git a/controllers/delivery/sync_controller_test.go b/controllers/delivery/sync_controller_test.go index e5ed14d..57fc4b3 100644 --- a/controllers/delivery/sync_controller_test.go +++ b/controllers/delivery/sync_controller_test.go @@ -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, @@ -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, diff --git a/controllers/mpas/suite_test.go b/controllers/mpas/suite_test.go index 8ed9a0c..1645ab8 100644 --- a/controllers/mpas/suite_test.go +++ b/controllers/mpas/suite_test.go @@ -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", diff --git a/pkg/providers/gitea/gitea.go b/pkg/providers/gitea/gitea.go index 8e6d1a1..0cd846f 100644 --- a/pkg/providers/gitea/gitea.go +++ b/pkg/providers/gitea/gitea.go @@ -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, @@ -127,7 +127,7 @@ 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, @@ -135,7 +135,7 @@ func (f *fileCommitter) commitFile(client *gitea.Client, obj mpasv1alpha1.Reposi 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) } @@ -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, diff --git a/pkg/providers/github/github.go b/pkg/providers/github/github.go index a8f4df1..53f7e7f 100644 --- a/pkg/providers/github/github.go +++ b/pkg/providers/github/github.go @@ -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. @@ -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) } diff --git a/pkg/providers/gogit/gogit.go b/pkg/providers/gogit/gogit.go index 902c441..5fb76bf 100644 --- a/pkg/providers/gogit/gogit.go +++ b/pkg/providers/gogit/gogit.go @@ -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) @@ -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, } @@ -44,14 +44,14 @@ 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) } @@ -59,7 +59,7 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do 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 { @@ -67,9 +67,9 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do } 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) } @@ -77,20 +77,20 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do 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) @@ -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"), @@ -113,14 +113,14 @@ 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) } @@ -128,7 +128,7 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str 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 { @@ -136,9 +136,9 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str } 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) } @@ -146,24 +146,24 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str 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) @@ -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) @@ -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 } From e2ab797f1a7723b59d23f87f6114dad39f76fcb3 Mon Sep 17 00:00:00 2001 From: Josh Michielsen Date: Fri, 12 May 2023 12:57:13 +0100 Subject: [PATCH 2/2] update gitlab provider --- pkg/providers/gitlab/gitlab.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/providers/gitlab/gitlab.go b/pkg/providers/gitlab/gitlab.go index 7e04f46..9a63525 100644 --- a/pkg/providers/gitlab/gitlab.go +++ b/pkg/providers/gitlab/gitlab.go @@ -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 { @@ -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) }