Skip to content

Commit

Permalink
agent_handler: Add wrapper to log request and response error
Browse files Browse the repository at this point in the history
Signed-off-by: Cosmin Tupangiu <[email protected]>
  • Loading branch information
tupyy authored and machacekondra committed Feb 12, 2025
1 parent b6567b5 commit a2de742
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 23 deletions.
2 changes: 1 addition & 1 deletion internal/api_server/agentserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (s *AgentServer) Run(ctx context.Context) error {
oapimiddleware.OapiRequestValidatorWithOptions(swagger, &oapiOpts),
)

h := service.NewAgentServiceHandler(s.store, s.evWriter)
h := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s.store, s.evWriter))
server.HandlerFromMux(server.NewStrictHandler(h, nil), router)
srv := http.Server{Addr: s.cfg.Service.Address, Handler: router}

Expand Down
29 changes: 15 additions & 14 deletions internal/service/agent/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"context"
"encoding/json"
"errors"
"fmt"
"io"

api "github.com/kubev2v/migration-planner/api/v1alpha1"
Expand Down Expand Up @@ -46,39 +47,39 @@ func (h *AgentServiceHandler) UpdateSourceInventory(ctx context.Context, request
source, err := h.store.Source().Get(ctx, request.Id)
if err != nil {
if errors.Is(err, store.ErrRecordNotFound) {
return agentServer.UpdateSourceInventory404JSONResponse{}, nil
return agentServer.UpdateSourceInventory404JSONResponse{}, fmt.Errorf("failed to find source with id: %s", request.Id)
}
return agentServer.UpdateSourceInventory500JSONResponse{}, nil
return agentServer.UpdateSourceInventory500JSONResponse{}, fmt.Errorf("failed to fetch source: %s", err)
}

agent, err := h.store.Agent().Get(ctx, request.Body.AgentId)
if err != nil && !errors.Is(err, store.ErrRecordNotFound) {
return agentServer.UpdateSourceInventory400JSONResponse{}, nil
return agentServer.UpdateSourceInventory400JSONResponse{}, fmt.Errorf("failed to fetch the agent: %s", err)
}

if agent == nil {
return agentServer.UpdateSourceInventory400JSONResponse{}, nil
return agentServer.UpdateSourceInventory400JSONResponse{}, fmt.Errorf("failed to find agent %s", request.Body.AgentId)
}

// agent must be under organization's scope
if auth.MustHaveUser(ctx).Organization != agent.OrgID {
return agentServer.UpdateSourceInventory403JSONResponse{}, nil
return agentServer.UpdateSourceInventory403JSONResponse{}, fmt.Errorf("user does not below to the same organization as the agent %q", agent.OrgID)
}

// don't allow updates of sources not associated with this agent
if request.Id != agent.SourceID {
return agentServer.UpdateSourceInventory400JSONResponse{}, nil
return agentServer.UpdateSourceInventory400JSONResponse{}, fmt.Errorf("request id %q does not match the agent source id %q", request.Id, agent.SourceID)
}

// if source has already a vCenter check if it's the same
if source.VCenterID != "" && source.VCenterID != request.Body.Inventory.Vcenter.Id {
return agentServer.UpdateSourceInventory400JSONResponse{}, nil
return agentServer.UpdateSourceInventory400JSONResponse{}, fmt.Errorf("source's vCenter %q does not match the new inventory vCenterID %q", source.VCenterID, request.Body.Inventory.Vcenter.Id)
}

source = mappers.UpdateSourceFromApi(source, request.Body.Inventory)
updatedSource, err := h.store.Source().Update(ctx, *source)
if err != nil {
return agentServer.UpdateSourceInventory500JSONResponse{}, nil
return agentServer.UpdateSourceInventory500JSONResponse{}, fmt.Errorf("failed to update source: %s", err)
}

kind, inventoryEvent := h.newInventoryEvent(request.Id.String(), request.Body.Inventory)
Expand All @@ -102,21 +103,21 @@ func (h *AgentServiceHandler) UpdateAgentStatus(ctx context.Context, request age
_, err := h.store.Source().Get(ctx, request.Body.SourceId)
if err != nil {
if errors.Is(err, store.ErrRecordNotFound) {
return agentServer.UpdateAgentStatus400JSONResponse{}, nil
return agentServer.UpdateAgentStatus400JSONResponse{}, fmt.Errorf("failed to find source with id: %s", request.Id)
}
return agentServer.UpdateAgentStatus500JSONResponse{}, nil
return agentServer.UpdateAgentStatus500JSONResponse{}, fmt.Errorf("failed to fetch source: %s", err)
}

agent, err := h.store.Agent().Get(ctx, request.Id)
if err != nil && !errors.Is(err, store.ErrRecordNotFound) {
return agentServer.UpdateAgentStatus500JSONResponse{}, nil
return agentServer.UpdateAgentStatus500JSONResponse{}, fmt.Errorf("failed to fetch the agent: %s", err)
}

if agent == nil {
newAgent := mappers.AgentFromApi(request.Id, user, request.Body)
a, err := h.store.Agent().Create(ctx, newAgent)
if err != nil {
return agentServer.UpdateAgentStatus400JSONResponse{}, nil
return agentServer.UpdateAgentStatus400JSONResponse{}, fmt.Errorf("failed to create the agent: %s", err)
}

kind, agentEvent := h.newAgentEvent(mappers.AgentToApi(*a))
Expand All @@ -128,11 +129,11 @@ func (h *AgentServiceHandler) UpdateAgentStatus(ctx context.Context, request age
}

if user.Organization != agent.OrgID {
return agentServer.UpdateAgentStatus403JSONResponse{}, nil
return agentServer.UpdateAgentStatus403JSONResponse{}, fmt.Errorf("user does not below to the same organization as the agent %q", agent.OrgID)
}

if _, err := h.store.Agent().Update(ctx, mappers.AgentFromApi(request.Id, user, request.Body)); err != nil {
return agentServer.UpdateAgentStatus400JSONResponse{}, nil
return agentServer.UpdateAgentStatus400JSONResponse{}, fmt.Errorf("failed to update agent: %s", err)
}

kind, agentEvent := h.newAgentEvent(mappers.AgentToApi(*agent))
Expand Down
16 changes: 8 additions & 8 deletions internal/service/agent/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateAgentStatus(ctx, server.UpdateAgentStatusRequestObject{
Id: agentID,
Body: &apiAgent.UpdateAgentStatusJSONRequestBody{
Expand Down Expand Up @@ -114,7 +114,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateAgentStatus(ctx, server.UpdateAgentStatusRequestObject{
Id: agentID,
Body: &apiAgent.UpdateAgentStatusJSONRequestBody{
Expand Down Expand Up @@ -167,7 +167,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateAgentStatus(ctx, server.UpdateAgentStatusRequestObject{
Id: agentID,
Body: &apiAgent.UpdateAgentStatusJSONRequestBody{
Expand All @@ -193,7 +193,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateAgentStatus(ctx, server.UpdateAgentStatusRequestObject{
Id: uuid.New(),
Body: &apiAgent.UpdateAgentStatusJSONRequestBody{
Expand Down Expand Up @@ -230,7 +230,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateSourceInventory(ctx, server.UpdateSourceInventoryRequestObject{
Id: sourceID,
Body: &apiAgent.SourceStatusUpdate{
Expand Down Expand Up @@ -276,7 +276,7 @@ var _ = Describe("agent service", Ordered, func() {

// first agent request
eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateSourceInventory(ctx, server.UpdateSourceInventoryRequestObject{
Id: sourceID,
Body: &apiAgent.SourceStatusUpdate{
Expand Down Expand Up @@ -337,7 +337,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateSourceInventory(ctx, server.UpdateSourceInventoryRequestObject{
Id: firstSourceID,
Body: &apiAgent.SourceStatusUpdate{
Expand All @@ -364,7 +364,7 @@ var _ = Describe("agent service", Ordered, func() {
ctx := auth.NewUserContext(context.TODO(), user)

eventWriter := newTestWriter()
srv := service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter))
srv := service.NewAgentServiceHandlerLogger(service.NewAgentServiceHandler(s, events.NewEventProducer(eventWriter)))
resp, err := srv.UpdateSourceInventory(ctx, server.UpdateSourceInventoryRequestObject{
Id: firstSourceID,
Body: &apiAgent.SourceStatusUpdate{
Expand Down
52 changes: 52 additions & 0 deletions internal/service/agent/wrapper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package service

import (
"context"

agentServer "github.com/kubev2v/migration-planner/internal/api/server/agent"
"go.uber.org/zap"
)

type AgentServiceHandlerLogger struct {
delegate *AgentServiceHandler
}

func NewAgentServiceHandlerLogger(delegate *AgentServiceHandler) *AgentServiceHandlerLogger {
return &AgentServiceHandlerLogger{delegate: delegate}
}

func (h *AgentServiceHandlerLogger) UpdateSourceInventory(ctx context.Context, request agentServer.UpdateSourceInventoryRequestObject) (agentServer.UpdateSourceInventoryResponseObject, error) {
zap.S().Named("agent_handler").Debugw("update source inventory request",
"source_id", request.Id,
"agent_id", request.Body.AgentId,
"inventory", request.Body.Inventory,
)

resp, err := h.delegate.UpdateSourceInventory(ctx, request)
if err != nil {
zap.S().Named("agent_handler").Errorf("failed to update source inventory: %s", err)
}

return resp, nil
}

func (h *AgentServiceHandlerLogger) UpdateAgentStatus(ctx context.Context, request agentServer.UpdateAgentStatusRequestObject) (agentServer.UpdateAgentStatusResponseObject, error) {
zap.S().Named("agent_handler").Debugw("update agent status request",
"agent_id", request.Id,
"source_id", request.Body.SourceId,
"credential_url", request.Body.CredentialUrl,
"status", request.Body.Status,
"version", request.Body.Version,
)

resp, err := h.delegate.UpdateAgentStatus(ctx, request)
if err != nil {
zap.S().Named("agent_handler").Errorf("failed to update agent status: %s", err)
}

return resp, nil
}

func (h *AgentServiceHandlerLogger) Health(ctx context.Context, request agentServer.HealthRequestObject) (agentServer.HealthResponseObject, error) {
return h.delegate.Health(ctx, request)
}

0 comments on commit a2de742

Please sign in to comment.