Skip to content

Commit

Permalink
Support multiple custom field in a query
Browse files Browse the repository at this point in the history
  • Loading branch information
henrybear327 committed Oct 10, 2024
1 parent d3c7bac commit 787fecd
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 11 deletions.
29 changes: 21 additions & 8 deletions pkg/netbox/api/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,43 @@ package api

import (
"fmt"
"log"
"net/url"

"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)

type CustomFieldEntry struct {
key string
value string
}

type CustomFieldStringFilter struct {
CustomFieldName string
CustomFieldValue string
entries []CustomFieldEntry
}

func newCustomFieldStringFilterOperation(name string, value string) func(co *runtime.ClientOperation) {
func newCustomFieldStringFilterOperation(entries []CustomFieldEntry) func(co *runtime.ClientOperation) {
return func(co *runtime.ClientOperation) {
co.Params = &CustomFieldStringFilter{
CustomFieldName: name,
CustomFieldValue: value,
entries: entries,
}
}
}

func (o *CustomFieldStringFilter) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
err := r.SetQueryParam(fmt.Sprintf("cf_%s", url.QueryEscape(o.CustomFieldName)), o.CustomFieldValue)
if err != nil {
return err
// We currently write the request by ANDing all the custom fields

// The custom field query format is like the following: http://localhost:8080/ipam/prefixes/?q=&cf_poolName=Pool+2&cf_environment=Production
// The GitHub issue related to supporting multiple custom field in a query: https://github.com/netbox-community/netbox/issues/7163
for _, entry := range o.entries {
err := r.SetQueryParam(fmt.Sprintf("cf_%s", url.QueryEscape(entry.key)), entry.value)
if err != nil {
return err
}
}

log.Println("GetQueryParams", r.GetQueryParams())

return nil
}
7 changes: 6 additions & 1 deletion pkg/netbox/api/ip_address_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ const (
)

func (r *NetboxClient) RestoreExistingIpByHash(customFieldName string, hash string) (*models.IPAddress, error) {
customIpSearch := newCustomFieldStringFilterOperation(customFieldName, hash)
customIpSearch := newCustomFieldStringFilterOperation([]CustomFieldEntry{
{
key: customFieldName,
value: hash,
},
})
list, err := r.Ipam.IpamIPAddressesList(ipam.NewIpamIPAddressesListParams(), nil, customIpSearch)
if err != nil {
return nil, err
Expand Down
14 changes: 12 additions & 2 deletions pkg/netbox/api/prefix_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,12 @@ var (
)

func (r *NetboxClient) RestoreExistingPrefixByHash(hash string) (*models.Prefix, error) {
customPrefixSearch := newCustomFieldStringFilterOperation(config.GetOperatorConfig().NetboxRestorationHashFieldName, hash)
customPrefixSearch := newCustomFieldStringFilterOperation([]CustomFieldEntry{
{
key: config.GetOperatorConfig().NetboxRestorationHashFieldName,
value: hash,
},
})
list, err := r.Ipam.IpamPrefixesList(ipam.NewIpamPrefixesListParams(), nil, customPrefixSearch)
if err != nil {
return nil, err
Expand Down Expand Up @@ -89,9 +94,14 @@ func validatePrefixLengthOrError(prefixClaim *models.PrefixClaim, prefixFamily i
func (r *NetboxClient) GetAvailablePrefixByParentPrefixSelector(customFields map[string]string, tenant, prefixLength string) ([]*models.Prefix, error) {
// TODO(henrybear327): extend to support multiple custom fields
var conditions func(co *runtime.ClientOperation)
customFieldEntries := make([]CustomFieldEntry, 0, len(customFields))
for k, v := range customFields {
conditions = newCustomFieldStringFilterOperation(k, v)
customFieldEntries = append(customFieldEntries, CustomFieldEntry{
key: k,
value: v,
})
}
conditions = newCustomFieldStringFilterOperation(customFieldEntries)

list, err := r.Ipam.IpamPrefixesList(ipam.NewIpamPrefixesListParams(), nil, conditions)
if err != nil {
Expand Down

0 comments on commit 787fecd

Please sign in to comment.