Skip to content

Commit 5e6911e

Browse files
authored
feat(cdsctl): cdsctl admin database for cdn service (#5930)
* feat: cdsctl admin database for cdn service $ cdsctl admin database unlock api id-to-unlock $ cdsctl admin database unlock cdn id-to-unlock $ cdsctl admin database delete api id-migration-to-delete $ cdsctl admin database delete cdn id-migration-to-delete $ cdsctl admin database list api $ cdsctl admin database list cdn Signed-off-by: Yvonnick Esnault <[email protected]>
1 parent a08cd7f commit 5e6911e

File tree

14 files changed

+157
-98
lines changed

14 files changed

+157
-98
lines changed

cli/cdsctl/admin_database.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,66 @@ func adminDatabase() *cobra.Command {
2929
var adminDatabaseUnlockCmd = cli.Command{
3030
Name: "unlock",
3131
Short: "Unlock a pending migration (Use with caution)",
32+
Example: `
33+
$ cdsctl admin database unlock api id-to-unlock
34+
$ cdsctl admin database unlock cdn id-to-unlock
35+
`,
3236
Args: []cli.Arg{
37+
{
38+
Name: argServiceName,
39+
IsValid: func(s string) bool {
40+
return s == sdk.TypeCDN || s == sdk.TypeAPI
41+
},
42+
},
3343
{Name: "id"},
3444
},
3545
}
3646

37-
func adminDatabaseUnlockFunc(v cli.Values) error {
38-
return client.AdminDatabaseMigrationUnlock(v.GetString("id"))
47+
func adminDatabaseUnlockFunc(args cli.Values) error {
48+
return client.AdminDatabaseMigrationUnlock(args.GetString(argServiceName), args.GetString("id"))
3949
}
4050

4151
var adminDatabaseDeleteMigrationCmd = cli.Command{
4252
Name: "delete",
4353
Short: "Delete a database migration from table gorp_migration (use with caution)",
54+
Example: `
55+
$ cdsctl admin database delete api id-migration-to-delete
56+
$ cdsctl admin database delete cdn id-migration-to-delete
57+
`,
4458
Args: []cli.Arg{
59+
{
60+
Name: argServiceName,
61+
IsValid: func(s string) bool {
62+
return s == sdk.TypeCDN || s == sdk.TypeAPI
63+
},
64+
},
4565
{Name: "id"},
4666
},
4767
}
4868

49-
func adminDatabaseDeleteFunc(v cli.Values) error {
50-
return client.AdminDatabaseMigrationDelete(v.GetString("id"))
69+
func adminDatabaseDeleteFunc(args cli.Values) error {
70+
return client.AdminDatabaseMigrationDelete(args.GetString(argServiceName), args.GetString("id"))
5171
}
5272

5373
var adminDatabaseMigrationsList = cli.Command{
5474
Name: "list",
5575
Short: "List all CDS DB migrations",
76+
Example: `
77+
$ cdsctl admin database list api
78+
$ cdsctl admin database list cdn
79+
`,
80+
Args: []cli.Arg{
81+
{
82+
Name: argServiceName,
83+
IsValid: func(s string) bool {
84+
return s == sdk.TypeCDN || s == sdk.TypeAPI
85+
},
86+
},
87+
},
5688
}
5789

58-
func adminDatabaseMigrationsListFunc(_ cli.Values) (cli.ListResult, error) {
59-
migrations, err := client.AdminDatabaseMigrationsList()
90+
func adminDatabaseMigrationsListFunc(args cli.Values) (cli.ListResult, error) {
91+
migrations, err := client.AdminDatabaseMigrationsList(args.GetString(argServiceName))
6092
if err != nil {
6193
return nil, err
6294
}

docker-compose.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,10 @@ services:
7272
cdn.storageUnits.buffers.redis.redis.password=cds \
7373
cdn.storageUnits.buffers.local-buffer.local.path=/app/cdn-buffer \
7474
cdn.storageUnits.storages.local.local.path=/app/cdn-storage \
75-
cdn.storageUnits.storages.cds.cds.host=http://cds-api:8081 \
7675
cdn.database.host=cds-db \
7776
cdn.publicTCP=${HOSTNAME}:8090 \
7877
cdn.api.http.url=http://cds-api:8081 \
79-
cdn.url=http://cds-cdn:8089 \
78+
cdn.URL=http://cds-cdn:8089 \
8079
hatchery.local.commonConfiguration.url=http://cds-hatchery-local:8086 \
8180
hatchery.local.commonConfiguration.api.http.url=http://cds-api:8081 \
8281
hatchery.local.basedir=/app/hatchery-local \

engine/api/admin.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ func putPostAdminServiceCallHandler(api *API, method string) service.Handler {
181181
}
182182
}
183183

184+
func (api *API) deleteDatabaseMigrationHandler() service.Handler {
185+
return database.AdminDeleteDatabaseMigration(api.mustDB)
186+
}
187+
188+
func (api *API) postDatabaseMigrationUnlockedHandler() service.Handler {
189+
return database.AdminDatabaseMigrationUnlocked(api.mustDB)
190+
}
191+
192+
func (api *API) getDatabaseMigrationHandler() service.Handler {
193+
return database.AdminGetDatabaseMigration(api.mustDB)
194+
}
195+
184196
func (api *API) getAdminDatabaseSignatureResume() service.Handler {
185197
return database.AdminDatabaseSignatureResume(api.mustDB, gorpmapping.Mapper)
186198
}

engine/api/database.go

Lines changed: 0 additions & 49 deletions
This file was deleted.

engine/cdn/cdn_admin.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ import (
55
"github.com/ovh/cds/engine/service"
66
)
77

8+
func (s *Service) deleteDatabaseMigrationHandler() service.Handler {
9+
return database.AdminDeleteDatabaseMigration(s.mustDB)
10+
}
11+
12+
func (s *Service) postDatabaseMigrationUnlockedHandler() service.Handler {
13+
return database.AdminDatabaseMigrationUnlocked(s.mustDB)
14+
}
15+
16+
func (s *Service) getDatabaseMigrationHandler() service.Handler {
17+
return database.AdminGetDatabaseMigration(s.mustDB)
18+
}
19+
820
func (s *Service) getAdminDatabaseSignatureResume() service.Handler {
921
return database.AdminDatabaseSignatureResume(s.mustDB, s.Mapper)
1022
}

engine/cdn/cdn_router.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ func (s *Service) initRouter(ctx context.Context) {
4646

4747
r.Handle("/size/item/project/{projectKey}", nil, r.GET(s.getSizeByProjectHandler))
4848

49+
r.Handle("/admin/database/migration/delete/{id}", nil, r.DELETE(s.deleteDatabaseMigrationHandler))
50+
r.Handle("/admin/database/migration/unlock/{id}", nil, r.POST(s.postDatabaseMigrationUnlockedHandler))
51+
r.Handle("/admin/database/migration", nil, r.GET(s.getDatabaseMigrationHandler))
52+
4953
r.Handle("/admin/database/signature", nil, r.GET(s.getAdminDatabaseSignatureResume))
5054
r.Handle("/admin/database/signature/{entity}/roll/{pk}", nil, r.POST(s.postAdminDatabaseSignatureRollEntityByPrimaryKey))
5155
r.Handle("/admin/database/signature/{entity}/{signer}", nil, r.GET(s.getAdminDatabaseSignatureTuplesBySigner))

engine/cmd_database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import (
1818
migrate "github.com/rubenv/sql-migrate"
1919
"github.com/spf13/cobra"
2020

21-
"github.com/ovh/cds/engine/api/database/dbmigrate"
2221
"github.com/ovh/cds/engine/database"
22+
"github.com/ovh/cds/engine/database/dbmigrate"
2323
"github.com/ovh/cds/sdk"
2424
"github.com/ovh/cds/sdk/cdsclient"
2525
)
File renamed without changes.

engine/database/handler_database_encryption.go renamed to engine/database/handler_database.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,50 @@ import (
77
"github.com/go-gorp/gorp"
88
"github.com/gorilla/mux"
99

10+
"github.com/ovh/cds/engine/database/dbmigrate"
1011
"github.com/ovh/cds/engine/gorpmapper"
1112
"github.com/ovh/cds/engine/service"
1213
"github.com/ovh/cds/sdk"
1314
)
1415

1516
type DBFunc func() *gorp.DbMap
1617

18+
func AdminDeleteDatabaseMigration(db DBFunc) service.Handler {
19+
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
20+
vars := mux.Vars(r)
21+
id := vars["id"]
22+
23+
if len(id) == 0 {
24+
return sdk.NewErrorFrom(sdk.ErrWrongRequest, "Id is mandatory. Check id from table gorp_migrations")
25+
}
26+
27+
return dbmigrate.DeleteMigrate(db().Db, id)
28+
}
29+
}
30+
31+
func AdminDatabaseMigrationUnlocked(db DBFunc) service.Handler {
32+
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
33+
vars := mux.Vars(r)
34+
id := vars["id"]
35+
36+
if len(id) == 0 {
37+
return sdk.NewErrorFrom(sdk.ErrWrongRequest, "Id is mandatory. Check id from table gorp_migrations_lock")
38+
}
39+
40+
return dbmigrate.UnlockMigrate(db().Db, id, gorp.PostgresDialect{})
41+
}
42+
}
43+
44+
func AdminGetDatabaseMigration(db DBFunc) service.Handler {
45+
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
46+
a, err := dbmigrate.List(db().Db)
47+
if err != nil {
48+
return sdk.WrapError(err, "Cannot load database migration list %d", err)
49+
}
50+
return service.WriteJSON(w, a, http.StatusOK)
51+
}
52+
}
53+
1754
func AdminDatabaseSignatureResume(db DBFunc, mapper *gorpmapper.Mapper) service.Handler {
1855
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
1956
var entities = mapper.ListSignedEntities()

engine/migrateservice/migrate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"github.com/rockbears/log"
1111
migrate "github.com/rubenv/sql-migrate"
1212

13-
"github.com/ovh/cds/engine/api/database/dbmigrate"
1413
"github.com/ovh/cds/engine/database"
14+
"github.com/ovh/cds/engine/database/dbmigrate"
1515
"github.com/ovh/cds/sdk"
1616
)
1717

0 commit comments

Comments
 (0)