Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 0 additions & 74 deletions cmd/image-builder-db-test/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,79 +227,6 @@ func testDeleteCompose(ctx context.Context, t *testing.T) {
require.Equal(t, 1, count)
}

func testClones(ctx context.Context, t *testing.T) {
d, err := db.InitDBConnectionPool(ctx, tutils.ConnStr(t))
require.NoError(t, err)
conn := tutils.Connect(t)
defer conn.Close(ctx)

composeId := uuid.New()
cloneId := uuid.New()
cloneId2 := uuid.New()

// fkey constraint on compose id
require.Error(t, d.InsertClone(ctx, composeId, cloneId, []byte(`
{
"region": "us-east-2"
}
`)))

require.NoError(t, d.InsertCompose(ctx, composeId, ANR1, EMAIL1, ORGID1, nil, []byte(`
{
"customizations": {
},
"distribution": "rhel-8",
"image_requests": [
{
"architecture": "x86_64",
"image_type": "guest-image",
"upload_request": {
"type": "aws.s3",
"options": {
}
}
}
]
}`), nil, nil))

require.NoError(t, d.InsertClone(ctx, composeId, cloneId, []byte(`
{
"region": "us-east-2"
}
`)))
require.NoError(t, d.InsertClone(ctx, composeId, cloneId2, []byte(`
{
"region": "eu-central-1"
}
`)))

clones, count, err := d.GetClonesForCompose(ctx, composeId, ORGID2, 100, 0)
require.NoError(t, err)
require.Empty(t, clones)
require.Equal(t, 0, count)

clones, count, err = d.GetClonesForCompose(ctx, composeId, ORGID1, 1, 0)
require.NoError(t, err)
require.Len(t, clones, 1)
require.Equal(t, 2, count)
require.Equal(t, cloneId2, clones[0].Id)

clones, count, err = d.GetClonesForCompose(ctx, composeId, ORGID1, 100, 0)
require.NoError(t, err)
require.Len(t, clones, 2)
require.Equal(t, 2, count)
require.Equal(t, cloneId2, clones[0].Id)
require.Equal(t, cloneId, clones[1].Id)

entry, err := d.GetClone(ctx, cloneId, ORGID2)
require.ErrorIs(t, err, db.ErrCloneNotFound)
require.Nil(t, entry)

entry, err = d.GetClone(ctx, cloneId, ORGID1)
require.NoError(t, err)
require.Equal(t, clones[1], *entry)
}

func testBlueprints(ctx context.Context, t *testing.T) {
d, err := db.InitDBConnectionPool(ctx, tutils.ConnStr(t))
require.NoError(t, err)
Expand Down Expand Up @@ -692,7 +619,6 @@ func TestAll(t *testing.T) {
testCountComposesSince,
testGetComposeImageType,
testDeleteCompose,
testClones,
testBlueprints,
testGetBlueprintComposes,
}
Expand Down
24 changes: 1 addition & 23 deletions cmd/image-builder-maintenance/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,6 @@ const (
sqlDeleteComposes = `
DELETE FROM composes
WHERE created_at < $1`
sqlExpiredClonesCount = `
SELECT COUNT(*) FROM clones
WHERE compose_id in (
SELECT job_id
FROM composes
WHERE created_at < $1
)`
sqlExpiredComposesCount = `
SELECT COUNT(*) FROM composes
WHERE created_at < $1`
Expand Down Expand Up @@ -60,15 +53,6 @@ func (d *maintenanceDB) DeleteComposes(ctx context.Context, emailRetentionDate t
return tag.RowsAffected(), nil
}

func (d *maintenanceDB) ExpiredClonesCount(ctx context.Context, emailRetentionDate time.Time) (int64, error) {
var count int64
err := d.Conn.QueryRow(ctx, sqlExpiredClonesCount, emailRetentionDate).Scan(&count)
if err != nil {
return 0, err
}
return count, nil
}

func (d *maintenanceDB) ExpiredComposesCount(ctx context.Context, emailRetentionDate time.Time) (int64, error) {
var count int64
err := d.Conn.QueryRow(ctx, sqlExpiredComposesCount, emailRetentionDate).Scan(&count)
Expand Down Expand Up @@ -159,7 +143,6 @@ func DBCleanup(ctx context.Context, dbURL string, dryRun bool, ComposesRetention
slog.ErrorContext(ctx, "error running vacuum stats", "err", err)
}

var rowsClones int64
var rows int64

emailRetentionDate := time.Now().AddDate(0, ComposesRetentionMonths*-1, 0)
Expand All @@ -175,16 +158,11 @@ func DBCleanup(ctx context.Context, dbURL string, dryRun bool, ComposesRetention
// so `break` works as expected
}
if dryRun {
rowsClones, err = db.ExpiredClonesCount(ctx, emailRetentionDate)
if err != nil {
slog.ErrorContext(ctx, "error querying expired clones", "err", err)
}

rows, err = db.ExpiredComposesCount(ctx, emailRetentionDate)
if err != nil {
slog.WarnContext(ctx, "error querying expired composes", "err", err)
}
slog.InfoContext(ctx, "dryrun", "expired_composes_count", rows, "expired_clones_count", rowsClones)
slog.InfoContext(ctx, "dryrun", "expired_composes_count", rows)
break
}

Expand Down
19 changes: 0 additions & 19 deletions cmd/image-builder-maintenance/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"time"

"github.com/google/uuid"
"github.com/osbuild/image-builder-crc/internal/db"
"github.com/osbuild/image-builder-crc/internal/tutils"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -80,9 +79,6 @@ func testExpireByCallingDBCleanup(ctx context.Context, t *testing.T) {
d, err := newDB(ctx, connStr)
require.NoError(t, err)

internalDB, err := db.InitDBConnectionPool(ctx, connStr)
require.NoError(t, err)

dbComposesRetentionMonths := 5

notYetExpiredTime := time.Now()
Expand All @@ -97,32 +93,17 @@ func testExpireByCallingDBCleanup(ctx context.Context, t *testing.T) {
insert = "INSERT INTO composes(job_id, request, created_at, account_number, org_id) VALUES ($1, $2, $3, $4, $5)"
_, err = d.Conn.Exec(ctx, insert, composeIdExpired, "{}", alreadyExpiredTime, ANR1, ORGID1)

cloneId := uuid.New()
require.NoError(t, internalDB.InsertClone(ctx, composeIdExpired, cloneId, []byte(`
{
"region": "us-east-2"
}
`)))

// two rows inserted, only one is expired
rows, err := d.ExpiredComposesCount(ctx, emailRetentionDate)
require.NoError(t, err)
require.Equal(t, int64(1), rows)

rows, err = d.ExpiredClonesCount(ctx, emailRetentionDate)
require.NoError(t, err)
require.Equal(t, int64(1), rows)

err = DBCleanup(ctx, connStr, false, dbComposesRetentionMonths)
require.NoError(t, err)

rows, err = d.ExpiredComposesCount(ctx, emailRetentionDate)
require.NoError(t, err)
require.Equal(t, int64(0), rows)

rows, err = d.ExpiredClonesCount(ctx, emailRetentionDate)
require.NoError(t, err)
require.Equal(t, int64(0), rows)
}

// testVacuum test if no vacuum is performed on a clean database
Expand Down
12 changes: 0 additions & 12 deletions internal/clients/composer/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,3 @@ func (cc *ComposerClient) Compose(ctx context.Context, compose ComposeRequest) (
func (cc *ComposerClient) OpenAPI(ctx context.Context) (*http.Response, error) {
return cc.request(ctx, "GET", fmt.Sprintf("%s/openapi", cc.composerURL), nil, nil)
}

func (cc *ComposerClient) CloneCompose(ctx context.Context, id uuid.UUID, clone CloneComposeBody) (*http.Response, error) {
buf, err := json.Marshal(clone)
if err != nil {
return nil, err
}
return cc.request(ctx, "POST", fmt.Sprintf("%s/composes/%s/clone", cc.composerURL, id), contentHeaders, bytes.NewReader(buf))
}

func (cc *ComposerClient) CloneStatus(ctx context.Context, id uuid.UUID) (*http.Response, error) {
return cc.request(ctx, "GET", fmt.Sprintf("%s/clones/%s", cc.composerURL, id), nil, nil)
}
117 changes: 0 additions & 117 deletions internal/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (

// ErrComposeEntryNotFound occurs when no compose request is found for a user.
var ErrComposeEntryNotFound = errors.New("compose entry not found")
var ErrCloneNotFound = errors.New("clone not found")
var ErrBlueprintNotFound = errors.New("blueprint not found")
var ErrAffectedRowsMismatch = errors.New("unexpected affected rows")

Expand All @@ -37,13 +36,6 @@ type ComposeWithBlueprintVersion struct {
BlueprintVersion *int
}

type CloneEntry struct {
Id uuid.UUID
ComposeId uuid.UUID
Request json.RawMessage
CreatedAt time.Time
}

type BlueprintEntry struct {
Id uuid.UUID
VersionId uuid.UUID
Expand Down Expand Up @@ -83,10 +75,6 @@ type DB interface {
CountBlueprintComposesSince(ctx context.Context, orgId string, blueprintId uuid.UUID, blueprintVersion *int, since time.Duration, ignoreImageTypes []string) (int, error)
DeleteCompose(ctx context.Context, jobId uuid.UUID, orgId string) error

InsertClone(ctx context.Context, composeId, cloneId uuid.UUID, request json.RawMessage) error
GetClonesForCompose(ctx context.Context, composeId uuid.UUID, orgId string, limit, offset int) ([]CloneEntry, int, error)
GetClone(ctx context.Context, id uuid.UUID, orgId string) (*CloneEntry, error)

InsertBlueprint(ctx context.Context, id uuid.UUID, versionId uuid.UUID, orgID, accountNumber, name, description string, body json.RawMessage, metadata json.RawMessage, serviceSnapshots json.RawMessage) error
GetBlueprint(ctx context.Context, id uuid.UUID, orgID string, version *int) (*BlueprintEntry, error)
UpdateBlueprint(ctx context.Context, id uuid.UUID, blueprintId uuid.UUID, orgId string, name string, description string, body json.RawMessage, serviceSnapshots json.RawMessage) error
Expand Down Expand Up @@ -137,36 +125,6 @@ const (
SET deleted = TRUE
WHERE org_id=$1 AND job_id=$2
`

sqlInsertClone = `
INSERT INTO clones(id, compose_id, request, created_at)
VALUES($1, $2, $3, CURRENT_TIMESTAMP)`

sqlGetClonesForCompose = `
SELECT clones.id, clones.compose_id, clones.request, clones.created_at
FROM clones
WHERE clones.compose_id=$1 AND $1 in (
SELECT composes.job_id
FROM composes
WHERE composes.org_id=$2)
ORDER BY created_at DESC
LIMIT $3 OFFSET $4`

sqlCountClonesForCompose = `
SELECT COUNT(*)
FROM clones
WHERE clones.compose_id=$1 AND $1 in (
SELECT composes.job_id
FROM composes
WHERE composes.org_id=$2)`

sqlGetClone = `
SELECT clones.id, clones.compose_id, clones.request, clones.created_at
FROM clones
WHERE clones.id=$1 AND clones.compose_id in (
SELECT composes.job_id
FROM composes
WHERE composes.org_id=$2)`
)

func InitDBConnectionPool(ctx context.Context, connStr string) (DB, error) {
Expand Down Expand Up @@ -323,78 +281,3 @@ func (db *dB) DeleteCompose(ctx context.Context, jobId uuid.UUID, orgId string)

return err
}

func (db *dB) InsertClone(ctx context.Context, composeId, cloneId uuid.UUID, request json.RawMessage) error {
conn, err := db.Pool.Acquire(ctx)
if err != nil {
return err
}
defer conn.Release()

_, err = conn.Exec(ctx, sqlInsertClone, cloneId, composeId, request)
return err
}

func (db *dB) GetClonesForCompose(ctx context.Context, composeId uuid.UUID, orgId string, limit, offset int) ([]CloneEntry, int, error) {
conn, err := db.Pool.Acquire(ctx)
if err != nil {
return nil, 0, err
}
defer conn.Release()

rows, err := conn.Query(ctx, sqlGetClonesForCompose, composeId, orgId, limit, offset)
if err != nil {
return nil, 0, err
}
defer rows.Close()

var clones []CloneEntry
for rows.Next() {
var id uuid.UUID
var composeID uuid.UUID
var request json.RawMessage
var createdAt time.Time
err = rows.Scan(&id, &composeID, &request, &createdAt)
if err != nil {
return nil, 0, err
}
clones = append(clones, CloneEntry{
id,
composeID,
request,
createdAt,
})
}
if err = rows.Err(); err != nil {
return nil, 0, err
}

var count int
err = conn.QueryRow(ctx, sqlCountClonesForCompose, composeId, orgId).Scan(&count)
if err != nil {
return nil, 0, err
}

return clones, count, nil

}

func (db *dB) GetClone(ctx context.Context, id uuid.UUID, orgId string) (*CloneEntry, error) {
conn, err := db.Pool.Acquire(ctx)
if err != nil {
return nil, err
}
defer conn.Release()

var clone CloneEntry
err = conn.QueryRow(ctx, sqlGetClone, id, orgId).Scan(&clone.Id, &clone.ComposeId, &clone.Request, &clone.CreatedAt)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return nil, ErrCloneNotFound
} else {
return nil, err
}
}

return &clone, nil
}
2 changes: 2 additions & 0 deletions internal/db/migrations-tern/015_drop_table_clones.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- Drop the clones table as cloning support is being removed
DROP TABLE IF EXISTS clones;
Loading
Loading