Skip to content

Commit 4687e8c

Browse files
author
Jiří Suchomel
authored
Merge pull request #47 from jsuchome/delete-codeset
Delete codeset
2 parents bdf7672 + c2fe55e commit 4687e8c

File tree

6 files changed

+129
-18
lines changed

6 files changed

+129
-18
lines changed

design/codeset.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ var _ = Service("codeset", func() {
106106
})
107107

108108
Method("get", func() {
109-
Description("Retrieve an Codeset from FuseML.")
109+
Description("Retrieve a Codeset from FuseML.")
110110

111111
Payload(func() {
112112
Field(1, "project", String, "Project name", func() {
@@ -140,6 +140,38 @@ var _ = Service("codeset", func() {
140140
Response("NotFound", CodeNotFound)
141141
})
142142
})
143+
144+
Method("delete", func() {
145+
Description("Delete a Codeset registered by FuseML.")
146+
147+
Payload(func() {
148+
Field(1, "project", String, "Project name", func() {
149+
Example("mlflow-project-01")
150+
})
151+
Field(2, "name", String, "Codeset name", func() {
152+
Example("mlflow-app-01")
153+
})
154+
Required("project", "name")
155+
})
156+
157+
Error("BadRequest", func() {
158+
Description("If neither name or project is not given, should return 400 Bad Request.")
159+
})
160+
Error("NotFound", func() {
161+
Description("If there is no codeset with the given name and project, should return 404 Not Found.")
162+
})
163+
164+
HTTP(func() {
165+
DELETE("/codesets/{project}/{name}")
166+
Response(StatusCreated)
167+
Response("BadRequest", StatusBadRequest)
168+
})
169+
GRPC(func() {
170+
Response(CodeOK)
171+
Response("BadRequest", CodeInvalidArgument)
172+
})
173+
})
174+
143175
})
144176

145177
// Codeset describes the Codeset

pkg/core/codeset_store.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type GitAdmin interface {
1414
CreateRepoWebhook(string, string, *string) error
1515
GetRepositories(org, label *string) ([]*domain.Codeset, error)
1616
GetRepository(org, name string) (*domain.Codeset, error)
17+
DeleteRepository(org, name string) error
1718
}
1819

1920
// GitCodesetStore describes a stucture that accesses codeset store implemented in git
@@ -37,6 +38,16 @@ func (cs *GitCodesetStore) Find(ctx context.Context, project, name string) (*dom
3738
return result, nil
3839
}
3940

41+
// Delete removes a codeset identified by project and name
42+
func (cs *GitCodesetStore) Delete(ctx context.Context, project, name string) error {
43+
err := cs.gitAdmin.DeleteRepository(project, name)
44+
// TODO should we delete the project+user too? If it does not contain any repos?
45+
if err != nil {
46+
return errors.Wrap(err, "Deleting Codeset failed")
47+
}
48+
return nil
49+
}
50+
4051
// GetAll returns all codesets matching given project and label
4152
func (cs *GitCodesetStore) GetAll(ctx context.Context, project, label *string) ([]*domain.Codeset, error) {
4253
result, err := cs.gitAdmin.GetRepositories(project, label)

pkg/core/gitea/client.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type AdminClient interface {
1717
CreateRepoWebhook(string, string, *string) error
1818
GetRepositories(org, label *string) ([]*domain.Codeset, error)
1919
GetRepository(org, name string) (*domain.Codeset, error)
20+
DeleteRepository(org, name string) error
2021
}
2122

2223
// Client describes the interface of Gitea Client
@@ -35,6 +36,7 @@ type Client interface {
3536
CreateRepoHook(string, string, gitea.CreateHookOption) (*gitea.Hook, *gitea.Response, error)
3637
ListRepoTopics(string, string, gitea.ListRepoTopicsOptions) ([]string, *gitea.Response, error)
3738
ListMyOrgs(gitea.ListOrgsOptions) ([]*gitea.Organization, *gitea.Response, error)
39+
DeleteRepo(string, string) (*gitea.Response, error)
3840
}
3941

4042
// giteaAdminClient is the struct holding information about gitea client
@@ -352,3 +354,24 @@ func (gac giteaAdminClient) GetRepository(org, name string) (*domain.Codeset, er
352354

353355
return &ret, nil
354356
}
357+
358+
// Delete the repository
359+
func (gac giteaAdminClient) DeleteRepository(org, name string) error {
360+
gac.logger.Printf("Going to delete repo %s for org '%s'...", name, org)
361+
362+
_, resp, err := gac.giteaClient.GetRepo(org, name)
363+
364+
if resp.StatusCode == 404 {
365+
gac.logger.Printf("Repo does not exist, no need to delete")
366+
return nil
367+
}
368+
if err != nil {
369+
return errors.Wrap(err, "Failed to get repo")
370+
}
371+
372+
_, err = gac.giteaClient.DeleteRepo(org, name)
373+
if err != nil {
374+
return errors.Wrap(err, "Failed to delete repository")
375+
}
376+
return nil
377+
}

pkg/core/gitea/client_test.go

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ import (
1212
)
1313

1414
type TestStore struct {
15-
repositories map[string]gitea.Repository
1615
projects map[string]gitea.Organization
17-
projects2repos map[string][]*gitea.Repository
16+
projects2repos map[string]map[string]gitea.Repository
1817
teams map[int64][]string
1918
}
2019

@@ -26,9 +25,8 @@ type testGiteaClient struct {
2625

2726
func NewTestStore() *TestStore {
2827
return &TestStore{
29-
repositories: make(map[string]gitea.Repository),
3028
projects: make(map[string]gitea.Organization),
31-
projects2repos: make(map[string][]*gitea.Repository),
29+
projects2repos: make(map[string]map[string]gitea.Repository),
3230
teams: make(map[int64][]string),
3331
}
3432
}
@@ -55,15 +53,14 @@ func (tc testGiteaClient) AddRepoTopic(string, string, string) (*gitea.Response,
5553
}
5654
func (tc testGiteaClient) GetOrg(orgname string) (*gitea.Organization, *gitea.Response, error) {
5755
if org, ok := tc.testStore.projects[orgname]; ok {
58-
httpResp := http.Response{StatusCode: 200}
59-
return &org, &gitea.Response{Response: &httpResp}, nil
56+
return &org, &gitea.Response{Response: &httpResp200}, nil
6057
}
6158
return nil, nil, nil
6259
}
6360
func (tc testGiteaClient) CreateOrg(opt gitea.CreateOrgOption) (*gitea.Organization, *gitea.Response, error) {
6461
org := gitea.Organization{UserName: opt.Name}
6562
tc.testStore.projects[opt.Name] = org
66-
tc.testStore.projects2repos[opt.Name] = make([]*gitea.Repository, 0)
63+
tc.testStore.projects2repos[opt.Name] = make(map[string]gitea.Repository)
6764
return &org, nil, nil
6865
}
6966
func (tc testGiteaClient) GetUserInfo(string) (*gitea.User, *gitea.Response, error) {
@@ -82,26 +79,26 @@ func (tc testGiteaClient) AddTeamMember(id int64, username string) (*gitea.Respo
8279
return nil, nil
8380
}
8481
func (tc testGiteaClient) GetRepo(owner, reponame string) (*gitea.Repository, *gitea.Response, error) {
85-
if repo, ok := tc.testStore.repositories[reponame]; ok {
86-
return &repo, nil, nil
82+
if repo, ok := tc.testStore.projects2repos[owner][reponame]; ok {
83+
return &repo, &gitea.Response{Response: &httpResp200}, nil
8784
}
88-
return nil, nil, nil
89-
85+
return nil, &gitea.Response{Response: &httpResp404}, nil
9086
}
9187
func (tc testGiteaClient) CreateOrgRepo(org string, repo gitea.CreateRepoOption) (*gitea.Repository, *gitea.Response, error) {
9288
r := gitea.Repository{Name: repo.Name}
93-
tc.testStore.repositories[repo.Name] = r
94-
tc.testStore.projects2repos[org] = append(tc.testStore.projects2repos[org], &r)
89+
tc.testStore.projects2repos[org][repo.Name] = r
9590
return &r, nil, nil
9691
}
9792
func (tc testGiteaClient) ListRepoHooks(string, string, gitea.ListHooksOptions) ([]*gitea.Hook, *gitea.Response, error) {
9893
return nil, nil, nil
9994
}
10095
func (tc testGiteaClient) ListOrgRepos(org string, opt gitea.ListOrgReposOptions) ([]*gitea.Repository, *gitea.Response, error) {
101-
if repos, ok := tc.testStore.projects2repos[org]; ok {
102-
return repos, nil, nil
96+
repos := make([]*gitea.Repository, 0)
97+
for _, repo := range tc.testStore.projects2repos[org] {
98+
r := repo
99+
repos = append(repos, &r)
103100
}
104-
return nil, nil, nil
101+
return repos, nil, nil
105102
}
106103

107104
func (tc testGiteaClient) CreateRepoHook(string, string, gitea.CreateHookOption) (*gitea.Hook, *gitea.Response, error) {
@@ -113,18 +110,26 @@ func (tc testGiteaClient) ListRepoTopics(org, repo string, opt gitea.ListRepoTop
113110
func (tc testGiteaClient) ListMyOrgs(gitea.ListOrgsOptions) ([]*gitea.Organization, *gitea.Response, error) {
114111
allOrgs := make([]*gitea.Organization, 0)
115112
for _, org := range tc.testStore.projects {
116-
allOrgs = append(allOrgs, &org)
113+
o := org
114+
allOrgs = append(allOrgs, &o)
117115
}
118116
return allOrgs, nil, nil
119117
}
120118

119+
func (tc testGiteaClient) DeleteRepo(owner, repo string) (*gitea.Response, error) {
120+
delete(tc.testStore.projects2repos[owner], repo)
121+
return nil, nil
122+
}
123+
121124
var (
122125
project1 = "test-project1"
123126
project2 = "test-project2"
124127
name = "test"
125128
testURL = "http://gitea.example.io"
126129
testListenerStringURL = "tekton-listener"
127130
testListenerURL = &testListenerStringURL
131+
httpResp200 = http.Response{StatusCode: 200}
132+
httpResp404 = http.Response{StatusCode: 404}
128133
)
129134

130135
func getTestCodeset() *domain.Codeset {
@@ -205,6 +210,40 @@ func TestGetRepository(t *testing.T) {
205210
}
206211
}
207212

213+
func TestDeleteRepository(t *testing.T) {
214+
215+
testGiteaAdminClient := newTestGiteaAdminClient(NewTestStore())
216+
217+
// Reading repo that was not added should throw error
218+
_, err := testGiteaAdminClient.GetRepository(project1, name)
219+
220+
assertError(t, err, errRepoNotFound)
221+
222+
// Prepare new repo
223+
testGiteaAdminClient.PrepareRepository(getTestCodeset(), testListenerURL)
224+
225+
// Get the repo now
226+
_, err = testGiteaAdminClient.GetRepository(project1, name)
227+
if err != nil {
228+
t.Errorf("Error geting repository that was just created")
229+
}
230+
231+
err = testGiteaAdminClient.DeleteRepository(project1, name)
232+
if err != nil {
233+
t.Errorf("Error deleting repository")
234+
}
235+
236+
c, err := testGiteaAdminClient.GetRepository(project1, name)
237+
if c != nil {
238+
t.Errorf("Repository still present after deleting")
239+
}
240+
241+
err = testGiteaAdminClient.DeleteRepository(project1, name)
242+
if err != nil {
243+
t.Errorf("Error: deleting non existent repository should not fail")
244+
}
245+
}
246+
208247
func TestGetRepositories(t *testing.T) {
209248

210249
testGiteaAdminClient := newTestGiteaAdminClient(NewTestStore())

pkg/domain/codeset.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ type CodesetStore interface {
2424
GetAll(ctx context.Context, project, label *string) ([]*Codeset, error)
2525
Add(ctx context.Context, c *Codeset) (*Codeset, error)
2626
CreateWebhook(context.Context, *Codeset, string) error
27+
Delete(ctx context.Context, project, name string) error
2728
}

pkg/svc/codeset.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,8 @@ func (s *codesetsrvc) Get(ctx context.Context, p *codeset.GetPayload) (res *code
7676
}
7777
return codesetDomainToRest(c), nil
7878
}
79+
80+
func (s *codesetsrvc) Delete(ctx context.Context, p *codeset.DeletePayload) error {
81+
s.logger.Print("codeset.delete")
82+
return s.store.Delete(ctx, p.Project, p.Name)
83+
}

0 commit comments

Comments
 (0)