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

Commit ce2cb5a

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

File tree

4 files changed

+80
-19
lines changed

4 files changed

+80
-19
lines changed

apis/mpas/v1alpha1/repository_types.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,31 @@ 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 {
25-
Provider string `json:"provider"`
26-
Owner string `json:"owner"`
27-
RepositoryName string `json:"repositoryName"`
28-
Credentials Credentials `json:"credentials"`
35+
//+required
36+
Provider string `json:"provider"`
37+
//+required
38+
Owner string `json:"owner"`
39+
//+required
40+
RepositoryName string `json:"repositoryName"`
41+
//+required
42+
Credentials Credentials `json:"credentials"`
2943

3044
//+optional
3145
Interval metav1.Duration `json:"interval,omitempty"`
3246
//+optional
33-
//+kubebuilder:default:=internal
47+
//+kubebuilder:default:=private
3448
Visibility string `json:"visibility,omitempty"`
3549
//+kubebuilder:default:=true
3650
IsOrganization bool `json:"isOrganization,omitempty"`
@@ -41,6 +55,10 @@ type RepositorySpec struct {
4155
//+optional
4256
//+kubebuilder:default:=true
4357
AutomaticPullRequestCreation bool `json:"automaticPullRequestCreation,omitempty"`
58+
//+optional
59+
//+kubebuilder:default:=adopt
60+
//+kubebuilder:validation:Enum=adopt;fail
61+
ExistingRepositoryPolicy ExistingRepositoryPolicy `json:"existingRepositoryPolicy,omitempty"`
4462
}
4563

4664
// RepositoryStatus defines the observed state of Repository

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

Lines changed: 9 additions & 1 deletion
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:
@@ -72,7 +80,7 @@ spec:
7280
repositoryName:
7381
type: string
7482
visibility:
75-
default: internal
83+
default: private
7684
type: string
7785
required:
7886
- credentials

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)