Skip to content
This repository was archived by the owner on May 9, 2025. It is now read-only.

Commit dfa0ef9

Browse files
committed
added adopt or fail options for existing repositories
1 parent 5a5f4d5 commit dfa0ef9

File tree

4 files changed

+70
-13
lines changed

4 files changed

+70
-13
lines changed

apis/mpas/v1alpha1/repository_types.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ type Credentials struct {
2020
SecretRef SecretRef `json:"secretRef"`
2121
}
2222

23+
// ExistingRepositoryPolicy defines what to do in case a requested repository already exists.
24+
type ExistingRepositoryPolicy string
25+
26+
var (
27+
// ExistingRepositoryPolicyAdopt will use the repository if it exists.
28+
ExistingRepositoryPolicyAdopt ExistingRepositoryPolicy = "adopt"
29+
// ExistingRepositoryPolicyFail will fail if the requested repository already exists.
30+
ExistingRepositoryPolicyFail ExistingRepositoryPolicy = "fail"
31+
)
32+
2333
// RepositorySpec defines the desired state of Repository
2434
type RepositorySpec struct {
2535
Provider string `json:"provider"`
@@ -41,6 +51,10 @@ type RepositorySpec struct {
4151
//+optional
4252
//+kubebuilder:default:=true
4353
AutomaticPullRequestCreation bool `json:"automaticPullRequestCreation,omitempty"`
54+
//+optional
55+
//+kubebuilder:default:=adopt
56+
//+kubebuilder:validation:Enum=adopt;fail
57+
ExistingRepositoryPolicy ExistingRepositoryPolicy `json:"existingRepositoryPolicy,omitempty"`
4458
}
4559

4660
// RepositoryStatus defines the observed state of Repository

config/crd/bases/mpas.ocm.software_repositories.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ spec:
5656
type: object
5757
domain:
5858
type: string
59+
existingRepositoryPolicy:
60+
default: adopt
61+
description: ExistingRepositoryPolicy defines what to do in case a
62+
requested repository already exists.
63+
enum:
64+
- adopt
65+
- fail
66+
type: string
5967
interval:
6068
type: string
6169
isOrganization:

config/samples/mpas_v1alpha1_repository.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ spec:
66
credentials:
77
secretRef:
88
name: github-creds
9-
interval: 10m
109
owner: Skarlso
1110
provider: github
1211
repositoryName: new-repository-1

pkg/providers/github/github.go

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,43 +103,79 @@ func (c *Client) constructAuthenticationOption(ctx context.Context, obj mpasv1al
103103
func (c *Client) createOrganizationRepository(ctx context.Context, gc gitprovider.Client, domain string, visibility gitprovider.RepositoryVisibility, spec mpasv1alpha1.RepositorySpec) error {
104104
logger := log.FromContext(ctx)
105105

106-
repo, err := gc.OrgRepositories().Create(ctx, gitprovider.OrgRepositoryRef{
106+
ref := gitprovider.OrgRepositoryRef{
107107
OrganizationRef: gitprovider.OrganizationRef{
108108
Domain: domain,
109109
Organization: spec.Owner,
110110
},
111111
RepositoryName: spec.RepositoryName,
112-
}, gitprovider.RepositoryInfo{
112+
}
113+
info := gitprovider.RepositoryInfo{
113114
DefaultBranch: gitprovider.StringVar("main"),
114115
Visibility: &visibility,
115-
})
116-
if err != nil {
117-
return fmt.Errorf("failed to create repository: %w", err)
118116
}
119117

120-
logger.Info("organization repository successfully created", "name", repo.Repository().String())
118+
switch spec.ExistingRepositoryPolicy {
119+
case mpasv1alpha1.ExistingRepositoryPolicyFail:
120+
if _, err := gc.OrgRepositories().Create(ctx, ref, info); err != nil {
121+
return fmt.Errorf("failed to create repository: %w", err)
122+
}
123+
124+
logger.Info("successfully created organization repository", "domain", domain, "repository", spec.RepositoryName)
125+
case mpasv1alpha1.ExistingRepositoryPolicyAdopt:
126+
_, created, err := gc.OrgRepositories().Reconcile(ctx, ref, info)
127+
if err != nil {
128+
return fmt.Errorf("failed to reconcile repository: %w", err)
129+
}
130+
131+
if !created {
132+
logger.Info("using existing repository", "domain", domain, "repository", spec.RepositoryName)
133+
} else {
134+
logger.Info("successfully created organization repository", "domain", domain, "repository", spec.RepositoryName)
135+
}
136+
default:
137+
return fmt.Errorf("unknown repository policy '%s'", spec.ExistingRepositoryPolicy)
138+
}
121139

122140
return nil
123141
}
124142

125143
func (c *Client) createUserRepository(ctx context.Context, gc gitprovider.Client, domain string, visibility gitprovider.RepositoryVisibility, spec mpasv1alpha1.RepositorySpec) error {
126144
logger := log.FromContext(ctx)
127145

128-
repo, err := gc.UserRepositories().Create(ctx, gitprovider.UserRepositoryRef{
146+
ref := gitprovider.UserRepositoryRef{
129147
UserRef: gitprovider.UserRef{
130148
Domain: domain,
131149
UserLogin: spec.Owner,
132150
},
133151
RepositoryName: spec.RepositoryName,
134-
}, gitprovider.RepositoryInfo{
152+
}
153+
info := gitprovider.RepositoryInfo{
135154
DefaultBranch: gitprovider.StringVar("main"),
136155
Visibility: &visibility,
137-
})
138-
if err != nil {
139-
return fmt.Errorf("failed to create repository: %w", err)
140156
}
141157

142-
logger.Info("user repository successfully created", "name", repo.Repository().String())
158+
switch spec.ExistingRepositoryPolicy {
159+
case mpasv1alpha1.ExistingRepositoryPolicyFail:
160+
if _, err := gc.UserRepositories().Create(ctx, ref, info); err != nil {
161+
return fmt.Errorf("failed to create repository: %w", err)
162+
}
163+
164+
logger.Info("successfully created user repository", "domain", domain, "repository", spec.RepositoryName)
165+
case mpasv1alpha1.ExistingRepositoryPolicyAdopt:
166+
_, created, err := gc.UserRepositories().Reconcile(ctx, ref, info)
167+
if err != nil {
168+
return fmt.Errorf("failed to reconcile repository: %w", err)
169+
}
170+
171+
if !created {
172+
logger.Info("using existing repository", "domain", domain, "repository", spec.RepositoryName)
173+
} else {
174+
logger.Info("successfully created user repository", "domain", domain, "repository", spec.RepositoryName)
175+
}
176+
default:
177+
return fmt.Errorf("unknown repository policy '%s'", spec.ExistingRepositoryPolicy)
178+
}
143179

144180
return nil
145181
}

0 commit comments

Comments
 (0)