-
Notifications
You must be signed in to change notification settings - Fork 782
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add partitions func for listing partitions in the local datacenter
- Loading branch information
1 parent
e9e921d
commit 82bd836
Showing
4 changed files
with
143 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
package dependency | ||
|
||
import ( | ||
"context" | ||
"log" | ||
"net/url" | ||
"sort" | ||
"time" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
var ( | ||
// Ensure implements | ||
_ Dependency = (*CatalogPartitionsQuery)(nil) | ||
|
||
// CatalogPartitionsQuerySleepTime is the amount of time to sleep between | ||
// queries, since the endpoint does not support blocking queries. | ||
CatalogPartitionsQuerySleepTime = 15 * time.Second | ||
) | ||
|
||
// CatalogPartitionsQuery is the representation of a requested catalog partitions | ||
// dependency from inside a template. | ||
type CatalogPartitionsQuery struct { | ||
stopCh chan struct{} | ||
} | ||
|
||
// NewCatalogPartitionsQuery parses a string of the format @dc. | ||
func NewCatalogPartitionsQuery() (*CatalogPartitionsQuery, error) { | ||
return &CatalogPartitionsQuery{ | ||
stopCh: make(chan struct{}, 1), | ||
}, nil | ||
} | ||
|
||
func (c *CatalogPartitionsQuery) Fetch(clients *ClientSet, opts *QueryOptions) (interface{}, *ResponseMetadata, error) { | ||
opts = opts.Merge(&QueryOptions{}) | ||
|
||
log.Printf("[TRACE] %s: GET %s", c, &url.URL{ | ||
Path: "/v1/partitions", | ||
RawQuery: opts.String(), | ||
}) | ||
|
||
// This is certainly not elegant, but the partitions endpoint does not support | ||
// blocking queries, so we are going to "fake it until we make it". When we | ||
// first query, the LastIndex will be "0", meaning we should immediately | ||
// return data, but future calls will include a LastIndex. If we have a | ||
// LastIndex in the query metadata, sleep for 15 seconds before asking Consul | ||
// again. | ||
// | ||
// This is probably okay given the frequency in which partitions actually | ||
// change, but is technically not edge-triggering. | ||
if opts.WaitIndex != 0 { | ||
log.Printf("[TRACE] %s: long polling for %s", c, CatalogDatacentersQuerySleepTime) | ||
|
||
select { | ||
case <-c.stopCh: | ||
return nil, nil, ErrStopped | ||
case <-time.After(CatalogPartitionsQuerySleepTime): | ||
} | ||
} | ||
|
||
// TODO Consider using a proper context | ||
partitions, qm, err := clients.Consul().Partitions().List(context.Background(), opts.ToConsulOpts()) | ||
if err != nil { | ||
return nil, nil, errors.Wrapf(err, c.String()) | ||
} | ||
|
||
// TODO Consider returning full partition objects instead of just name | ||
partitionNames := []string{} | ||
for _, partition := range partitions { | ||
if partition != nil { | ||
partitionNames = append(partitionNames, partition.Name) | ||
} | ||
} | ||
|
||
log.Printf("[TRACE] %s: returned %d results", c, len(partitionNames)) | ||
|
||
sort.Strings(partitionNames) | ||
|
||
rm := &ResponseMetadata{ | ||
LastIndex: qm.LastIndex, | ||
LastContact: qm.LastContact, | ||
} | ||
|
||
return partitionNames, rm, nil | ||
} | ||
|
||
// CanShare returns if this dependency is shareable. | ||
// TODO What is this? | ||
func (c *CatalogPartitionsQuery) CanShare() bool { | ||
return true | ||
} | ||
|
||
func (c *CatalogPartitionsQuery) String() string { | ||
return "catalog.partitions" | ||
} | ||
|
||
func (c *CatalogPartitionsQuery) Stop() { | ||
close(c.stopCh) | ||
} | ||
|
||
func (c *CatalogPartitionsQuery) Type() Type { | ||
return TypeConsul | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters