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
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/infinibandinterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func (gaibih GetAllInfiniBandInterfaceHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gaibih.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant", nil)
Expand Down
6 changes: 3 additions & 3 deletions rest-api/api/pkg/api/handler/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -3963,7 +3963,7 @@ func (gih GetInstanceHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gih.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant", nil)
Expand Down Expand Up @@ -4208,7 +4208,7 @@ func (gaih GetAllInstanceHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gaih.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down Expand Up @@ -5068,7 +5068,7 @@ func (gisdh GetInstanceStatusDetailsHandler) Handle(c echo.Context) error {

// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gisdh.dbSession)
tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant", nil)
Expand Down
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/nvlinkinterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ func (gaish GetAllNVLinkInterfaceHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gaish.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant", nil)
Expand Down
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/serviceaccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func (gcsah GetCurrentServiceAccountHandler) Handle(c echo.Context) error {

var tn *cdbm.Tenant

tns, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tns, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org, DB error", nil)
Expand Down
4 changes: 3 additions & 1 deletion rest-api/api/pkg/api/handler/serviceaccount_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (
"github.com/labstack/echo/v4"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

cutil "github.com/NVIDIA/infra-controller/rest-api/common/pkg/util"
)

func TestServiceAccountHandler_GetCurrent(t *testing.T) {
Expand Down Expand Up @@ -124,7 +126,7 @@ func TestServiceAccountHandler_GetCurrent(t *testing.T) {
ips, ipErr := ipDAO.GetAllByOrg(ctx, nil, org1, nil)
require.NoError(t, ipErr)
require.Len(t, ips, 1)
tns, tnErr := tnDAO.GetAllByOrg(ctx, nil, org1, nil)
tns, _, tnErr := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org1}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
require.NoError(t, tnErr)
require.Len(t, tns, 1)

Expand Down
8 changes: 4 additions & 4 deletions rest-api/api/pkg/api/handler/sshkey.go
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ func (uskh UpdateSSHKeyHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(uskh.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down Expand Up @@ -586,7 +586,7 @@ func (gskh GetSSHKeyHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gskh.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down Expand Up @@ -706,7 +706,7 @@ func (gaskh GetAllSSHKeyHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gaskh.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down Expand Up @@ -852,7 +852,7 @@ func (dskh DeleteSSHKeyHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(dskh.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down
4 changes: 2 additions & 2 deletions rest-api/api/pkg/api/handler/tenant.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func (gcth GetCurrentTenantHandler) Handle(c echo.Context) error {

// Re-read inside the tx so the existence check and any create/update
// happen against the same locked snapshot.
tns, derr := tnDAO.GetAllByOrg(ctx, tx, org, nil)
tns, _, derr := tnDAO.GetAll(ctx, tx, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if derr != nil {
logger.Error().Err(derr).Msg("error retrieving Tenant for this org")
return nil, cutil.NewAPIError(http.StatusInternalServerError, "Failed to retrieve current Tenant", nil)
Expand Down Expand Up @@ -274,7 +274,7 @@ func (gcth GetCurrentTenantStatsHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gcth.dbSession)

tns, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tns, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant", nil)
Expand Down
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/tenantaccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ func (ctah CreateTenantAccountHandler) Handle(c echo.Context) error {
tenantOrg = &tenant.Org
} else {
tenantOrg = apiRequest.TenantOrg
tenants, serr := tnDAO.GetAllByOrg(ctx, nil, *tenantOrg, nil)
tenants, _, serr := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{*tenantOrg}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if serr != nil {
logger.Warn().Err(err).Msg("error retrieving tenant")
return cutil.NewAPIErrorResponse(c, http.StatusBadRequest, "Failed to retrieve Tenant specified in request", nil)
Expand Down
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/util/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func GetInfrastructureProviderForOrg(ctx context.Context, tx *cdb.Tx, dbSession
func GetTenantForOrg(ctx context.Context, tx *cdb.Tx, dbSession *cdb.Session, org string) (*cdbm.Tenant, error) {
tnDAO := cdbm.NewTenantDAO(dbSession)

ts, err := tnDAO.GetAllByOrg(ctx, tx, org, nil)
ts, _, err := tnDAO.GetAll(ctx, tx, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion rest-api/api/pkg/api/handler/vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -1423,7 +1423,7 @@ func (gavh GetAllVPCHandler) Handle(c echo.Context) error {
// Get Tenant for this org
tnDAO := cdbm.NewTenantDAO(gavh.dbSession)

tenants, err := tnDAO.GetAllByOrg(ctx, nil, org, nil)
tenants, _, err := tnDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{Orgs: []string{org}}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenant for this org")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenant for org", nil)
Expand Down
160 changes: 154 additions & 6 deletions rest-api/api/pkg/api/handler/vpcpeering.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ func (cvph CreateVpcPeeringHandler) Handle(c echo.Context) error {
}

// Update API model with best-known status.
apiVpcPeering := model.NewAPIVpcPeering(*vpcPeering)
apiVpcPeering := model.NewAPIVpcPeering(*vpcPeering, nil)
apiVpcPeering.Status = status

logger.Info().Msg("finishing API handler")
Expand Down Expand Up @@ -432,6 +432,9 @@ func NewGetAllVpcPeeringHandler(dbSession *cdb.Session, tc tclient.Client, cfg *
// @Param org path string true "Name of NGC organization"
// @Param siteId query string false "Filter by Site ID"
// @Param isMultiTenant query bool false "Filter by single-tenant or multi-tenant peerings"
// @Param status query string false "Filter by status (repeatable for multiple values)"
// @Param vpcId query string false "Filter by VPC ID involved in the peering (as vpc1 or vpc2)"
// @Param peerTenantId query string false "Filter by tenant ID of a VPC involved in the peering (repeatable for multiple values)"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
// @Param includeRelation query string false "Related entities to include in response e.g. 'Vpc1', 'Vpc2', 'Site'"
// @Param pageNumber query integer false "Page number of results returned"
// @Param pageSize query integer false "Number of results per page"
Expand Down Expand Up @@ -524,6 +527,95 @@ func (gavph GetAllVpcPeeringHandler) Handle(c echo.Context) error {
return cutil.NewAPIErrorResponse(c, http.StatusBadRequest, errMsg, nil)
}

// Get status from query param
qStatuses := qParams["status"]
if len(qStatuses) > 0 {
gavph.tracerSpan.SetAttribute(handlerSpan, attribute.StringSlice("status", qStatuses), logger)
for _, status := range qStatuses {
if !cdbm.VpcPeeringStatusMap[status] {
logger.Warn().Msg(fmt.Sprintf("invalid value in status query: %v", status))
return cutil.NewAPIErrorResponse(c, http.StatusBadRequest, fmt.Sprintf("Invalid Status value %v in query", status), nil)
}
filterInput.Statuses = append(filterInput.Statuses, status)
}
}

// Get vpcId from query param
vpcIDStrs := qParams["vpcId"]
if len(vpcIDStrs) > 0 {
gavph.tracerSpan.SetAttribute(handlerSpan, attribute.StringSlice("vpcId", vpcIDStrs), logger)
vpcIDs := make([]uuid.UUID, 0, len(vpcIDStrs))
for _, vpcIDStr := range vpcIDStrs {
vpcID, err := uuid.Parse(vpcIDStr)
if err != nil {
logger.Warn().Msg(fmt.Sprintf("invalid value in vpcId query: %v", vpcIDStr))
return cutil.NewAPIErrorResponse(c, http.StatusBadRequest, fmt.Sprintf("Invalid VPC ID %v in query", vpcIDStr), nil)
}
vpcIDs = append(vpcIDs, vpcID)
}
vpcDAO := cdbm.NewVpcDAO(gavph.dbSession)
vpcs, _, err := vpcDAO.GetAll(
ctx,
nil,
cdbm.VpcFilterInput{VpcIDs: vpcIDs},
cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)},
nil,
)
if err != nil {
logger.Error().Err(err).Msg("error retrieving VPCs from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve VPCs specified in query", nil)
}
vpcIDsMap := make(map[uuid.UUID]struct{}, len(vpcs))
for _, vpc := range vpcs {
vpcIDsMap[vpc.ID] = struct{}{}
}
for _, vpcID := range vpcIDs {
if _, ok := vpcIDsMap[vpcID]; !ok {
logger.Warn().Msg(fmt.Sprintf("could not find VPC with ID %v specified in query", vpcID))
return cutil.NewAPIErrorResponse(c, http.StatusNotFound, fmt.Sprintf("Could not find VPC with ID %v specified in query", vpcID), nil)
}
}
filterInput.VpcIDs = vpcIDs
}

// Get peerTenantId from query param
peerTenantIDStrs := qParams["peerTenantId"]
if len(peerTenantIDStrs) > 0 {
gavph.tracerSpan.SetAttribute(handlerSpan, attribute.StringSlice("peerTenantId", peerTenantIDStrs), logger)
peerTenantIDs := make([]uuid.UUID, 0, len(peerTenantIDStrs))
for _, peerTenantIDStr := range peerTenantIDStrs {
peerTenantID, err := uuid.Parse(peerTenantIDStr)
if err != nil {
logger.Warn().Msg(fmt.Sprintf("invalid value in peerTenantId query: %v", peerTenantIDStr))
return cutil.NewAPIErrorResponse(c, http.StatusBadRequest, fmt.Sprintf("Invalid peer tenant ID %v in query", peerTenantIDStr), nil)
}
peerTenantIDs = append(peerTenantIDs, peerTenantID)
}
tnDAO := cdbm.NewTenantDAO(gavph.dbSession)
peerTenants, _, err := tnDAO.GetAll(
ctx,
nil,
cdbm.TenantFilterInput{TenantIDs: peerTenantIDs},
cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)},
nil,
)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenants from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve tenants specified in query", nil)
}
peerTenantIDsMap := make(map[uuid.UUID]struct{}, len(peerTenants))
for _, peerTenant := range peerTenants {
peerTenantIDsMap[peerTenant.ID] = struct{}{}
}
for _, peerTenantID := range peerTenantIDs {
if _, ok := peerTenantIDsMap[peerTenantID]; !ok {
logger.Warn().Msg(fmt.Sprintf("could not find tenant with ID %v specified in query", peerTenantID))
return cutil.NewAPIErrorResponse(c, http.StatusNotFound, fmt.Sprintf("Could not find tenant with ID %v specified in query", peerTenantID), nil)
}
}
filterInput.PeerTenantIDs = peerTenantIDs
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

// Validate pagination request
pageRequest := pagination.PageRequest{}
err := c.Bind(&pageRequest)
Expand Down Expand Up @@ -558,16 +650,47 @@ func (gavph GetAllVpcPeeringHandler) Handle(c echo.Context) error {
Offset: pageRequest.Offset,
OrderBy: pageRequest.OrderBy,
}

// If VPC ID or peer tenant ID is specified, include the VPC and tenant relations
if len(vpcIDStrs) > 0 || len(peerTenantIDStrs) > 0 {
for _, relation := range []string{cdbm.Vpc1RelationName, cdbm.Vpc2RelationName, cdbm.TenantRelationName} {
if !slices.Contains(qIncludeRelations, relation) {
qIncludeRelations = append(qIncludeRelations, relation)
}
}
}
vpcPeerings, total, err := vpcPeeringDAO.GetAll(ctx, nil, filterInput, vpcPeeringPageInput, qIncludeRelations)
if err != nil {
logger.Error().Err(err).Msg("error retrieving VPC Peerings from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve VPC Peerings, DB error", nil)
}

dbMappedPeeringTenants := make(map[uuid.UUID]*cdbm.Tenant)
vpcPeeringTenantIDs := []uuid.UUID{}
for _, vpcPeering := range vpcPeerings {
if vpcPeering.Vpc1 != nil {
vpcPeeringTenantIDs = append(vpcPeeringTenantIDs, vpcPeering.Vpc1.TenantID)
}
if vpcPeering.Vpc2 != nil {
vpcPeeringTenantIDs = append(vpcPeeringTenantIDs, vpcPeering.Vpc2.TenantID)
}
}
if len(vpcPeeringTenantIDs) > 0 {
tenantDAO := cdbm.NewTenantDAO(gavph.dbSession)
tenants, _, err := tenantDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{TenantIDs: vpcPeeringTenantIDs}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenants from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenants, DB error", nil)
}
for _, tenant := range tenants {
dbMappedPeeringTenants[tenant.ID] = &tenant
}
}

// Build API response
apiVpcPeerings := make([]model.APIVpcPeering, len(vpcPeerings))
for i, vpcPeering := range vpcPeerings {
apiVpcPeerings[i] = model.NewAPIVpcPeering(vpcPeering)
apiVpcPeerings[i] = model.NewAPIVpcPeering(vpcPeering, dbMappedPeeringTenants)
}

// Create pagination response header
Expand Down Expand Up @@ -614,7 +737,7 @@ func NewGetVpcPeeringHandler(dbSession *cdb.Session, tc tclient.Client, cfg *con
// @Security ApiKeyAuth
// @Param org path string true "Name of NGC organization"
// @Param id path string true "ID of VPC Peering"
// @Param includeRelation query string false "Related entities to include in response e.g. 'Vpc1', 'Vpc2', 'Site'""
// @Param includeRelation query string false "Related entities to include in response e.g. 'Vpc1', 'Vpc2', 'Site', 'Tenant'""
// @Success 200 {object} model.APIVpcPeering
// @Router /v2/org/{org}/nico/vpc-peering/{id} [get]
func (gvph GetVpcPeeringHandler) Handle(c echo.Context) error {
Expand Down Expand Up @@ -671,15 +794,16 @@ func (gvph GetVpcPeeringHandler) Handle(c echo.Context) error {
if !providerAuthorized && tenant != nil {
// Get two VPCs of the VPC Peering
vpcDAO := cdbm.NewVpcDAO(gvph.dbSession)
vpc1, err := vpcDAO.GetByID(ctx, nil, vpcPeering.Vpc1ID, nil)
vpc1, err := vpcDAO.GetByID(ctx, nil, vpcPeering.Vpc1ID, []string{cdbm.TenantRelationName})
if err != nil {
if err == cdb.ErrDoesNotExist {
return cutil.NewAPIErrorResponse(c, http.StatusNotFound, fmt.Sprintf("Could not find VPC with ID: %s", vpcPeering.Vpc1ID.String()), nil)
}
logger.Error().Err(err).Msg("error retrieving VPC 1 of VPC Peering from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, fmt.Sprintf("Failed to retrieve VPC 1 with ID: %s, DB error", vpcPeering.Vpc1ID.String()), nil)
}
vpc2, err := vpcDAO.GetByID(ctx, nil, vpcPeering.Vpc2ID, nil)

vpc2, err := vpcDAO.GetByID(ctx, nil, vpcPeering.Vpc2ID, []string{cdbm.TenantRelationName})
if err != nil {
if err == cdb.ErrDoesNotExist {
return cutil.NewAPIErrorResponse(c, http.StatusNotFound, fmt.Sprintf("Could not find VPC with ID: %s", vpcPeering.Vpc2ID.String()), nil)
Expand All @@ -706,8 +830,32 @@ func (gvph GetVpcPeeringHandler) Handle(c echo.Context) error {
return cutil.NewAPIErrorResponse(c, http.StatusForbidden, "User does not have access to the VPC Peering", nil)
}

// Map tenant to the VPCs
dbMappedPeeringTenants := make(map[uuid.UUID]*cdbm.Tenant)
tenantIDs := []uuid.UUID{}

if vpcPeering.Vpc1 != nil {
tenantIDs = append(tenantIDs, vpcPeering.Vpc1.TenantID)
}
if vpcPeering.Vpc2 != nil {
tenantIDs = append(tenantIDs, vpcPeering.Vpc2.TenantID)
}

// Fetch Tenants from DB if VPCs have tenants
if len(tenantIDs) > 0 {
tenantDAO := cdbm.NewTenantDAO(gvph.dbSession)
tenants, _, err := tenantDAO.GetAll(ctx, nil, cdbm.TenantFilterInput{TenantIDs: tenantIDs}, cdbp.PageInput{Limit: cutil.GetPtr(cdbp.TotalLimit)}, nil)
if err != nil {
logger.Error().Err(err).Msg("error retrieving Tenants from DB")
return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Tenants, DB error", nil)
}
for _, tenant := range tenants {
dbMappedPeeringTenants[tenant.ID] = &tenant
}
}

// Convert to API model
apiVpcPeering := model.NewAPIVpcPeering(*vpcPeering)
apiVpcPeering := model.NewAPIVpcPeering(*vpcPeering, dbMappedPeeringTenants)

logger.Info().Msg("finishing API handler")

Expand Down
Loading
Loading