Skip to content

Commit 3c25014

Browse files
tommytroenybelMekk
andcommitted
refactor: register workload with upsert instead of crud
* add constraint on name, type, ns and cluster in workload table * implement management in client Co-authored-by: ybelmekk <[email protected]>
1 parent df5549f commit 3c25014

File tree

17 files changed

+354
-416
lines changed

17 files changed

+354
-416
lines changed

cmd/api/main.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package main
33
import (
44
"context"
55
"fmt"
6+
"github.com/nais/v13s/internal/api/grpcmgmt"
67
"github.com/nais/v13s/internal/api/grpcvulnerabilities"
8+
"github.com/nais/v13s/pkg/api/vulnerabilities/management"
79
"net"
810
"os"
911
"os/signal"
@@ -51,7 +53,8 @@ func main() {
5153
log.Fatalf("Failed to create DependencyTrack client: %v", err)
5254
}
5355

54-
vulnerabilities.RegisterVulnerabilitiesServer(grpcServer, &grpcvulnerabilities.Server{DpClient: dpClient, Db: db})
56+
vulnerabilities.RegisterVulnerabilitiesServer(grpcServer, &grpcvulnerabilities.Server{Db: db})
57+
management.RegisterManagementServer(grpcServer, &grpcmgmt.Server{Db: db, DpClient: dpClient})
5558

5659
stop := make(chan os.Signal, 1)
5760
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)

cmd/client/main.go

+27
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"context"
55
"fmt"
6+
"github.com/nais/v13s/pkg/api/vulnerabilities/management"
67

78
"github.com/nais/v13s/pkg/api/vulnerabilities"
89
"google.golang.org/grpc"
@@ -18,6 +19,8 @@ func main() {
1819
panic(err)
1920
}
2021

22+
workloadManagement(c)
23+
2124
resp, err := c.ListVulnerabilitySummaries(
2225
context.Background(),
2326
vulnerabilities.ClusterFilter("prod-gcp"),
@@ -60,6 +63,30 @@ func main() {
6063
fmt.Printf("summary: %v\n", resp2.VulnerabilitySummary)
6164
}
6265

66+
func workloadManagement(c vulnerabilities.Client) {
67+
ctx := context.Background()
68+
_, err := c.RegisterWorkload(
69+
ctx,
70+
&management.RegisterWorkloadRequest{
71+
Cluster: "dev-fss",
72+
Namespace: "nais-system",
73+
Workload: "aivenator",
74+
WorkloadType: "app",
75+
ImageName: "europe-north1-docker.pkg.dev/nais-io/nais/images/aivenator",
76+
ImageTag: "2025-01-22-124805-9221180",
77+
Metadata: &management.Metadata{
78+
Labels: map[string]string{
79+
"workflow": "deploy",
80+
},
81+
},
82+
},
83+
)
84+
if err != nil {
85+
panic(err)
86+
}
87+
88+
}
89+
6390
func handle(resp *vulnerabilities.ListVulnerabilitySummariesResponse, err error) {
6491
if err != nil {
6592
panic(err)

internal/api/grpcmgmt/server.go

+22-18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package grpcmgmt
22

33
import (
44
"context"
5+
"errors"
6+
"github.com/jackc/pgx/v5"
57
"github.com/nais/v13s/internal/database/sql"
68
"github.com/nais/v13s/internal/dependencytrack"
79
"github.com/nais/v13s/pkg/api/vulnerabilities/management"
@@ -15,24 +17,31 @@ type Server struct {
1517
Db *sql.Queries
1618
}
1719

18-
func (s *Server) CreateWorkload(ctx context.Context, request *management.CreateWorkloadRequest) (*management.CreateWorkloadResponse, error) {
20+
func (s *Server) RegisterWorkload(ctx context.Context, request *management.RegisterWorkloadRequest) (*management.RegisterWorkloadResponse, error) {
1921
metadata := map[string]string{}
2022
if request.Metadata != nil {
2123
metadata = request.Metadata.Labels
2224
}
2325

24-
imageParams := sql.CreateImageParams{
25-
Name: request.ImageName,
26-
Tag: request.ImageTag,
27-
Metadata: metadata,
28-
}
29-
30-
_, err := s.Db.CreateImage(ctx, imageParams)
31-
if err != nil {
26+
_, err := s.Db.GetImage(ctx, sql.GetImageParams{
27+
Name: request.ImageName,
28+
Tag: request.ImageTag,
29+
})
30+
31+
if errors.Is(err, pgx.ErrNoRows) {
32+
_, err = s.Db.CreateImage(ctx, sql.CreateImageParams{
33+
Name: request.ImageName,
34+
Tag: request.ImageTag,
35+
Metadata: metadata,
36+
})
37+
if err != nil {
38+
return nil, err
39+
}
40+
} else if err != nil {
3241
return nil, err
3342
}
3443

35-
w := sql.CreateWorkloadParams{
44+
w := sql.UpsertWorkloadParams{
3645
Name: request.Workload,
3746
WorkloadType: request.WorkloadType,
3847
Namespace: request.Namespace,
@@ -41,7 +50,7 @@ func (s *Server) CreateWorkload(ctx context.Context, request *management.CreateW
4150
ImageTag: request.ImageTag,
4251
}
4352

44-
_, err = s.Db.CreateWorkload(ctx, w)
53+
err = s.Db.UpsertWorkload(ctx, w)
4554
if err != nil {
4655
return nil, err
4756
}
@@ -51,8 +60,8 @@ func (s *Server) CreateWorkload(ctx context.Context, request *management.CreateW
5160
return nil, err
5261
}
5362

54-
response := &management.CreateWorkloadResponse{}
55-
if p.Metrics == nil {
63+
response := &management.RegisterWorkloadResponse{}
64+
if p == nil || p.Metrics == nil {
5665
return response, nil
5766
}
5867

@@ -77,8 +86,3 @@ func (s *Server) CreateWorkload(ctx context.Context, request *management.CreateW
7786

7887
return response, err
7988
}
80-
81-
func (s *Server) UpdateWorkload(ctx context.Context, request *management.UpdateWorkloadRequest) (*management.UpdateWorkloadResponse, error) {
82-
//TODO implement me
83-
panic("implement me")
84-
}

internal/api/grpcvulnerabilities/server.go

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ func (s *Server) ListVulnerabilitySummaries(ctx context.Context, request *vulner
7070
return response, nil
7171
}
7272

73+
// TODO: if no summaries are found, handle this case by not returning the summary? and maybe handle it in the sql query, right now we return 0 on all fields
74+
// TLDR: make distinction between no summary found and summary found with 0 values
7375
func (s *Server) GetVulnerabilitySummary(ctx context.Context, request *vulnerabilities.GetVulnerabilitySummaryRequest) (*vulnerabilities.GetVulnerabilitySummaryResponse, error) {
7476
sum, err := s.Db.GetVulnerabilitySummary(ctx, sql.GetVulnerabilitySummaryParams{
7577
Cluster: request.Filter.Cluster,

internal/database/migrations/0001_schema.sql

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ CREATE TABLE workloads
2626
workload_type TEXT NOT NULL,
2727
namespace TEXT NOT NULL,
2828
cluster TEXT NOT NULL,
29+
CONSTRAINT workload_id UNIQUE (name, workload_type, namespace, cluster),
2930
image_name TEXT NOT NULL,
3031
image_tag TEXT NOT NULL,
3132
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,

internal/database/queries/image.sql

+3
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ RETURNING
77
*
88
;
99

10+
-- name: GetImage :one
11+
SELECT * FROM images WHERE name = @name AND tag = @tag;
12+
+30-7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
1+
-- name: UpsertWorkload :exec
2+
INSERT INTO workloads(
3+
name,
4+
workload_type,
5+
namespace,
6+
cluster,
7+
image_name,
8+
image_tag
9+
)
10+
VALUES (
11+
@name,
12+
@workload_type,
13+
@namespace,
14+
@cluster,
15+
@image_name,
16+
@image_tag
17+
) ON CONFLICT
18+
ON CONSTRAINT workload_id DO
19+
UPDATE
20+
SET
21+
image_name = @image_name,
22+
image_tag = @image_tag
23+
;
24+
125
-- name: CreateWorkload :one
226
INSERT INTO
327
workloads (name, workload_type, namespace, cluster, image_name, image_tag)
@@ -10,14 +34,13 @@ RETURNING
1034
-- name: UpdateWorkload :one
1135
UPDATE workloads
1236
SET
13-
name = COALESCE(sqlc.narg(name), name),
14-
workload_type = COALESCE(sqlc.narg(workload_type), workload_type),
15-
namespace = COALESCE(sqlc.narg(namespace), namespace),
16-
cluster = COALESCE(sqlc.narg(cluster), cluster),
17-
image_name = COALESCE(sqlc.narg(image_name), image_name),
18-
image_tag = COALESCE(sqlc.narg(image_tag), image_tag)
37+
image_name = @image_name,
38+
image_tag = @image_tag
1939
WHERE
20-
workloads.id = @id
40+
cluster = @cluster AND
41+
namespace = @namespace AND
42+
workload_type = @workload_type AND
43+
name = @name
2144
RETURNING
2245
*
2346
;

internal/database/sql/image.sql.go

+22
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/sql/querier.go

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/sql/workloads.sql.go

+61-21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)