Skip to content

Commit

Permalink
Merge pull request #1204 from threefoldtech/development_proxy_rentabl…
Browse files Browse the repository at this point in the history
…e_by_filter

add rentable_by filter
  • Loading branch information
Omarabdul3ziz authored Sep 23, 2024
2 parents 4bc96d8 + feca39e commit ed885b4
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 44 deletions.
6 changes: 6 additions & 0 deletions grid-proxy/docs/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions grid-proxy/docs/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,12 @@
"name": "available_for",
"in": "query"
},
{
"type": "integer",
"description": "rented by a twin id or available to rent",
"name": "rentable_by",
"in": "query"
},
{
"type": "string",
"description": "List of farms separated by comma to fetch nodes from (e.g. '1,2,3')",
Expand Down
4 changes: 4 additions & 0 deletions grid-proxy/docs/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1197,6 +1197,10 @@ paths:
in: query
name: available_for
type: integer
- description: rented by a twin id or available to rent
in: query
name: rentable_by
type: integer
- description: List of farms separated by comma to fetch nodes from (e.g. '1,2,3')
in: query
name: farm_ids
Expand Down
9 changes: 8 additions & 1 deletion grid-proxy/internal/explorer/db/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,12 @@ func (d *PostgresDatabase) GetNodes(ctx context.Context, filter types.NodeFilter
if filter.RentedBy != nil {
q = q.Where(`COALESCE(resources_cache.renter, 0) = ?`, *filter.RentedBy)
}
if filter.RentableOrRentedBy != nil {
q = q.Where(`((farm.dedicated_farm = true OR resources_cache.node_contracts_count = 0)
AND resources_cache.renter is null)
OR COALESCE(resources_cache.renter, 0) = ?
`, *filter.RentableOrRentedBy)
}
if filter.Rented != nil {
q = q.Where(`? = (resources_cache.renter is not null)`, *filter.Rented)
}
Expand All @@ -734,7 +740,8 @@ func (d *PostgresDatabase) GetNodes(ctx context.Context, filter types.NodeFilter
if limit.Randomize {
q = q.Order("random()")
} else {
if filter.AvailableFor != nil {
// prioritize the rented (by the twin) nodes
if filter.AvailableFor != nil || filter.RentableOrRentedBy != nil {
q = q.Order("(case when resources_cache.renter is not null then 1 else 2 end)")
}

Expand Down
1 change: 1 addition & 0 deletions grid-proxy/internal/explorer/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ func (a *App) getStats(r *http.Request) (interface{}, mw.Response) {
// @Param rented query bool false "Set to true to filter rented nodes"
// @Param rented_by query int false "rented by twin id"
// @Param available_for query int false "available for twin id"
// @Param rentable_by query int false "rented by a twin id or available to rent"
// @Param farm_ids query string false "List of farms separated by comma to fetch nodes from (e.g. '1,2,3')"
// @Param certification_type query string false "certificate type" Enums(Certified, DIY)
// @Param has_gpu query bool false "filter nodes on whether they have GPU support or not"
Expand Down
87 changes: 44 additions & 43 deletions grid-proxy/pkg/types/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,47 +117,48 @@ type Capacity struct {

// NodeFilter node filters
type NodeFilter struct {
Status []string `schema:"status,omitempty"`
FreeMRU *uint64 `schema:"free_mru,omitempty"`
FreeHRU *uint64 `schema:"free_hru,omitempty"`
FreeSRU *uint64 `schema:"free_sru,omitempty"`
TotalMRU *uint64 `schema:"total_mru,omitempty"`
TotalHRU *uint64 `schema:"total_hru,omitempty"`
TotalSRU *uint64 `schema:"total_sru,omitempty"`
TotalCRU *uint64 `schema:"total_cru,omitempty"`
Country *string `schema:"country,omitempty"`
CountryContains *string `schema:"country_contains,omitempty"`
City *string `schema:"city,omitempty"`
CityContains *string `schema:"city_contains,omitempty"`
Region *string `schema:"region,omitempty"`
FarmName *string `schema:"farm_name,omitempty"`
FarmNameContains *string `schema:"farm_name_contains,omitempty"`
FarmIDs []uint64 `schema:"farm_ids,omitempty"`
FreeIPs *uint64 `schema:"free_ips,omitempty"`
IPv4 *bool `schema:"ipv4,omitempty"`
IPv6 *bool `schema:"ipv6,omitempty"`
Domain *bool `schema:"domain,omitempty"`
Dedicated *bool `schema:"dedicated,omitempty"`
InDedicatedFarm *bool `schema:"in_dedicated_farm,omitempty"`
Rentable *bool `schema:"rentable,omitempty"`
OwnedBy *uint64 `schema:"owned_by,omitempty"`
Rented *bool `schema:"rented,omitempty"`
RentedBy *uint64 `schema:"rented_by,omitempty"`
AvailableFor *uint64 `schema:"available_for,omitempty"`
NodeID *uint64 `schema:"node_id,omitempty"`
NodeIDs []uint64 `schema:"node_ids,omitempty"`
TwinID *uint64 `schema:"twin_id,omitempty"`
CertificationType *string `schema:"certification_type,omitempty"`
HasGPU *bool `schema:"has_gpu,omitempty"`
NumGPU *uint64 `schema:"num_gpu,omitempty"`
GpuDeviceID *string `schema:"gpu_device_id,omitempty"`
GpuDeviceName *string `schema:"gpu_device_name,omitempty"`
GpuVendorID *string `schema:"gpu_vendor_id,omitempty"`
GpuVendorName *string `schema:"gpu_vendor_name,omitempty"`
GpuAvailable *bool `schema:"gpu_available,omitempty"`
Healthy *bool `schema:"healthy,omitempty"`
PriceMin *float64 `schema:"price_min,omitempty"`
PriceMax *float64 `schema:"price_max,omitempty"`
Excluded []uint64 `schema:"excluded,omitempty"`
HasIpv6 *bool `schema:"has_ipv6,omitempty"`
Status []string `schema:"status,omitempty"`
FreeMRU *uint64 `schema:"free_mru,omitempty"`
FreeHRU *uint64 `schema:"free_hru,omitempty"`
FreeSRU *uint64 `schema:"free_sru,omitempty"`
TotalMRU *uint64 `schema:"total_mru,omitempty"`
TotalHRU *uint64 `schema:"total_hru,omitempty"`
TotalSRU *uint64 `schema:"total_sru,omitempty"`
TotalCRU *uint64 `schema:"total_cru,omitempty"`
Country *string `schema:"country,omitempty"`
CountryContains *string `schema:"country_contains,omitempty"`
City *string `schema:"city,omitempty"`
CityContains *string `schema:"city_contains,omitempty"`
Region *string `schema:"region,omitempty"`
FarmName *string `schema:"farm_name,omitempty"`
FarmNameContains *string `schema:"farm_name_contains,omitempty"`
FarmIDs []uint64 `schema:"farm_ids,omitempty"`
FreeIPs *uint64 `schema:"free_ips,omitempty"`
IPv4 *bool `schema:"ipv4,omitempty"`
IPv6 *bool `schema:"ipv6,omitempty"`
Domain *bool `schema:"domain,omitempty"`
Dedicated *bool `schema:"dedicated,omitempty"`
InDedicatedFarm *bool `schema:"in_dedicated_farm,omitempty"`
Rentable *bool `schema:"rentable,omitempty"`
OwnedBy *uint64 `schema:"owned_by,omitempty"`
Rented *bool `schema:"rented,omitempty"`
RentedBy *uint64 `schema:"rented_by,omitempty"`
RentableOrRentedBy *uint64 `schema:"rentable_by,omitempty"` // rented by twin or rentable
AvailableFor *uint64 `schema:"available_for,omitempty"` // rented by twin or free
NodeID *uint64 `schema:"node_id,omitempty"`
NodeIDs []uint64 `schema:"node_ids,omitempty"`
TwinID *uint64 `schema:"twin_id,omitempty"`
CertificationType *string `schema:"certification_type,omitempty"`
HasGPU *bool `schema:"has_gpu,omitempty"`
NumGPU *uint64 `schema:"num_gpu,omitempty"`
GpuDeviceID *string `schema:"gpu_device_id,omitempty"`
GpuDeviceName *string `schema:"gpu_device_name,omitempty"`
GpuVendorID *string `schema:"gpu_vendor_id,omitempty"`
GpuVendorName *string `schema:"gpu_vendor_name,omitempty"`
GpuAvailable *bool `schema:"gpu_available,omitempty"`
Healthy *bool `schema:"healthy,omitempty"`
PriceMin *float64 `schema:"price_min,omitempty"`
PriceMax *float64 `schema:"price_max,omitempty"`
Excluded []uint64 `schema:"excluded,omitempty"`
HasIpv6 *bool `schema:"has_ipv6,omitempty"`
}
7 changes: 7 additions & 0 deletions grid-proxy/tests/queries/mock_client/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,13 @@ func (n *Node) satisfies(f types.NodeFilter, data *DBData) bool {
}

renter, ok := data.NodeRentedBy[n.NodeID]

if f.RentableOrRentedBy != nil &&
((ok && renter != *f.RentableOrRentedBy) ||
(!ok && !(data.Farms[n.FarmID].DedicatedFarm || len(data.NonDeletedContracts[n.NodeID]) == 0))) {
return false
}

if f.AvailableFor != nil &&
((ok && renter != *f.AvailableFor) ||
(!ok && (data.Farms[n.FarmID].DedicatedFarm || n.ExtraFee != 0))) {
Expand Down
7 changes: 7 additions & 0 deletions grid-proxy/tests/queries/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,13 @@ var nodeFilterRandomValueGenerator = map[string]func(agg NodesAggregate) interfa
}
return &c
},
"RentableOrRentedBy": func(agg NodesAggregate) interface{} {
c := agg.twins[rand.Intn(len(agg.twins))]
if flip(.2) && len(agg.nodeRenters) != 0 {
c = agg.nodeRenters[rand.Intn(len(agg.nodeRenters))]
}
return &c
},
"AvailableFor": func(agg NodesAggregate) interface{} {
c := agg.twins[rand.Intn(len(agg.twins))]
if flip(.1) && len(agg.nodeRenters) != 0 {
Expand Down

0 comments on commit ed885b4

Please sign in to comment.