From 448e328e6cc2126483cb928baa066d3b5336bf35 Mon Sep 17 00:00:00 2001 From: Kyle Havlovitz Date: Mon, 18 Dec 2017 13:18:06 -0800 Subject: [PATCH 1/6] vendor: add autopilot and flags packages from consul --- .../agent/consul/autopilot/autopilot.go | 491 ++++++++++++++++ .../agent/consul/autopilot/promotion.go | 26 + .../consul/agent/consul/autopilot/structs.go | 158 ++++++ .../hashicorp/consul/command/flags/config.go | 310 ++++++++++ .../consul/command/flags/flag_map_value.go | 37 ++ .../consul/command/flags/flag_slice_value.go | 20 + .../hashicorp/consul/command/flags/http.go | 100 ++++ .../hashicorp/consul/command/flags/merge.go | 15 + .../hashicorp/consul/command/flags/usage.go | 114 ++++ .../github.com/tonnerre/golang-text/License | 19 + vendor/github.com/tonnerre/golang-text/Readme | 3 + vendor/github.com/tonnerre/golang-text/doc.go | 3 + .../github.com/tonnerre/golang-text/indent.go | 74 +++ .../github.com/tonnerre/golang-text/wrap.go | 86 +++ vendor/vendor.json | 529 +++++++++--------- 15 files changed, 1722 insertions(+), 263 deletions(-) create mode 100644 vendor/github.com/hashicorp/consul/agent/consul/autopilot/autopilot.go create mode 100644 vendor/github.com/hashicorp/consul/agent/consul/autopilot/promotion.go create mode 100644 vendor/github.com/hashicorp/consul/agent/consul/autopilot/structs.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/config.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/flag_map_value.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/flag_slice_value.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/http.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/merge.go create mode 100644 vendor/github.com/hashicorp/consul/command/flags/usage.go create mode 100644 vendor/github.com/tonnerre/golang-text/License create mode 100644 vendor/github.com/tonnerre/golang-text/Readme create mode 100644 vendor/github.com/tonnerre/golang-text/doc.go create mode 100644 vendor/github.com/tonnerre/golang-text/indent.go create mode 100755 vendor/github.com/tonnerre/golang-text/wrap.go diff --git a/vendor/github.com/hashicorp/consul/agent/consul/autopilot/autopilot.go b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/autopilot.go new file mode 100644 index 00000000000..dd7e5c07853 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/autopilot.go @@ -0,0 +1,491 @@ +package autopilot + +import ( + "context" + "fmt" + "log" + "net" + "strconv" + "sync" + "time" + + "github.com/hashicorp/go-version" + "github.com/hashicorp/raft" + "github.com/hashicorp/serf/serf" +) + +// Delegate is the interface for the Autopilot mechanism +type Delegate interface { + AutopilotConfig() *Config + FetchStats(context.Context, []serf.Member) map[string]*ServerStats + IsServer(serf.Member) (*ServerInfo, error) + NotifyHealth(OperatorHealthReply) + PromoteNonVoters(*Config, OperatorHealthReply) ([]raft.Server, error) + Raft() *raft.Raft + Serf() *serf.Serf +} + +// Autopilot is a mechanism for automatically managing the Raft +// quorum using server health information along with updates from Serf gossip. +// For more information, see https://www.consul.io/docs/guides/autopilot.html +type Autopilot struct { + logger *log.Logger + delegate Delegate + + interval time.Duration + healthInterval time.Duration + + clusterHealth OperatorHealthReply + clusterHealthLock sync.RWMutex + + removeDeadCh chan struct{} + shutdownCh chan struct{} + waitGroup sync.WaitGroup +} + +type ServerInfo struct { + Name string + ID string + Addr net.Addr + Build version.Version + Status serf.MemberStatus +} + +func NewAutopilot(logger *log.Logger, delegate Delegate, interval, healthInterval time.Duration) *Autopilot { + return &Autopilot{ + logger: logger, + delegate: delegate, + interval: interval, + healthInterval: healthInterval, + removeDeadCh: make(chan struct{}), + } +} + +func (a *Autopilot) Start() { + a.shutdownCh = make(chan struct{}) + a.waitGroup = sync.WaitGroup{} + a.waitGroup.Add(1) + + go a.run() +} + +func (a *Autopilot) Stop() { + close(a.shutdownCh) + a.waitGroup.Wait() +} + +// run periodically looks for nonvoting servers to promote and dead servers to remove. +func (a *Autopilot) run() { + defer a.waitGroup.Done() + + // Monitor server health until shutdown + ticker := time.NewTicker(a.interval) + defer ticker.Stop() + + for { + select { + case <-a.shutdownCh: + return + case <-ticker.C: + if err := a.promoteServers(); err != nil { + a.logger.Printf("[ERR] autopilot: Error promoting servers: %v", err) + } + + if err := a.pruneDeadServers(); err != nil { + a.logger.Printf("[ERR] autopilot: Error checking for dead servers to remove: %s", err) + } + case <-a.removeDeadCh: + if err := a.pruneDeadServers(); err != nil { + a.logger.Printf("[ERR] autopilot: Error checking for dead servers to remove: %s", err) + } + } + } +} + +// promoteServers asks the delegate for any promotions and carries them out. +func (a *Autopilot) promoteServers() error { + conf := a.delegate.AutopilotConfig() + if conf == nil { + return nil + } + + // Skip the non-voter promotions unless all servers support the new APIs + minRaftProtocol, err := a.MinRaftProtocol() + if err != nil { + return fmt.Errorf("error getting server raft protocol versions: %s", err) + } + if minRaftProtocol >= 3 { + promotions, err := a.delegate.PromoteNonVoters(conf, a.GetClusterHealth()) + if err != nil { + return fmt.Errorf("error checking for non-voters to promote: %s", err) + } + if err := a.handlePromotions(promotions); err != nil { + return fmt.Errorf("error handling promotions: %s", err) + } + } + + return nil +} + +// fmtServer prints info about a server in a standard way for logging. +func fmtServer(server raft.Server) string { + return fmt.Sprintf("Server (ID: %q Address: %q)", server.ID, server.Address) +} + +// NumPeers counts the number of voting peers in the given raft config. +func NumPeers(raftConfig raft.Configuration) int { + var numPeers int + for _, server := range raftConfig.Servers { + if server.Suffrage == raft.Voter { + numPeers++ + } + } + return numPeers +} + +// RemoveDeadServers triggers a pruning of dead servers in a non-blocking way. +func (a *Autopilot) RemoveDeadServers() { + select { + case a.removeDeadCh <- struct{}{}: + default: + } +} + +// pruneDeadServers removes up to numPeers/2 failed servers +func (a *Autopilot) pruneDeadServers() error { + conf := a.delegate.AutopilotConfig() + if conf == nil || !conf.CleanupDeadServers { + return nil + } + + // Failed servers are known to Serf and marked failed, and stale servers + // are known to Raft but not Serf. + var failed []string + staleRaftServers := make(map[string]raft.Server) + raftNode := a.delegate.Raft() + future := raftNode.GetConfiguration() + if err := future.Error(); err != nil { + return err + } + + raftConfig := future.Configuration() + for _, server := range raftConfig.Servers { + staleRaftServers[string(server.Address)] = server + } + + serfLAN := a.delegate.Serf() + for _, member := range serfLAN.Members() { + server, err := a.delegate.IsServer(member) + if err != nil { + a.logger.Printf("[INFO] autopilot: Error parsing server info for %q: %s", member.Name, err) + continue + } + if server != nil { + // todo(kyhavlov): change this to index by UUID + if _, ok := staleRaftServers[server.Addr.String()]; ok { + delete(staleRaftServers, server.Addr.String()) + } + + if member.Status == serf.StatusFailed { + failed = append(failed, member.Name) + } + } + } + + // We can bail early if there's nothing to do. + removalCount := len(failed) + len(staleRaftServers) + if removalCount == 0 { + return nil + } + + // Only do removals if a minority of servers will be affected. + peers := NumPeers(raftConfig) + if removalCount < peers/2 { + for _, node := range failed { + a.logger.Printf("[INFO] autopilot: Attempting removal of failed server node %q", node) + go serfLAN.RemoveFailedNode(node) + } + + minRaftProtocol, err := a.MinRaftProtocol() + if err != nil { + return err + } + for _, raftServer := range staleRaftServers { + a.logger.Printf("[INFO] autopilot: Attempting removal of stale %s", fmtServer(raftServer)) + var future raft.Future + if minRaftProtocol >= 2 { + future = raftNode.RemoveServer(raftServer.ID, 0, 0) + } else { + future = raftNode.RemovePeer(raftServer.Address) + } + if err := future.Error(); err != nil { + return err + } + } + } else { + a.logger.Printf("[DEBUG] autopilot: Failed to remove dead servers: too many dead servers: %d/%d", removalCount, peers) + } + + return nil +} + +// MinRaftProtocol returns the lowest supported Raft protocol among alive servers +func (a *Autopilot) MinRaftProtocol() (int, error) { + return minRaftProtocol(a.delegate.Serf().Members(), a.delegate.IsServer) +} + +func minRaftProtocol(members []serf.Member, serverFunc func(serf.Member) (*ServerInfo, error)) (int, error) { + minVersion := -1 + for _, m := range members { + if m.Status != serf.StatusAlive { + continue + } + + server, err := serverFunc(m) + if err != nil { + return -1, err + } + if server == nil { + continue + } + + vsn, ok := m.Tags["raft_vsn"] + if !ok { + vsn = "1" + } + raftVsn, err := strconv.Atoi(vsn) + if err != nil { + return -1, err + } + + if minVersion == -1 || raftVsn < minVersion { + minVersion = raftVsn + } + } + + if minVersion == -1 { + return minVersion, fmt.Errorf("No servers found") + } + + return minVersion, nil +} + +// handlePromotions is a helper shared with Consul Enterprise that attempts to +// apply desired server promotions to the Raft configuration. +func (a *Autopilot) handlePromotions(promotions []raft.Server) error { + // This used to wait to only promote to maintain an odd quorum of + // servers, but this was at odds with the dead server cleanup when doing + // rolling updates (add one new server, wait, and then kill an old + // server). The dead server cleanup would still count the old server as + // a peer, which is conservative and the right thing to do, and this + // would wait to promote, so you could get into a stalemate. It is safer + // to promote early than remove early, so by promoting as soon as + // possible we have chosen that as the solution here. + for _, server := range promotions { + a.logger.Printf("[INFO] autopilot: Promoting %s to voter", fmtServer(server)) + addFuture := a.delegate.Raft().AddVoter(server.ID, server.Address, 0, 0) + if err := addFuture.Error(); err != nil { + return fmt.Errorf("failed to add raft peer: %v", err) + } + } + + // If we promoted a server, trigger a check to remove dead servers. + if len(promotions) > 0 { + select { + case a.removeDeadCh <- struct{}{}: + default: + } + } + return nil +} + +// ServerHealthLoop monitors the health of the servers in the cluster +func (a *Autopilot) ServerHealthLoop(shutdownCh <-chan struct{}) { + // Monitor server health until shutdown + ticker := time.NewTicker(a.healthInterval) + defer ticker.Stop() + + for { + select { + case <-shutdownCh: + return + case <-ticker.C: + if err := a.updateClusterHealth(); err != nil { + a.logger.Printf("[ERR] autopilot: Error updating cluster health: %s", err) + } + } + } +} + +// updateClusterHealth fetches the Raft stats of the other servers and updates +// s.clusterHealth based on the configured Autopilot thresholds +func (a *Autopilot) updateClusterHealth() error { + // Don't do anything if the min Raft version is too low + minRaftProtocol, err := a.MinRaftProtocol() + if err != nil { + return fmt.Errorf("error getting server raft protocol versions: %s", err) + } + if minRaftProtocol < 3 { + return nil + } + + autopilotConf := a.delegate.AutopilotConfig() + // Bail early if autopilot config hasn't been initialized yet + if autopilotConf == nil { + return nil + } + + // Get the the serf members which are Consul servers + var serverMembers []serf.Member + serverMap := make(map[string]*ServerInfo) + for _, member := range a.delegate.Serf().Members() { + if member.Status == serf.StatusLeft { + continue + } + + server, err := a.delegate.IsServer(member) + if err != nil { + a.logger.Printf("[INFO] autopilot: Error parsing server info for %q: %s", member.Name, err) + continue + } + if server != nil { + serverMap[server.ID] = server + serverMembers = append(serverMembers, member) + } + } + + raftNode := a.delegate.Raft() + future := raftNode.GetConfiguration() + if err := future.Error(); err != nil { + return fmt.Errorf("error getting Raft configuration %s", err) + } + servers := future.Configuration().Servers + + // Fetch the health for each of the servers in parallel so we get as + // consistent of a sample as possible. We capture the leader's index + // here as well so it roughly lines up with the same point in time. + targetLastIndex := raftNode.LastIndex() + var fetchList []*ServerInfo + for _, server := range servers { + if parts, ok := serverMap[string(server.ID)]; ok { + fetchList = append(fetchList, parts) + } + } + d := time.Now().Add(a.healthInterval / 2) + ctx, cancel := context.WithDeadline(context.Background(), d) + defer cancel() + fetchedStats := a.delegate.FetchStats(ctx, serverMembers) + + // Build a current list of server healths + leader := raftNode.Leader() + var clusterHealth OperatorHealthReply + voterCount := 0 + healthyCount := 0 + healthyVoterCount := 0 + for _, server := range servers { + health := ServerHealth{ + ID: string(server.ID), + Address: string(server.Address), + Leader: server.Address == leader, + LastContact: -1, + Voter: server.Suffrage == raft.Voter, + } + + parts, ok := serverMap[string(server.ID)] + if ok { + health.Name = parts.Name + health.SerfStatus = parts.Status + health.Version = parts.Build.String() + if stats, ok := fetchedStats[string(server.ID)]; ok { + if err := a.updateServerHealth(&health, parts, stats, autopilotConf, targetLastIndex); err != nil { + a.logger.Printf("[WARN] autopilot: Error updating server %s health: %s", fmtServer(server), err) + } + } + } else { + health.SerfStatus = serf.StatusNone + } + + if health.Voter { + voterCount++ + } + if health.Healthy { + healthyCount++ + if health.Voter { + healthyVoterCount++ + } + } + + clusterHealth.Servers = append(clusterHealth.Servers, health) + } + clusterHealth.Healthy = healthyCount == len(servers) + + // If we have extra healthy voters, update FailureTolerance + requiredQuorum := voterCount/2 + 1 + if healthyVoterCount > requiredQuorum { + clusterHealth.FailureTolerance = healthyVoterCount - requiredQuorum + } + + a.delegate.NotifyHealth(clusterHealth) + + a.clusterHealthLock.Lock() + a.clusterHealth = clusterHealth + a.clusterHealthLock.Unlock() + + return nil +} + +// updateServerHealth computes the resulting health of the server based on its +// fetched stats and the state of the leader. +func (a *Autopilot) updateServerHealth(health *ServerHealth, + server *ServerInfo, stats *ServerStats, + autopilotConf *Config, targetLastIndex uint64) error { + + health.LastTerm = stats.LastTerm + health.LastIndex = stats.LastIndex + + if stats.LastContact != "never" { + var err error + health.LastContact, err = time.ParseDuration(stats.LastContact) + if err != nil { + return fmt.Errorf("error parsing last_contact duration: %s", err) + } + } + + raftNode := a.delegate.Raft() + lastTerm, err := strconv.ParseUint(raftNode.Stats()["last_log_term"], 10, 64) + if err != nil { + return fmt.Errorf("error parsing last_log_term: %s", err) + } + health.Healthy = health.IsHealthy(lastTerm, targetLastIndex, autopilotConf) + + // If this is a new server or the health changed, reset StableSince + lastHealth := a.GetServerHealth(server.ID) + if lastHealth == nil || lastHealth.Healthy != health.Healthy { + health.StableSince = time.Now() + } else { + health.StableSince = lastHealth.StableSince + } + + return nil +} + +func (a *Autopilot) GetClusterHealth() OperatorHealthReply { + a.clusterHealthLock.RLock() + defer a.clusterHealthLock.RUnlock() + return a.clusterHealth +} + +func (a *Autopilot) GetServerHealth(id string) *ServerHealth { + a.clusterHealthLock.RLock() + defer a.clusterHealthLock.RUnlock() + return a.clusterHealth.ServerHealth(id) +} + +func IsPotentialVoter(suffrage raft.ServerSuffrage) bool { + switch suffrage { + case raft.Voter, raft.Staging: + return true + default: + return false + } +} diff --git a/vendor/github.com/hashicorp/consul/agent/consul/autopilot/promotion.go b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/promotion.go new file mode 100644 index 00000000000..d76540d1595 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/promotion.go @@ -0,0 +1,26 @@ +package autopilot + +import ( + "time" + + "github.com/hashicorp/raft" +) + +// PromoteStableServers is a basic autopilot promotion policy that promotes any +// server which has been healthy and stable for the duration specified in the +// given Autopilot config. +func PromoteStableServers(autopilotConfig *Config, health OperatorHealthReply, servers []raft.Server) []raft.Server { + // Find any non-voters eligible for promotion. + now := time.Now() + var promotions []raft.Server + for _, server := range servers { + if !IsPotentialVoter(server.Suffrage) { + health := health.ServerHealth(string(server.ID)) + if health.IsStable(now, autopilotConfig) { + promotions = append(promotions, server) + } + } + } + + return promotions +} diff --git a/vendor/github.com/hashicorp/consul/agent/consul/autopilot/structs.go b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/structs.go new file mode 100644 index 00000000000..54a5025ace6 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/agent/consul/autopilot/structs.go @@ -0,0 +1,158 @@ +package autopilot + +import ( + "time" + + "github.com/hashicorp/serf/serf" +) + +// Config holds the Autopilot configuration for a cluster. +type Config struct { + // CleanupDeadServers controls whether to remove dead servers when a new + // server is added to the Raft peers. + CleanupDeadServers bool + + // LastContactThreshold is the limit on the amount of time a server can go + // without leader contact before being considered unhealthy. + LastContactThreshold time.Duration + + // MaxTrailingLogs is the amount of entries in the Raft Log that a server can + // be behind before being considered unhealthy. + MaxTrailingLogs uint64 + + // ServerStabilizationTime is the minimum amount of time a server must be + // in a stable, healthy state before it can be added to the cluster. Only + // applicable with Raft protocol version 3 or higher. + ServerStabilizationTime time.Duration + + // (Enterprise-only) RedundancyZoneTag is the node tag to use for separating + // servers into zones for redundancy. If left blank, this feature will be disabled. + RedundancyZoneTag string + + // (Enterprise-only) DisableUpgradeMigration will disable Autopilot's upgrade migration + // strategy of waiting until enough newer-versioned servers have been added to the + // cluster before promoting them to voters. + DisableUpgradeMigration bool + + // (Enterprise-only) UpgradeVersionTag is the node tag to use for version info when + // performing upgrade migrations. If left blank, the Consul version will be used. + UpgradeVersionTag string + + // CreateIndex/ModifyIndex store the create/modify indexes of this configuration. + CreateIndex uint64 + ModifyIndex uint64 +} + +// ServerHealth is the health (from the leader's point of view) of a server. +type ServerHealth struct { + // ID is the raft ID of the server. + ID string + + // Name is the node name of the server. + Name string + + // Address is the address of the server. + Address string + + // The status of the SerfHealth check for the server. + SerfStatus serf.MemberStatus + + // Version is the version of the server. + Version string + + // Leader is whether this server is currently the leader. + Leader bool + + // LastContact is the time since this node's last contact with the leader. + LastContact time.Duration + + // LastTerm is the highest leader term this server has a record of in its Raft log. + LastTerm uint64 + + // LastIndex is the last log index this server has a record of in its Raft log. + LastIndex uint64 + + // Healthy is whether or not the server is healthy according to the current + // Autopilot config. + Healthy bool + + // Voter is whether this is a voting server. + Voter bool + + // StableSince is the last time this server's Healthy value changed. + StableSince time.Time +} + +// IsHealthy determines whether this ServerHealth is considered healthy +// based on the given Autopilot config +func (h *ServerHealth) IsHealthy(lastTerm uint64, leaderLastIndex uint64, autopilotConf *Config) bool { + if h.SerfStatus != serf.StatusAlive { + return false + } + + if h.LastContact > autopilotConf.LastContactThreshold || h.LastContact < 0 { + return false + } + + if h.LastTerm != lastTerm { + return false + } + + if leaderLastIndex > autopilotConf.MaxTrailingLogs && h.LastIndex < leaderLastIndex-autopilotConf.MaxTrailingLogs { + return false + } + + return true +} + +// IsStable returns true if the ServerHealth shows a stable, passing state +// according to the given AutopilotConfig +func (h *ServerHealth) IsStable(now time.Time, conf *Config) bool { + if h == nil { + return false + } + + if !h.Healthy { + return false + } + + if now.Sub(h.StableSince) < conf.ServerStabilizationTime { + return false + } + + return true +} + +// ServerStats holds miscellaneous Raft metrics for a server +type ServerStats struct { + // LastContact is the time since this node's last contact with the leader. + LastContact string + + // LastTerm is the highest leader term this server has a record of in its Raft log. + LastTerm uint64 + + // LastIndex is the last log index this server has a record of in its Raft log. + LastIndex uint64 +} + +// OperatorHealthReply is a representation of the overall health of the cluster +type OperatorHealthReply struct { + // Healthy is true if all the servers in the cluster are healthy. + Healthy bool + + // FailureTolerance is the number of healthy servers that could be lost without + // an outage occurring. + FailureTolerance int + + // Servers holds the health of each server. + Servers []ServerHealth +} + +func (o *OperatorHealthReply) ServerHealth(id string) *ServerHealth { + for _, health := range o.Servers { + if health.ID == id { + return &health + } + } + return nil +} diff --git a/vendor/github.com/hashicorp/consul/command/flags/config.go b/vendor/github.com/hashicorp/consul/command/flags/config.go new file mode 100644 index 00000000000..be8f914364a --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/config.go @@ -0,0 +1,310 @@ +package flags + +import ( + "fmt" + "os" + "path/filepath" + "reflect" + "sort" + "strconv" + "time" + + "github.com/mitchellh/mapstructure" +) + +// TODO (slackpad) - Trying out a different pattern here for config handling. +// These classes support the flag.Value interface but work in a manner where +// we can tell if they have been set. This lets us work with an all-pointer +// config structure and merge it in a clean-ish way. If this ends up being a +// good pattern we should pull this out into a reusable library. + +// ConfigDecodeHook should be passed to mapstructure in order to decode into +// the *Value objects here. +var ConfigDecodeHook = mapstructure.ComposeDecodeHookFunc( + BoolToBoolValueFunc(), + StringToDurationValueFunc(), + StringToStringValueFunc(), + Float64ToUintValueFunc(), +) + +// BoolValue provides a flag value that's aware if it has been set. +type BoolValue struct { + v *bool +} + +// IsBoolFlag is an optional method of the flag.Value +// interface which marks this value as boolean when +// the return value is true. See flag.Value for details. +func (b *BoolValue) IsBoolFlag() bool { + return true +} + +// Merge will overlay this value if it has been set. +func (b *BoolValue) Merge(onto *bool) { + if b.v != nil { + *onto = *(b.v) + } +} + +// Set implements the flag.Value interface. +func (b *BoolValue) Set(v string) error { + if b.v == nil { + b.v = new(bool) + } + var err error + *(b.v), err = strconv.ParseBool(v) + return err +} + +// String implements the flag.Value interface. +func (b *BoolValue) String() string { + var current bool + if b.v != nil { + current = *(b.v) + } + return fmt.Sprintf("%v", current) +} + +// BoolToBoolValueFunc is a mapstructure hook that looks for an incoming bool +// mapped to a BoolValue and does the translation. +func BoolToBoolValueFunc() mapstructure.DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.Bool { + return data, nil + } + + val := BoolValue{} + if t != reflect.TypeOf(val) { + return data, nil + } + + val.v = new(bool) + *(val.v) = data.(bool) + return val, nil + } +} + +// DurationValue provides a flag value that's aware if it has been set. +type DurationValue struct { + v *time.Duration +} + +// Merge will overlay this value if it has been set. +func (d *DurationValue) Merge(onto *time.Duration) { + if d.v != nil { + *onto = *(d.v) + } +} + +// Set implements the flag.Value interface. +func (d *DurationValue) Set(v string) error { + if d.v == nil { + d.v = new(time.Duration) + } + var err error + *(d.v), err = time.ParseDuration(v) + return err +} + +// String implements the flag.Value interface. +func (d *DurationValue) String() string { + var current time.Duration + if d.v != nil { + current = *(d.v) + } + return current.String() +} + +// StringToDurationValueFunc is a mapstructure hook that looks for an incoming +// string mapped to a DurationValue and does the translation. +func StringToDurationValueFunc() mapstructure.DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + + val := DurationValue{} + if t != reflect.TypeOf(val) { + return data, nil + } + if err := val.Set(data.(string)); err != nil { + return nil, err + } + return val, nil + } +} + +// StringValue provides a flag value that's aware if it has been set. +type StringValue struct { + v *string +} + +// Merge will overlay this value if it has been set. +func (s *StringValue) Merge(onto *string) { + if s.v != nil { + *onto = *(s.v) + } +} + +// Set implements the flag.Value interface. +func (s *StringValue) Set(v string) error { + if s.v == nil { + s.v = new(string) + } + *(s.v) = v + return nil +} + +// String implements the flag.Value interface. +func (s *StringValue) String() string { + var current string + if s.v != nil { + current = *(s.v) + } + return current +} + +// StringToStringValueFunc is a mapstructure hook that looks for an incoming +// string mapped to a StringValue and does the translation. +func StringToStringValueFunc() mapstructure.DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + + val := StringValue{} + if t != reflect.TypeOf(val) { + return data, nil + } + val.v = new(string) + *(val.v) = data.(string) + return val, nil + } +} + +// UintValue provides a flag value that's aware if it has been set. +type UintValue struct { + v *uint +} + +// Merge will overlay this value if it has been set. +func (u *UintValue) Merge(onto *uint) { + if u.v != nil { + *onto = *(u.v) + } +} + +// Set implements the flag.Value interface. +func (u *UintValue) Set(v string) error { + if u.v == nil { + u.v = new(uint) + } + parsed, err := strconv.ParseUint(v, 0, 64) + *(u.v) = (uint)(parsed) + return err +} + +// String implements the flag.Value interface. +func (u *UintValue) String() string { + var current uint + if u.v != nil { + current = *(u.v) + } + return fmt.Sprintf("%v", current) +} + +// Float64ToUintValueFunc is a mapstructure hook that looks for an incoming +// float64 mapped to a UintValue and does the translation. +func Float64ToUintValueFunc() mapstructure.DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.Float64 { + return data, nil + } + + val := UintValue{} + if t != reflect.TypeOf(val) { + return data, nil + } + + fv := data.(float64) + if fv < 0 { + return nil, fmt.Errorf("value cannot be negative") + } + + // The standard guarantees at least this, and this is fine for + // values we expect to use in configs vs. being fancy with the + // machine's size for uint. + if fv > (1<<32 - 1) { + return nil, fmt.Errorf("value is too large") + } + + val.v = new(uint) + *(val.v) = (uint)(fv) + return val, nil + } +} + +// VisitFn is a callback that gets a chance to visit each file found during a +// traversal with visit(). +type VisitFn func(path string) error + +// Visit will call the visitor function on the path if it's a file, or for each +// file in the path if it's a directory. Directories will not be recursed into, +// and files in the directory will be visited in alphabetical order. +func Visit(path string, visitor VisitFn) error { + f, err := os.Open(path) + if err != nil { + return fmt.Errorf("error reading %q: %v", path, err) + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + return fmt.Errorf("error checking %q: %v", path, err) + } + + if !fi.IsDir() { + if err := visitor(path); err != nil { + return fmt.Errorf("error in %q: %v", path, err) + } + return nil + } + + contents, err := f.Readdir(-1) + if err != nil { + return fmt.Errorf("error listing %q: %v", path, err) + } + + sort.Sort(dirEnts(contents)) + for _, fi := range contents { + if fi.IsDir() { + continue + } + + fullPath := filepath.Join(path, fi.Name()) + if err := visitor(fullPath); err != nil { + return fmt.Errorf("error in %q: %v", fullPath, err) + } + } + + return nil +} + +// dirEnts applies sort.Interface to directory entries for sorting by name. +type dirEnts []os.FileInfo + +func (d dirEnts) Len() int { return len(d) } +func (d dirEnts) Less(i, j int) bool { return d[i].Name() < d[j].Name() } +func (d dirEnts) Swap(i, j int) { d[i], d[j] = d[j], d[i] } diff --git a/vendor/github.com/hashicorp/consul/command/flags/flag_map_value.go b/vendor/github.com/hashicorp/consul/command/flags/flag_map_value.go new file mode 100644 index 00000000000..aee640b9783 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/flag_map_value.go @@ -0,0 +1,37 @@ +package flags + +import ( + "flag" + "fmt" + "strings" +) + +// Ensure implements +var _ flag.Value = (*FlagMapValue)(nil) + +// FlagMapValue is a flag implementation used to provide key=value semantics +// multiple times. +type FlagMapValue map[string]string + +func (h *FlagMapValue) String() string { + return fmt.Sprintf("%v", *h) +} + +func (h *FlagMapValue) Set(value string) error { + idx := strings.Index(value, "=") + if idx == -1 { + return fmt.Errorf("Missing \"=\" value in argument: %s", value) + } + + key, value := value[0:idx], value[idx+1:] + + if *h == nil { + *h = make(map[string]string) + } + + headers := *h + headers[key] = value + *h = headers + + return nil +} diff --git a/vendor/github.com/hashicorp/consul/command/flags/flag_slice_value.go b/vendor/github.com/hashicorp/consul/command/flags/flag_slice_value.go new file mode 100644 index 00000000000..a40fd1838ec --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/flag_slice_value.go @@ -0,0 +1,20 @@ +package flags + +import "strings" + +// AppendSliceValue implements the flag.Value interface and allows multiple +// calls to the same variable to append a list. +type AppendSliceValue []string + +func (s *AppendSliceValue) String() string { + return strings.Join(*s, ",") +} + +func (s *AppendSliceValue) Set(value string) error { + if *s == nil { + *s = make([]string, 0, 1) + } + + *s = append(*s, value) + return nil +} diff --git a/vendor/github.com/hashicorp/consul/command/flags/http.go b/vendor/github.com/hashicorp/consul/command/flags/http.go new file mode 100644 index 00000000000..1fa78e16713 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/http.go @@ -0,0 +1,100 @@ +package flags + +import ( + "flag" + + "github.com/hashicorp/consul/api" +) + +type HTTPFlags struct { + // client api flags + address StringValue + token StringValue + caFile StringValue + caPath StringValue + certFile StringValue + keyFile StringValue + tlsServerName StringValue + + // server flags + datacenter StringValue + stale BoolValue +} + +func (f *HTTPFlags) ClientFlags() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Var(&f.address, "http-addr", + "The `address` and port of the Consul HTTP agent. The value can be an IP "+ + "address or DNS address, but it must also include the port. This can "+ + "also be specified via the CONSUL_HTTP_ADDR environment variable. The "+ + "default value is http://127.0.0.1:8500. The scheme can also be set to "+ + "HTTPS by setting the environment variable CONSUL_HTTP_SSL=true.") + fs.Var(&f.token, "token", + "ACL token to use in the request. This can also be specified via the "+ + "CONSUL_HTTP_TOKEN environment variable. If unspecified, the query will "+ + "default to the token of the Consul agent at the HTTP address.") + fs.Var(&f.caFile, "ca-file", + "Path to a CA file to use for TLS when communicating with Consul. This "+ + "can also be specified via the CONSUL_CACERT environment variable.") + fs.Var(&f.caPath, "ca-path", + "Path to a directory of CA certificates to use for TLS when communicating "+ + "with Consul. This can also be specified via the CONSUL_CAPATH environment variable.") + fs.Var(&f.certFile, "client-cert", + "Path to a client cert file to use for TLS when 'verify_incoming' is enabled. This "+ + "can also be specified via the CONSUL_CLIENT_CERT environment variable.") + fs.Var(&f.keyFile, "client-key", + "Path to a client key file to use for TLS when 'verify_incoming' is enabled. This "+ + "can also be specified via the CONSUL_CLIENT_KEY environment variable.") + fs.Var(&f.tlsServerName, "tls-server-name", + "The server name to use as the SNI host when connecting via TLS. This "+ + "can also be specified via the CONSUL_TLS_SERVER_NAME environment variable.") + + return fs +} + +func (f *HTTPFlags) ServerFlags() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Var(&f.datacenter, "datacenter", + "Name of the datacenter to query. If unspecified, this will default to "+ + "the datacenter of the queried agent.") + fs.Var(&f.stale, "stale", + "Permit any Consul server (non-leader) to respond to this request. This "+ + "allows for lower latency and higher throughput, but can result in "+ + "stale data. This option has no effect on non-read operations. The "+ + "default value is false.") + return fs +} + +func (f *HTTPFlags) Addr() string { + return f.address.String() +} + +func (f *HTTPFlags) Datacenter() string { + return f.datacenter.String() +} + +func (f *HTTPFlags) Stale() bool { + if f.stale.v == nil { + return false + } + return *f.stale.v +} + +func (f *HTTPFlags) Token() string { + return f.token.String() +} + +func (f *HTTPFlags) APIClient() (*api.Client, error) { + c := api.DefaultConfig() + + f.address.Merge(&c.Address) + f.token.Merge(&c.Token) + f.caFile.Merge(&c.TLSConfig.CAFile) + f.caPath.Merge(&c.TLSConfig.CAPath) + f.certFile.Merge(&c.TLSConfig.CertFile) + f.keyFile.Merge(&c.TLSConfig.KeyFile) + f.tlsServerName.Merge(&c.TLSConfig.Address) + f.datacenter.Merge(&c.Datacenter) + + return api.NewClient(c) +} diff --git a/vendor/github.com/hashicorp/consul/command/flags/merge.go b/vendor/github.com/hashicorp/consul/command/flags/merge.go new file mode 100644 index 00000000000..86b6c774c92 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/merge.go @@ -0,0 +1,15 @@ +package flags + +import "flag" + +func Merge(dst, src *flag.FlagSet) { + if dst == nil { + panic("dst cannot be nil") + } + if src == nil { + return + } + src.VisitAll(func(f *flag.Flag) { + dst.Var(f.Value, f.Name, f.Usage) + }) +} diff --git a/vendor/github.com/hashicorp/consul/command/flags/usage.go b/vendor/github.com/hashicorp/consul/command/flags/usage.go new file mode 100644 index 00000000000..64b40610226 --- /dev/null +++ b/vendor/github.com/hashicorp/consul/command/flags/usage.go @@ -0,0 +1,114 @@ +package flags + +import ( + "bytes" + "flag" + "fmt" + "io" + "strings" + + text "github.com/tonnerre/golang-text" +) + +func Usage(txt string, flags *flag.FlagSet) string { + u := &Usager{ + Usage: txt, + Flags: flags, + } + return u.String() +} + +type Usager struct { + Usage string + Flags *flag.FlagSet +} + +func (u *Usager) String() string { + out := new(bytes.Buffer) + out.WriteString(strings.TrimSpace(u.Usage)) + out.WriteString("\n") + out.WriteString("\n") + + if u.Flags != nil { + f := &HTTPFlags{} + clientFlags := f.ClientFlags() + serverFlags := f.ServerFlags() + + var httpFlags, cmdFlags *flag.FlagSet + u.Flags.VisitAll(func(f *flag.Flag) { + if contains(clientFlags, f) || contains(serverFlags, f) { + if httpFlags == nil { + httpFlags = flag.NewFlagSet("", flag.ContinueOnError) + } + httpFlags.Var(f.Value, f.Name, f.Usage) + } else { + if cmdFlags == nil { + cmdFlags = flag.NewFlagSet("", flag.ContinueOnError) + } + cmdFlags.Var(f.Value, f.Name, f.Usage) + } + }) + + if httpFlags != nil { + printTitle(out, "HTTP API Options") + httpFlags.VisitAll(func(f *flag.Flag) { + printFlag(out, f) + }) + } + + if cmdFlags != nil { + printTitle(out, "Command Options") + cmdFlags.VisitAll(func(f *flag.Flag) { + printFlag(out, f) + }) + } + } + + return strings.TrimRight(out.String(), "\n") +} + +// printTitle prints a consistently-formatted title to the given writer. +func printTitle(w io.Writer, s string) { + fmt.Fprintf(w, "%s\n\n", s) +} + +// printFlag prints a single flag to the given writer. +func printFlag(w io.Writer, f *flag.Flag) { + example, _ := flag.UnquoteUsage(f) + if example != "" { + fmt.Fprintf(w, " -%s=<%s>\n", f.Name, example) + } else { + fmt.Fprintf(w, " -%s\n", f.Name) + } + + indented := wrapAtLength(f.Usage, 5) + fmt.Fprintf(w, "%s\n\n", indented) +} + +// contains returns true if the given flag is contained in the given flag +// set or false otherwise. +func contains(fs *flag.FlagSet, f *flag.Flag) bool { + if fs == nil { + return false + } + + var in bool + fs.VisitAll(func(hf *flag.Flag) { + in = in || f.Name == hf.Name + }) + return in +} + +// maxLineLength is the maximum width of any line. +const maxLineLength int = 72 + +// wrapAtLength wraps the given text at the maxLineLength, taking into account +// any provided left padding. +func wrapAtLength(s string, pad int) string { + wrapped := text.Wrap(s, maxLineLength-pad) + lines := strings.Split(wrapped, "\n") + for i, line := range lines { + lines[i] = strings.Repeat(" ", pad) + line + } + return strings.Join(lines, "\n") +} diff --git a/vendor/github.com/tonnerre/golang-text/License b/vendor/github.com/tonnerre/golang-text/License new file mode 100644 index 00000000000..480a3280599 --- /dev/null +++ b/vendor/github.com/tonnerre/golang-text/License @@ -0,0 +1,19 @@ +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/tonnerre/golang-text/Readme b/vendor/github.com/tonnerre/golang-text/Readme new file mode 100644 index 00000000000..7e6e7c0687b --- /dev/null +++ b/vendor/github.com/tonnerre/golang-text/Readme @@ -0,0 +1,3 @@ +This is a Go package for manipulating paragraphs of text. + +See http://go.pkgdoc.org/github.com/kr/text for full documentation. diff --git a/vendor/github.com/tonnerre/golang-text/doc.go b/vendor/github.com/tonnerre/golang-text/doc.go new file mode 100644 index 00000000000..cf4c198f955 --- /dev/null +++ b/vendor/github.com/tonnerre/golang-text/doc.go @@ -0,0 +1,3 @@ +// Package text provides rudimentary functions for manipulating text in +// paragraphs. +package text diff --git a/vendor/github.com/tonnerre/golang-text/indent.go b/vendor/github.com/tonnerre/golang-text/indent.go new file mode 100644 index 00000000000..4ebac45c092 --- /dev/null +++ b/vendor/github.com/tonnerre/golang-text/indent.go @@ -0,0 +1,74 @@ +package text + +import ( + "io" +) + +// Indent inserts prefix at the beginning of each non-empty line of s. The +// end-of-line marker is NL. +func Indent(s, prefix string) string { + return string(IndentBytes([]byte(s), []byte(prefix))) +} + +// IndentBytes inserts prefix at the beginning of each non-empty line of b. +// The end-of-line marker is NL. +func IndentBytes(b, prefix []byte) []byte { + var res []byte + bol := true + for _, c := range b { + if bol && c != '\n' { + res = append(res, prefix...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// Writer indents each line of its input. +type indentWriter struct { + w io.Writer + bol bool + pre [][]byte + sel int + off int +} + +// NewIndentWriter makes a new write filter that indents the input +// lines. Each line is prefixed in order with the corresponding +// element of pre. If there are more lines than elements, the last +// element of pre is repeated for each subsequent line. +func NewIndentWriter(w io.Writer, pre ...[]byte) io.Writer { + return &indentWriter{ + w: w, + pre: pre, + bol: true, + } +} + +// The only errors returned are from the underlying indentWriter. +func (w *indentWriter) Write(p []byte) (n int, err error) { + for _, c := range p { + if w.bol { + var i int + i, err = w.w.Write(w.pre[w.sel][w.off:]) + w.off += i + if err != nil { + return n, err + } + } + _, err = w.w.Write([]byte{c}) + if err != nil { + return n, err + } + n++ + w.bol = c == '\n' + if w.bol { + w.off = 0 + if w.sel < len(w.pre)-1 { + w.sel++ + } + } + } + return n, nil +} diff --git a/vendor/github.com/tonnerre/golang-text/wrap.go b/vendor/github.com/tonnerre/golang-text/wrap.go new file mode 100755 index 00000000000..ca8856515c3 --- /dev/null +++ b/vendor/github.com/tonnerre/golang-text/wrap.go @@ -0,0 +1,86 @@ +package text + +import ( + "bytes" + "math" +) + +var ( + nl = []byte{'\n'} + sp = []byte{' '} +) + +const defaultPenalty = 1e5 + +// Wrap wraps s into a paragraph of lines of length lim, with minimal +// raggedness. +func Wrap(s string, lim int) string { + return string(WrapBytes([]byte(s), lim)) +} + +// WrapBytes wraps b into a paragraph of lines of length lim, with minimal +// raggedness. +func WrapBytes(b []byte, lim int) []byte { + words := bytes.Split(bytes.Replace(bytes.TrimSpace(b), nl, sp, -1), sp) + var lines [][]byte + for _, line := range WrapWords(words, 1, lim, defaultPenalty) { + lines = append(lines, bytes.Join(line, sp)) + } + return bytes.Join(lines, nl) +} + +// WrapWords is the low-level line-breaking algorithm, useful if you need more +// control over the details of the text wrapping process. For most uses, either +// Wrap or WrapBytes will be sufficient and more convenient. +// +// WrapWords splits a list of words into lines with minimal "raggedness", +// treating each byte as one unit, accounting for spc units between adjacent +// words on each line, and attempting to limit lines to lim units. Raggedness +// is the total error over all lines, where error is the square of the +// difference of the length of the line and lim. Too-long lines (which only +// happen when a single word is longer than lim units) have pen penalty units +// added to the error. +func WrapWords(words [][]byte, spc, lim, pen int) [][][]byte { + n := len(words) + + length := make([][]int, n) + for i := 0; i < n; i++ { + length[i] = make([]int, n) + length[i][i] = len(words[i]) + for j := i + 1; j < n; j++ { + length[i][j] = length[i][j-1] + spc + len(words[j]) + } + } + + nbrk := make([]int, n) + cost := make([]int, n) + for i := range cost { + cost[i] = math.MaxInt32 + } + for i := n - 1; i >= 0; i-- { + if length[i][n-1] <= lim { + cost[i] = 0 + nbrk[i] = n + } else { + for j := i + 1; j < n; j++ { + d := lim - length[i][j-1] + c := d*d + cost[j] + if length[i][j-1] > lim { + c += pen // too-long lines get a worse penalty + } + if c < cost[i] { + cost[i] = c + nbrk[i] = j + } + } + } + } + + var lines [][][]byte + i := 0 + for i < n { + lines = append(lines, words[i:nbrk[i]]) + i = nbrk[i] + } + return lines +} diff --git a/vendor/vendor.json b/vendor/vendor.json index eec26146c22..1c7a938aa8b 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -3,283 +3,286 @@ "ignore": "test appengine", "package": [ {"path":"context","revision":""}, - {"path":"github.com/Azure/go-ansiterm","checksumSHA1":"23FJUX+AInYeEM2hoUMvYZtXZd4=","revision":"fa152c58bc15761d0200cb75fe958b89a9d4888e","revisionTime":"2016-06-22T17:32:16Z"}, - {"path":"github.com/Azure/go-ansiterm/winterm","checksumSHA1":"jBimnggjIiFUjaImNoJhSVLtdzw=","revision":"fa152c58bc15761d0200cb75fe958b89a9d4888e","revisionTime":"2016-06-22T17:32:16Z"}, - {"path":"github.com/DataDog/datadog-go/statsd","checksumSHA1":"WvApwvvSe3i/3KO8300dyeFmkbI=","revision":"b10af4b12965a1ad08d164f57d14195b4140d8de","revisionTime":"2017-08-09T10:47:06Z"}, - {"path":"github.com/Microsoft/go-winio","checksumSHA1":"AzjRkOQtVBTwIw4RJLTygFhJs3s=","revision":"f533f7a102197536779ea3a8cb881d639e21ec5a","revisionTime":"2017-05-24T00:36:31Z"}, - {"path":"github.com/NYTimes/gziphandler","checksumSHA1":"jktW57+vJsziNVPeXMCoujTzdW4=","revision":"97ae7fbaf81620fe97840685304a78a306a39c64","revisionTime":"2017-09-16T00:36:49Z"}, - {"path":"github.com/Nvveen/Gotty","checksumSHA1":"Aqy8/FoAIidY/DeQ5oTYSZ4YFVc=","revision":"cd527374f1e5bff4938207604a14f2e38a9cf512","revisionTime":"2012-06-04T00:48:16Z"}, - {"path":"github.com/RackSec/srslog","checksumSHA1":"OTN4c1F0p+mEG2CpkU1Kuavupf0=","revision":"259aed10dfa74ea2961eddd1d9847619f6e98837","revisionTime":"2016-01-20T22:33:50Z"}, - {"path":"github.com/Sirupsen/logrus","comment":"v0.8.7-87-g4b6ea73","revision":"4b6ea7319e214d98c938f12692336f7ca9348d6b"}, - {"path":"github.com/StackExchange/wmi","checksumSHA1":"qtjd74+bErubh+qyv3s+lWmn9wc=","revision":"ea383cf3ba6ec950874b8486cd72356d007c768f","revisionTime":"2017-04-10T19:29:09Z"}, - {"path":"github.com/appc/spec/schema","checksumSHA1":"uWJDTv0R/NJVYv51LVy6vKP1CZw=","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, - {"path":"github.com/appc/spec/schema/common","checksumSHA1":"Q47G6996hbfQaNp/8CFkGWTVQpw=","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, - {"path":"github.com/appc/spec/schema/types","checksumSHA1":"kYXCle7Ikc8WqiMs7NXz99bUWqo=","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, - {"path":"github.com/appc/spec/schema/types/resource","checksumSHA1":"VgPsPj5PH7LKXMa3ZLe5/+Avydo=","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, + {"checksumSHA1":"23FJUX+AInYeEM2hoUMvYZtXZd4=","path":"github.com/Azure/go-ansiterm","revision":"fa152c58bc15761d0200cb75fe958b89a9d4888e","revisionTime":"2016-06-22T17:32:16Z"}, + {"checksumSHA1":"jBimnggjIiFUjaImNoJhSVLtdzw=","path":"github.com/Azure/go-ansiterm/winterm","revision":"fa152c58bc15761d0200cb75fe958b89a9d4888e","revisionTime":"2016-06-22T17:32:16Z"}, + {"checksumSHA1":"WvApwvvSe3i/3KO8300dyeFmkbI=","path":"github.com/DataDog/datadog-go/statsd","revision":"b10af4b12965a1ad08d164f57d14195b4140d8de","revisionTime":"2017-08-09T10:47:06Z"}, + {"checksumSHA1":"AzjRkOQtVBTwIw4RJLTygFhJs3s=","path":"github.com/Microsoft/go-winio","revision":"f533f7a102197536779ea3a8cb881d639e21ec5a","revisionTime":"2017-05-24T00:36:31Z"}, + {"checksumSHA1":"jktW57+vJsziNVPeXMCoujTzdW4=","path":"github.com/NYTimes/gziphandler","revision":"97ae7fbaf81620fe97840685304a78a306a39c64","revisionTime":"2017-09-16T00:36:49Z"}, + {"checksumSHA1":"Aqy8/FoAIidY/DeQ5oTYSZ4YFVc=","path":"github.com/Nvveen/Gotty","revision":"cd527374f1e5bff4938207604a14f2e38a9cf512","revisionTime":"2012-06-04T00:48:16Z"}, + {"checksumSHA1":"OTN4c1F0p+mEG2CpkU1Kuavupf0=","path":"github.com/RackSec/srslog","revision":"259aed10dfa74ea2961eddd1d9847619f6e98837","revisionTime":"2016-01-20T22:33:50Z"}, + {"comment":"v0.8.7-87-g4b6ea73","path":"github.com/Sirupsen/logrus","revision":"4b6ea7319e214d98c938f12692336f7ca9348d6b"}, + {"checksumSHA1":"qtjd74+bErubh+qyv3s+lWmn9wc=","path":"github.com/StackExchange/wmi","revision":"ea383cf3ba6ec950874b8486cd72356d007c768f","revisionTime":"2017-04-10T19:29:09Z"}, + {"checksumSHA1":"uWJDTv0R/NJVYv51LVy6vKP1CZw=","path":"github.com/appc/spec/schema","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, + {"checksumSHA1":"Q47G6996hbfQaNp/8CFkGWTVQpw=","path":"github.com/appc/spec/schema/common","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, + {"checksumSHA1":"kYXCle7Ikc8WqiMs7NXz99bUWqo=","path":"github.com/appc/spec/schema/types","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, + {"checksumSHA1":"VgPsPj5PH7LKXMa3ZLe5/+Avydo=","path":"github.com/appc/spec/schema/types/resource","revision":"cbe99b7160b1397bf89f9c8bb1418f69c9424049","revisionTime":"2017-09-19T09:55:19Z"}, {"path":"github.com/armon/circbuf","revision":"bbbad097214e2918d8543d5201d12bfd7bca254d"}, - {"path":"github.com/armon/go-metrics","checksumSHA1":"xp/2s4XclLL17DThGBI7jXZ4Crs=","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, - {"path":"github.com/armon/go-metrics/circonus","checksumSHA1":"xCsGGM9TKBogZDfSN536KtQdLko=","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, - {"path":"github.com/armon/go-metrics/datadog","checksumSHA1":"Dt0n1sSivvvdZQdzc4Hu/yOG+T0=","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, - {"path":"github.com/armon/go-metrics/prometheus","checksumSHA1":"XfPPXw55zKziOWnZbkEGEJ96O9c=","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, - {"path":"github.com/armon/go-radix","checksumSHA1":"gNO0JNpLzYOdInGeq7HqMZUzx9M=","revision":"4239b77079c7b5d1243b7b4736304ce8ddb6f0f2","revisionTime":"2016-01-15T23:47:25Z"}, - {"path":"github.com/aws/aws-sdk-go/aws","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/awserr","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/awsutil","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/client","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/client/metadata","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/corehandlers","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/credentials","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/defaults","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/ec2metadata","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/request","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/aws/session","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/endpoints","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/protocol/query","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/protocol/query/queryutil","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/protocol/rest","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/protocol/restxml","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/signer/v4","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/private/waiter","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/aws/aws-sdk-go/service/s3","comment":"v1.0.6-2-g80dd495","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, - {"path":"github.com/beorn7/perks/quantile","checksumSHA1":"spyv5/YFBjYyZLZa1U2LBfDR8PM=","revision":"4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9","revisionTime":"2016-08-04T10:47:26Z"}, - {"path":"github.com/bgentry/go-netrc/netrc","checksumSHA1":"nqw2Qn5xUklssHTubS5HDvEL9L4=","revision":"9fd32a8b3d3d3f9d43c341bfe098430e07609480","revisionTime":"2014-04-22T17:41:19Z"}, + {"checksumSHA1":"xp/2s4XclLL17DThGBI7jXZ4Crs=","path":"github.com/armon/go-metrics","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, + {"checksumSHA1":"xCsGGM9TKBogZDfSN536KtQdLko=","path":"github.com/armon/go-metrics/circonus","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, + {"checksumSHA1":"Dt0n1sSivvvdZQdzc4Hu/yOG+T0=","path":"github.com/armon/go-metrics/datadog","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, + {"checksumSHA1":"XfPPXw55zKziOWnZbkEGEJ96O9c=","path":"github.com/armon/go-metrics/prometheus","revision":"6c3acc97c61d04290a8ba2e54640151f54c1546a","revisionTime":"2017-11-16T18:41:20Z"}, + {"checksumSHA1":"gNO0JNpLzYOdInGeq7HqMZUzx9M=","path":"github.com/armon/go-radix","revision":"4239b77079c7b5d1243b7b4736304ce8ddb6f0f2","revisionTime":"2016-01-15T23:47:25Z"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/awserr","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/awsutil","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/client","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/client/metadata","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/corehandlers","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/credentials","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/defaults","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/ec2metadata","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/request","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/aws/session","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/endpoints","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/protocol/query","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/protocol/query/queryutil","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/protocol/rest","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/protocol/restxml","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/signer/v4","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/private/waiter","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"comment":"v1.0.6-2-g80dd495","path":"github.com/aws/aws-sdk-go/service/s3","revision":"80dd4951fdb3f711d31843b8d87871130ef2df67"}, + {"checksumSHA1":"spyv5/YFBjYyZLZa1U2LBfDR8PM=","path":"github.com/beorn7/perks/quantile","revision":"4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9","revisionTime":"2016-08-04T10:47:26Z"}, + {"checksumSHA1":"nqw2Qn5xUklssHTubS5HDvEL9L4=","path":"github.com/bgentry/go-netrc/netrc","revision":"9fd32a8b3d3d3f9d43c341bfe098430e07609480","revisionTime":"2014-04-22T17:41:19Z"}, {"path":"github.com/bgentry/speakeasy","revision":"36e9cfdd690967f4f690c6edcc9ffacd006014a0"}, {"path":"github.com/bgentry/speakeasy/example","revision":"36e9cfdd690967f4f690c6edcc9ffacd006014a0"}, - {"path":"github.com/boltdb/bolt","checksumSHA1":"R1Q34Pfnt197F/nCOO9kG8c+Z90=","comment":"v1.2.0","revision":"2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8","revisionTime":"2017-07-17T17:11:48Z","version":"v1.3.1","versionExact":"v1.3.1"}, - {"path":"github.com/burntsushi/toml","checksumSHA1":"InIrfOI7Ys1QqZpCgTB4yW1G32M=","revision":"99064174e013895bbd9b025c31100bd1d9b590ca","revisionTime":"2016-07-17T15:07:09Z"}, - {"path":"github.com/circonus-labs/circonus-gometrics","checksumSHA1":"vhCArnFcQRM84iZcfMXka+2OzrE=","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, - {"path":"github.com/circonus-labs/circonus-gometrics/api","checksumSHA1":"sInms3AjZrjG/WCRcmS/NSzLUT4=","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, - {"path":"github.com/circonus-labs/circonus-gometrics/api/config","checksumSHA1":"bQhz/fcyZPmuHSH2qwC4ZtATy5c=","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, - {"path":"github.com/circonus-labs/circonus-gometrics/checkmgr","checksumSHA1":"6hvd+YFb1eWFkc3pVcnOPPa2OVw=","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, - {"path":"github.com/circonus-labs/circonusllhist","checksumSHA1":"VbfeVqeOM+dTNxCmpvmYS0LwQn0=","revision":"7d649b46cdc2cd2ed102d350688a75a4fd7778c6","revisionTime":"2016-11-21T13:51:53Z"}, - {"path":"github.com/containernetworking/cni/pkg/types","checksumSHA1":"NeAp/3+Hedu9tnMai+LihERPj84=","revision":"5c3c17164270150467498a32c71436c7cd5501be","revisionTime":"2016-06-02T16:00:07Z"}, - {"path":"github.com/coreos/go-semver/semver","checksumSHA1":"97BsbXOiZ8+Kr+LIuZkQFtSj7H4=","revision":"1817cd4bea52af76542157eeabd74b057d1a199e","revisionTime":"2017-06-13T09:22:38Z"}, - {"path":"github.com/davecgh/go-spew/spew","checksumSHA1":"mrz/kicZiUaHxkyfvC/DyQcr8Do=","revision":"ecdeabc65495df2dec95d7c4a4c3e021903035e5","revisionTime":"2017-10-02T20:02:53Z"}, - {"path":"github.com/docker/distribution/digestset","checksumSHA1":"Gj+xR1VgFKKmFXYOJMnAczC3Znk=","revision":"69c7f303d511a5777e79505b23340d37d532d7ac","revisionTime":"2017-01-11T18:37:34Z"}, - {"path":"github.com/docker/distribution/reference","checksumSHA1":"FqADPtHUqEtmfC7Zf+0pI++Kb6g=","revision":"69c7f303d511a5777e79505b23340d37d532d7ac","revisionTime":"2017-01-11T18:37:34Z"}, - {"path":"github.com/docker/docker/api/types","checksumSHA1":"HoN/78ovv3/DC+kDKF7IENEc40g=","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, - {"path":"github.com/docker/docker/api/types/blkiodev","checksumSHA1":"jVJDbe0IcyjoKc2xbohwzQr+FF0=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/api/types/container","checksumSHA1":"Vso/6NenP1G74lQjvyvzOdfIZ28=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/api/types/filters","checksumSHA1":"J2OKngfI3vgswudr9PZVUFcRRu0=","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, - {"path":"github.com/docker/docker/api/types/mount","checksumSHA1":"OXsrx4ynzLV+6/6vUeyru0Fprx8=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/api/types/network","checksumSHA1":"Gskp+nvbVe8Gk1xPLHylZvNmqTg=","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, - {"path":"github.com/docker/docker/api/types/registry","checksumSHA1":"r2vWq7Uc3ExKzMqYgH0b4AKjLKY=","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, - {"path":"github.com/docker/docker/api/types/strslice","checksumSHA1":"VTxWyFud/RedrpllGdQonVtGM/A=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/api/types/swarm","checksumSHA1":"Q0U3queMsCw+rPPztXnRHwAxQEc=","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, - {"path":"github.com/docker/docker/api/types/swarm/runtime","checksumSHA1":"mi8EDCDjtrZEONRXPG7VHJosDwY=","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, - {"path":"github.com/docker/docker/api/types/versions","checksumSHA1":"uDPQ3nHsrvGQc9tg/J9OSC4N5dQ=","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, - {"path":"github.com/docker/docker/cli/config/configfile","checksumSHA1":"l8Re54Tp3x8kYWPoD2jXBOWloSY=","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, - {"path":"github.com/docker/docker/opts","checksumSHA1":"mswe275heIklTKj7mPTnVzAFoMk=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/archive","checksumSHA1":"OShlvanyvyee8I0/kdmLuOEOF5w=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/fileutils","checksumSHA1":"EONnM7E8xCzJCAbX1rhayK6knwM=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/homedir","checksumSHA1":"p6Ud4Yf1ywWy20YxXF1RU4yhTio=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/idtools","checksumSHA1":"iP5slJJPRZUm0rfdII8OiATAACA=","revision":"02caa73df411debed164f520a6a1304778f8b88c","revisionTime":"2016-05-28T10:48:36Z"}, - {"path":"github.com/docker/docker/pkg/idtools","checksumSHA1":"iP5slJJPRZUm0rfdII8OiATAACA=","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, - {"path":"github.com/docker/docker/pkg/ioutils","checksumSHA1":"tdhmIGUaoOMEDymMC23qTS7bt0g=","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, - {"path":"github.com/docker/docker/pkg/ioutils","checksumSHA1":"tdhmIGUaoOMEDymMC23qTS7bt0g=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/jsonlog","checksumSHA1":"BlFSSK7zUjPzPuxkLmM/0wpvku8=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/pkg/jsonmessage","checksumSHA1":"IpcW+FAHu0DmbvbhqXuP42f4FCo=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/pkg/longpath","checksumSHA1":"ndnAFCfsGC3upNQ6jAEwzxcurww=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/pools","checksumSHA1":"rArZ5mYIe9I1L5PRQOJu8BwafFw=","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, - {"path":"github.com/docker/docker/pkg/pools","checksumSHA1":"rArZ5mYIe9I1L5PRQOJu8BwafFw=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/promise","checksumSHA1":"txf3EORYff4hO6PEvwBm2lyh1MU=","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, - {"path":"github.com/docker/docker/pkg/promise","checksumSHA1":"txf3EORYff4hO6PEvwBm2lyh1MU=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/random","checksumSHA1":"lThih54jzz9A4zHKEFb9SIV3Ed0=","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, - {"path":"github.com/docker/docker/pkg/stdcopy","checksumSHA1":"YDYbS5U2mDwfcOUJ6M09cP6Bubg=","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, - {"path":"github.com/docker/docker/pkg/stringid","checksumSHA1":"YGZBluVbky9i5i+BgM+RTc0NEtc=","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, - {"path":"github.com/docker/docker/pkg/system","checksumSHA1":"NGqzajRG0Vri8ConQuHY3cCs1RA=","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, - {"path":"github.com/docker/docker/pkg/system","checksumSHA1":"jtruj9m4YJtPaXqUZ5PXdgFQjRA=","revision":"47cd4bf526723100bdbbd5a6bb983cdd668882e9","revisionTime":"2017-03-13T17:42:22Z"}, - {"path":"github.com/docker/docker/pkg/term","checksumSHA1":"Nfp/0W+HK8ZEgklbSWmjJGXTJew=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/pkg/term/windows","checksumSHA1":"EMjTiUTHNxqSsmdMB1V29hRvJbQ=","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, - {"path":"github.com/docker/docker/reference","checksumSHA1":"bASLGmo2Ae+10Pc2zVCpXbBcPag=","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, - {"path":"github.com/docker/docker/registry","checksumSHA1":"AlBQLsNEpPJIe7OxsqN1P3BKi/M=","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, - {"path":"github.com/docker/go-connections/nat","checksumSHA1":"JbiWTzH699Sqz25XmDlsARpMN9w=","revision":"7da10c8c50cad14494ec818dcdfb6506265c0086","revisionTime":"2017-02-03T23:56:24Z"}, - {"path":"github.com/docker/go-units","comment":"v0.1.0-23-g5d2041e","revision":"5d2041e26a699eaca682e2ea41c8f891e1060444"}, + {"checksumSHA1":"R1Q34Pfnt197F/nCOO9kG8c+Z90=","comment":"v1.2.0","path":"github.com/boltdb/bolt","revision":"2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8","revisionTime":"2017-07-17T17:11:48Z","version":"v1.3.1","versionExact":"v1.3.1"}, + {"checksumSHA1":"InIrfOI7Ys1QqZpCgTB4yW1G32M=","path":"github.com/burntsushi/toml","revision":"99064174e013895bbd9b025c31100bd1d9b590ca","revisionTime":"2016-07-17T15:07:09Z"}, + {"checksumSHA1":"vhCArnFcQRM84iZcfMXka+2OzrE=","path":"github.com/circonus-labs/circonus-gometrics","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, + {"checksumSHA1":"sInms3AjZrjG/WCRcmS/NSzLUT4=","path":"github.com/circonus-labs/circonus-gometrics/api","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, + {"checksumSHA1":"bQhz/fcyZPmuHSH2qwC4ZtATy5c=","path":"github.com/circonus-labs/circonus-gometrics/api/config","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, + {"checksumSHA1":"6hvd+YFb1eWFkc3pVcnOPPa2OVw=","path":"github.com/circonus-labs/circonus-gometrics/checkmgr","revision":"a2c28f079ec3d4fdc17ed577cca75bee88a2da25","revisionTime":"2017-01-31T13:03:52Z"}, + {"checksumSHA1":"VbfeVqeOM+dTNxCmpvmYS0LwQn0=","path":"github.com/circonus-labs/circonusllhist","revision":"7d649b46cdc2cd2ed102d350688a75a4fd7778c6","revisionTime":"2016-11-21T13:51:53Z"}, + {"checksumSHA1":"NeAp/3+Hedu9tnMai+LihERPj84=","path":"github.com/containernetworking/cni/pkg/types","revision":"5c3c17164270150467498a32c71436c7cd5501be","revisionTime":"2016-06-02T16:00:07Z"}, + {"checksumSHA1":"97BsbXOiZ8+Kr+LIuZkQFtSj7H4=","path":"github.com/coreos/go-semver/semver","revision":"1817cd4bea52af76542157eeabd74b057d1a199e","revisionTime":"2017-06-13T09:22:38Z"}, + {"checksumSHA1":"mrz/kicZiUaHxkyfvC/DyQcr8Do=","path":"github.com/davecgh/go-spew/spew","revision":"ecdeabc65495df2dec95d7c4a4c3e021903035e5","revisionTime":"2017-10-02T20:02:53Z"}, + {"checksumSHA1":"Gj+xR1VgFKKmFXYOJMnAczC3Znk=","path":"github.com/docker/distribution/digestset","revision":"69c7f303d511a5777e79505b23340d37d532d7ac","revisionTime":"2017-01-11T18:37:34Z"}, + {"checksumSHA1":"FqADPtHUqEtmfC7Zf+0pI++Kb6g=","path":"github.com/docker/distribution/reference","revision":"69c7f303d511a5777e79505b23340d37d532d7ac","revisionTime":"2017-01-11T18:37:34Z"}, + {"checksumSHA1":"HoN/78ovv3/DC+kDKF7IENEc40g=","path":"github.com/docker/docker/api/types","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, + {"checksumSHA1":"jVJDbe0IcyjoKc2xbohwzQr+FF0=","path":"github.com/docker/docker/api/types/blkiodev","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"Vso/6NenP1G74lQjvyvzOdfIZ28=","path":"github.com/docker/docker/api/types/container","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"J2OKngfI3vgswudr9PZVUFcRRu0=","path":"github.com/docker/docker/api/types/filters","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, + {"checksumSHA1":"OXsrx4ynzLV+6/6vUeyru0Fprx8=","path":"github.com/docker/docker/api/types/mount","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"Gskp+nvbVe8Gk1xPLHylZvNmqTg=","path":"github.com/docker/docker/api/types/network","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, + {"checksumSHA1":"r2vWq7Uc3ExKzMqYgH0b4AKjLKY=","path":"github.com/docker/docker/api/types/registry","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, + {"checksumSHA1":"VTxWyFud/RedrpllGdQonVtGM/A=","path":"github.com/docker/docker/api/types/strslice","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"Q0U3queMsCw+rPPztXnRHwAxQEc=","path":"github.com/docker/docker/api/types/swarm","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, + {"checksumSHA1":"mi8EDCDjtrZEONRXPG7VHJosDwY=","path":"github.com/docker/docker/api/types/swarm/runtime","revision":"e4d0fe84f9ea88b0e0cfd847412c9f29442cc62d","revisionTime":"2017-11-14T19:25:14Z"}, + {"checksumSHA1":"uDPQ3nHsrvGQc9tg/J9OSC4N5dQ=","path":"github.com/docker/docker/api/types/versions","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, + {"checksumSHA1":"l8Re54Tp3x8kYWPoD2jXBOWloSY=","path":"github.com/docker/docker/cli/config/configfile","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, + {"checksumSHA1":"mswe275heIklTKj7mPTnVzAFoMk=","path":"github.com/docker/docker/opts","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"OShlvanyvyee8I0/kdmLuOEOF5w=","path":"github.com/docker/docker/pkg/archive","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"EONnM7E8xCzJCAbX1rhayK6knwM=","path":"github.com/docker/docker/pkg/fileutils","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"p6Ud4Yf1ywWy20YxXF1RU4yhTio=","path":"github.com/docker/docker/pkg/homedir","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"iP5slJJPRZUm0rfdII8OiATAACA=","path":"github.com/docker/docker/pkg/idtools","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, + {"checksumSHA1":"iP5slJJPRZUm0rfdII8OiATAACA=","path":"github.com/docker/docker/pkg/idtools","revision":"02caa73df411debed164f520a6a1304778f8b88c","revisionTime":"2016-05-28T10:48:36Z"}, + {"checksumSHA1":"tdhmIGUaoOMEDymMC23qTS7bt0g=","path":"github.com/docker/docker/pkg/ioutils","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"tdhmIGUaoOMEDymMC23qTS7bt0g=","path":"github.com/docker/docker/pkg/ioutils","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, + {"checksumSHA1":"BlFSSK7zUjPzPuxkLmM/0wpvku8=","path":"github.com/docker/docker/pkg/jsonlog","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"IpcW+FAHu0DmbvbhqXuP42f4FCo=","path":"github.com/docker/docker/pkg/jsonmessage","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"ndnAFCfsGC3upNQ6jAEwzxcurww=","path":"github.com/docker/docker/pkg/longpath","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"rArZ5mYIe9I1L5PRQOJu8BwafFw=","path":"github.com/docker/docker/pkg/pools","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"rArZ5mYIe9I1L5PRQOJu8BwafFw=","path":"github.com/docker/docker/pkg/pools","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, + {"checksumSHA1":"txf3EORYff4hO6PEvwBm2lyh1MU=","path":"github.com/docker/docker/pkg/promise","revision":"52debcd58ac91bf68503ce60561536911b74ff05","revisionTime":"2016-05-20T15:17:10Z"}, + {"checksumSHA1":"txf3EORYff4hO6PEvwBm2lyh1MU=","path":"github.com/docker/docker/pkg/promise","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"lThih54jzz9A4zHKEFb9SIV3Ed0=","path":"github.com/docker/docker/pkg/random","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, + {"checksumSHA1":"YDYbS5U2mDwfcOUJ6M09cP6Bubg=","path":"github.com/docker/docker/pkg/stdcopy","revision":"da39e9a4f920a15683dd0f23923c302d4db6eed5","revisionTime":"2016-05-28T08:11:04Z"}, + {"checksumSHA1":"YGZBluVbky9i5i+BgM+RTc0NEtc=","path":"github.com/docker/docker/pkg/stringid","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, + {"checksumSHA1":"NGqzajRG0Vri8ConQuHY3cCs1RA=","path":"github.com/docker/docker/pkg/system","revision":"fe9ab0588606a5566d065bc68ae68f3926ddaa72","revisionTime":"2017-02-28T18:28:19Z"}, + {"checksumSHA1":"jtruj9m4YJtPaXqUZ5PXdgFQjRA=","path":"github.com/docker/docker/pkg/system","revision":"47cd4bf526723100bdbbd5a6bb983cdd668882e9","revisionTime":"2017-03-13T17:42:22Z"}, + {"checksumSHA1":"Nfp/0W+HK8ZEgklbSWmjJGXTJew=","path":"github.com/docker/docker/pkg/term","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"EMjTiUTHNxqSsmdMB1V29hRvJbQ=","path":"github.com/docker/docker/pkg/term/windows","revision":"3dc87714d1bfcaf0620fabec3bfea89620b59337","revisionTime":"2017-02-14T23:27:04Z"}, + {"checksumSHA1":"bASLGmo2Ae+10Pc2zVCpXbBcPag=","path":"github.com/docker/docker/reference","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, + {"checksumSHA1":"AlBQLsNEpPJIe7OxsqN1P3BKi/M=","path":"github.com/docker/docker/registry","revision":"518945b6bd30dc535addf2aac9d5eeefbfc5e523","revisionTime":"2017-01-10T19:35:11Z"}, + {"checksumSHA1":"JbiWTzH699Sqz25XmDlsARpMN9w=","path":"github.com/docker/go-connections/nat","revision":"7da10c8c50cad14494ec818dcdfb6506265c0086","revisionTime":"2017-02-03T23:56:24Z"}, + {"comment":"v0.1.0-23-g5d2041e","path":"github.com/docker/go-units","revision":"5d2041e26a699eaca682e2ea41c8f891e1060444"}, {"path":"github.com/dustin/go-humanize","revision":"8929fe90cee4b2cb9deb468b51fb34eba64d1bf0"}, - {"path":"github.com/elazarl/go-bindata-assetfs","checksumSHA1":"7DxViusFRJ7UPH0jZqYatwDrOkY=","revision":"30f82fa23fd844bd5bb1e5f216db87fd77b5eb43","revisionTime":"2017-02-27T21:27:28Z"}, - {"path":"github.com/fatih/structs","checksumSHA1":"QBkOnLnM6zZ158NJSVLqoE4V6fI=","revision":"14f46232cd7bc732dc67313a9e4d3d210e082587","revisionTime":"2016-07-19T20:45:16Z"}, - {"path":"github.com/fsouza/go-dockerclient","checksumSHA1":"E+wmSQrc/BXzgITrbNAbUzljoiM=","revision":"5ffdfff51ec0eba739b1039e65ba3625ef25f7c0","revisionTime":"2017-11-23T03:37:03Z"}, - {"path":"github.com/go-ini/ini","comment":"v1.8.5-2-g6ec4abd","revision":"6ec4abd8f8d587536da56f730858f0e27aeb4126"}, - {"path":"github.com/go-ole/go-ole","checksumSHA1":"IvHj/4iR2nYa/S3cB2GXoyDG/xQ=","comment":"v1.2.0-4-g5005588","revision":"085abb85892dc1949567b726dff00fa226c60c45","revisionTime":"2017-07-12T17:44:59Z"}, - {"path":"github.com/go-ole/go-ole/oleutil","comment":"v1.2.0-4-g5005588","revision":"50055884d646dd9434f16bbb5c9801749b9bafe4"}, - {"path":"github.com/gogo/protobuf/proto","checksumSHA1":"I460dM/HmGE9DWimQvd1hJkYosU=","revision":"616a82ed12d78d24d4839363e8f3c5d3f20627cf","revisionTime":"2017-11-09T18:15:19Z"}, - {"path":"github.com/golang/protobuf/proto","checksumSHA1":"dUAIotNrGq6Tvz/z6ktSxSHW7Rc=","revision":"0a4f71a498b7c4812f64969510bcb4eca251e33a","revisionTime":"2017-07-12T04:22:13Z"}, - {"path":"github.com/golang/protobuf/ptypes/any","checksumSHA1":"Z4RIWIXH05QItZqVbmbONO9mWig=","revision":"0a4f71a498b7c4812f64969510bcb4eca251e33a","revisionTime":"2017-07-12T04:22:13Z"}, - {"path":"github.com/golang/snappy","checksumSHA1":"W+E/2xXcE1GmJ0Qb784ald0Fn6I=","revision":"d9eb7a3d35ec988b8585d4a0068e462c27d28380","revisionTime":"2016-05-29T05:00:41Z"}, - {"path":"github.com/google/go-cmp/cmp","checksumSHA1":"+suAHHPBmbdZf/HusugaL4/H+NE=","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, - {"path":"github.com/google/go-cmp/cmp/cmpopts","checksumSHA1":"VmBLfV9TChrjNu8Z96wZkYie1aI=","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, - {"path":"github.com/google/go-cmp/cmp/internal/diff","checksumSHA1":"eTwchtMX+RMJUvle2wt295P2h10=","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, - {"path":"github.com/google/go-cmp/cmp/internal/function","checksumSHA1":"kYtvRhMjM0X4bvEjR3pqEHLw1qo=","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, - {"path":"github.com/google/go-cmp/cmp/internal/value","checksumSHA1":"f+mgZLvc4VITtMmBv0bmew4rL2Y=","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, - {"path":"github.com/gorhill/cronexpr","checksumSHA1":"m8B3L3qJ3tFfP6BI9pIFr9oal3w=","comment":"1.0.0","origin":"github.com/dadgar/cronexpr","revision":"675cac9b2d182dccb5ba8d5f8a0d5988df8a4394","revisionTime":"2017-09-15T18:30:32Z"}, - {"path":"github.com/gorhill/cronexpr/cronexpr","comment":"1.0.0","revision":"a557574d6c024ed6e36acc8b610f5f211c91568a"}, - {"path":"github.com/hashicorp/consul-template/child","checksumSHA1":"Nu2j1GusM7ZH0uYrGzqr1K7yH7I=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/config","checksumSHA1":"qKAxyhYnUpKzZ5KpA6aOiIHHqqg=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/dependency","checksumSHA1":"gZUb/+jEn+2hdO/lmQSKcYuOB/o=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/manager","checksumSHA1":"JVwx9FW1/nxRvg1lEeydBhaf3No=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/signals","checksumSHA1":"YSEUV/9/k85XciRKu0cngxdjZLE=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/template","checksumSHA1":"N9qobVzScLbTEnGE7MgFnnTbGBw=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/version","checksumSHA1":"NB5+D4AuCNV9Bsqh3YFdPi4AJ6U=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul-template/watch","checksumSHA1":"b4+Y+02pY2Y5620F9ALzKg8Zmdw=","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, - {"path":"github.com/hashicorp/consul/api","checksumSHA1":"XLfcIX2qpRr0o26aFMjCOzvw6jo=","revision":"51ea240df8476e02215d53fbfad5838bf0d44d21","revisionTime":"2017-10-16T16:22:40Z"}, - {"path":"github.com/hashicorp/consul/lib","checksumSHA1":"HGljdtVaqi/e3DgIHymLRLfPYhw=","revision":"bcafded4e60982d0b71e730f0b8564d73cb1d715","revisionTime":"2017-10-31T16:39:15Z"}, - {"path":"github.com/hashicorp/consul/lib/freeport","checksumSHA1":"hDJiPli3EEGJE4vAezMi05oOC7o=","revision":"bcafded4e60982d0b71e730f0b8564d73cb1d715","revisionTime":"2017-10-31T16:39:15Z"}, - {"path":"github.com/hashicorp/consul/test/porter","checksumSHA1":"5XjgqE4UIfwXvkq5VssGNc7uPhQ=","revision":"ad9425ca6353b8afcfebd19130a8cf768f7eac30","revisionTime":"2017-10-21T00:05:25Z"}, - {"path":"github.com/hashicorp/consul/testutil","checksumSHA1":"+go9ycmyfF4b0W174gc7ej5mnE8=","revision":"350932161d6745836c1b2f39849bddb0f9fb52fd","revisionTime":"2017-10-20T23:49:17Z"}, - {"path":"github.com/hashicorp/consul/testutil/retry","checksumSHA1":"J8TTDc84MvAyXE/FrfgS+xc/b6s=","revision":"350932161d6745836c1b2f39849bddb0f9fb52fd","revisionTime":"2017-10-20T23:49:17Z"}, + {"checksumSHA1":"7DxViusFRJ7UPH0jZqYatwDrOkY=","path":"github.com/elazarl/go-bindata-assetfs","revision":"30f82fa23fd844bd5bb1e5f216db87fd77b5eb43","revisionTime":"2017-02-27T21:27:28Z"}, + {"checksumSHA1":"QBkOnLnM6zZ158NJSVLqoE4V6fI=","path":"github.com/fatih/structs","revision":"14f46232cd7bc732dc67313a9e4d3d210e082587","revisionTime":"2016-07-19T20:45:16Z"}, + {"checksumSHA1":"E+wmSQrc/BXzgITrbNAbUzljoiM=","path":"github.com/fsouza/go-dockerclient","revision":"5ffdfff51ec0eba739b1039e65ba3625ef25f7c0","revisionTime":"2017-11-23T03:37:03Z"}, + {"comment":"v1.8.5-2-g6ec4abd","path":"github.com/go-ini/ini","revision":"6ec4abd8f8d587536da56f730858f0e27aeb4126"}, + {"checksumSHA1":"IvHj/4iR2nYa/S3cB2GXoyDG/xQ=","comment":"v1.2.0-4-g5005588","path":"github.com/go-ole/go-ole","revision":"085abb85892dc1949567b726dff00fa226c60c45","revisionTime":"2017-07-12T17:44:59Z"}, + {"comment":"v1.2.0-4-g5005588","path":"github.com/go-ole/go-ole/oleutil","revision":"50055884d646dd9434f16bbb5c9801749b9bafe4"}, + {"checksumSHA1":"I460dM/HmGE9DWimQvd1hJkYosU=","path":"github.com/gogo/protobuf/proto","revision":"616a82ed12d78d24d4839363e8f3c5d3f20627cf","revisionTime":"2017-11-09T18:15:19Z"}, + {"checksumSHA1":"dUAIotNrGq6Tvz/z6ktSxSHW7Rc=","path":"github.com/golang/protobuf/proto","revision":"0a4f71a498b7c4812f64969510bcb4eca251e33a","revisionTime":"2017-07-12T04:22:13Z"}, + {"checksumSHA1":"Z4RIWIXH05QItZqVbmbONO9mWig=","path":"github.com/golang/protobuf/ptypes/any","revision":"0a4f71a498b7c4812f64969510bcb4eca251e33a","revisionTime":"2017-07-12T04:22:13Z"}, + {"checksumSHA1":"W+E/2xXcE1GmJ0Qb784ald0Fn6I=","path":"github.com/golang/snappy","revision":"d9eb7a3d35ec988b8585d4a0068e462c27d28380","revisionTime":"2016-05-29T05:00:41Z"}, + {"checksumSHA1":"+suAHHPBmbdZf/HusugaL4/H+NE=","path":"github.com/google/go-cmp/cmp","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, + {"checksumSHA1":"VmBLfV9TChrjNu8Z96wZkYie1aI=","path":"github.com/google/go-cmp/cmp/cmpopts","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, + {"checksumSHA1":"eTwchtMX+RMJUvle2wt295P2h10=","path":"github.com/google/go-cmp/cmp/internal/diff","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, + {"checksumSHA1":"kYtvRhMjM0X4bvEjR3pqEHLw1qo=","path":"github.com/google/go-cmp/cmp/internal/function","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, + {"checksumSHA1":"f+mgZLvc4VITtMmBv0bmew4rL2Y=","path":"github.com/google/go-cmp/cmp/internal/value","revision":"d5735f74713c51f7450a43d0a98d41ce2c1db3cb","revisionTime":"2017-09-01T21:42:48Z"}, + {"checksumSHA1":"m8B3L3qJ3tFfP6BI9pIFr9oal3w=","comment":"1.0.0","origin":"github.com/dadgar/cronexpr","path":"github.com/gorhill/cronexpr","revision":"675cac9b2d182dccb5ba8d5f8a0d5988df8a4394","revisionTime":"2017-09-15T18:30:32Z"}, + {"comment":"1.0.0","path":"github.com/gorhill/cronexpr/cronexpr","revision":"a557574d6c024ed6e36acc8b610f5f211c91568a"}, + {"checksumSHA1":"Nu2j1GusM7ZH0uYrGzqr1K7yH7I=","path":"github.com/hashicorp/consul-template/child","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"qKAxyhYnUpKzZ5KpA6aOiIHHqqg=","path":"github.com/hashicorp/consul-template/config","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"gZUb/+jEn+2hdO/lmQSKcYuOB/o=","path":"github.com/hashicorp/consul-template/dependency","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"JVwx9FW1/nxRvg1lEeydBhaf3No=","path":"github.com/hashicorp/consul-template/manager","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"YSEUV/9/k85XciRKu0cngxdjZLE=","path":"github.com/hashicorp/consul-template/signals","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"N9qobVzScLbTEnGE7MgFnnTbGBw=","path":"github.com/hashicorp/consul-template/template","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"NB5+D4AuCNV9Bsqh3YFdPi4AJ6U=","path":"github.com/hashicorp/consul-template/version","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"b4+Y+02pY2Y5620F9ALzKg8Zmdw=","path":"github.com/hashicorp/consul-template/watch","revision":"26d029ad37335b3827a9fde5569b2c5e10dcac8f","revisionTime":"2017-10-31T14:25:17Z"}, + {"checksumSHA1":"B2Y0S6Iq6ADURuXOGB7v79gU9WU=","path":"github.com/hashicorp/consul/agent/consul/autopilot","revision":"d08ab9fd199434e5220276356ecf9617cfec1eb2","revisionTime":"2017-12-18T20:26:35Z"}, + {"checksumSHA1":"XLfcIX2qpRr0o26aFMjCOzvw6jo=","path":"github.com/hashicorp/consul/api","revision":"51ea240df8476e02215d53fbfad5838bf0d44d21","revisionTime":"2017-10-16T16:22:40Z"}, + {"checksumSHA1":"XTQIYV+DPUVRKpVp0+y/78bWH3I=","path":"github.com/hashicorp/consul/command/flags","revision":"d08ab9fd199434e5220276356ecf9617cfec1eb2","revisionTime":"2017-12-18T20:26:35Z"}, + {"checksumSHA1":"HGljdtVaqi/e3DgIHymLRLfPYhw=","path":"github.com/hashicorp/consul/lib","revision":"bcafded4e60982d0b71e730f0b8564d73cb1d715","revisionTime":"2017-10-31T16:39:15Z"}, + {"checksumSHA1":"hDJiPli3EEGJE4vAezMi05oOC7o=","path":"github.com/hashicorp/consul/lib/freeport","revision":"bcafded4e60982d0b71e730f0b8564d73cb1d715","revisionTime":"2017-10-31T16:39:15Z"}, + {"checksumSHA1":"5XjgqE4UIfwXvkq5VssGNc7uPhQ=","path":"github.com/hashicorp/consul/test/porter","revision":"ad9425ca6353b8afcfebd19130a8cf768f7eac30","revisionTime":"2017-10-21T00:05:25Z"}, + {"checksumSHA1":"+go9ycmyfF4b0W174gc7ej5mnE8=","path":"github.com/hashicorp/consul/testutil","revision":"350932161d6745836c1b2f39849bddb0f9fb52fd","revisionTime":"2017-10-20T23:49:17Z"}, + {"checksumSHA1":"J8TTDc84MvAyXE/FrfgS+xc/b6s=","path":"github.com/hashicorp/consul/testutil/retry","revision":"350932161d6745836c1b2f39849bddb0f9fb52fd","revisionTime":"2017-10-20T23:49:17Z"}, {"path":"github.com/hashicorp/errwrap","revision":"7554cd9344cec97297fa6649b055a8c98c2a1e55"}, - {"path":"github.com/hashicorp/go-checkpoint","checksumSHA1":"D267IUMW2rcb+vNe3QU+xhfSrgY=","revision":"1545e56e46dec3bba264e41fde2c1e2aa65b5dd4","revisionTime":"2017-10-09T17:35:28Z"}, - {"path":"github.com/hashicorp/go-cleanhttp","checksumSHA1":"6ihdHMkDfFx/rJ1A36com2F6bQk=","revision":"a45970658e51fea2c41445ff0f7e07106d007617","revisionTime":"2017-02-11T00:33:01Z"}, - {"path":"github.com/hashicorp/go-envparse","checksumSHA1":"mB5JzxaVCPIvbwADY0acdnkhmT8=","revision":"7953113a2936d8e5f7e2a0a3dd8089565c39ef21","revisionTime":"2017-06-02T22:43:19Z"}, - {"path":"github.com/hashicorp/go-getter","checksumSHA1":"wCKbbnwvVEoKAE5TWunloLhErm4=","revision":"994f50a6f071b07cfbea9eca9618c9674091ca51","revisionTime":"2017-12-04T19:28:26Z"}, - {"path":"github.com/hashicorp/go-getter/helper/url","checksumSHA1":"9J+kDr29yDrwsdu2ULzewmqGjpA=","revision":"994f50a6f071b07cfbea9eca9618c9674091ca51","revisionTime":"2017-12-04T19:28:26Z"}, - {"path":"github.com/hashicorp/go-hclog","checksumSHA1":"miVF4/7JP0lRwZvFJGKwZWk7aAQ=","revision":"b4e5765d1e5f00a0550911084f45f8214b5b83b9","revisionTime":"2017-07-16T17:45:23Z"}, - {"path":"github.com/hashicorp/go-immutable-radix","checksumSHA1":"Cas2nprG6pWzf05A2F/OlnjUu2Y=","revision":"8aac2701530899b64bdea735a1de8da899815220","revisionTime":"2017-07-25T22:12:15Z"}, - {"path":"github.com/hashicorp/go-memdb","checksumSHA1":"FMAvwDar2bQyYAW4XMFhAt0J5xA=","revision":"20ff6434c1cc49b80963d45bf5c6aa89c78d8d57","revisionTime":"2017-08-31T20:15:40Z"}, + {"checksumSHA1":"D267IUMW2rcb+vNe3QU+xhfSrgY=","path":"github.com/hashicorp/go-checkpoint","revision":"1545e56e46dec3bba264e41fde2c1e2aa65b5dd4","revisionTime":"2017-10-09T17:35:28Z"}, + {"checksumSHA1":"6ihdHMkDfFx/rJ1A36com2F6bQk=","path":"github.com/hashicorp/go-cleanhttp","revision":"a45970658e51fea2c41445ff0f7e07106d007617","revisionTime":"2017-02-11T00:33:01Z"}, + {"checksumSHA1":"mB5JzxaVCPIvbwADY0acdnkhmT8=","path":"github.com/hashicorp/go-envparse","revision":"7953113a2936d8e5f7e2a0a3dd8089565c39ef21","revisionTime":"2017-06-02T22:43:19Z"}, + {"checksumSHA1":"wCKbbnwvVEoKAE5TWunloLhErm4=","path":"github.com/hashicorp/go-getter","revision":"994f50a6f071b07cfbea9eca9618c9674091ca51","revisionTime":"2017-12-04T19:28:26Z"}, + {"checksumSHA1":"9J+kDr29yDrwsdu2ULzewmqGjpA=","path":"github.com/hashicorp/go-getter/helper/url","revision":"994f50a6f071b07cfbea9eca9618c9674091ca51","revisionTime":"2017-12-04T19:28:26Z"}, + {"checksumSHA1":"miVF4/7JP0lRwZvFJGKwZWk7aAQ=","path":"github.com/hashicorp/go-hclog","revision":"b4e5765d1e5f00a0550911084f45f8214b5b83b9","revisionTime":"2017-07-16T17:45:23Z"}, + {"checksumSHA1":"Cas2nprG6pWzf05A2F/OlnjUu2Y=","path":"github.com/hashicorp/go-immutable-radix","revision":"8aac2701530899b64bdea735a1de8da899815220","revisionTime":"2017-07-25T22:12:15Z"}, + {"checksumSHA1":"FMAvwDar2bQyYAW4XMFhAt0J5xA=","path":"github.com/hashicorp/go-memdb","revision":"20ff6434c1cc49b80963d45bf5c6aa89c78d8d57","revisionTime":"2017-08-31T20:15:40Z"}, {"path":"github.com/hashicorp/go-msgpack/codec","revision":"fa3f63826f7c23912c15263591e65d54d080b458"}, {"path":"github.com/hashicorp/go-multierror","revision":"d30f09973e19c1dfcd120b2d9c4f168e68d6b5d5"}, - {"path":"github.com/hashicorp/go-plugin","checksumSHA1":"R6me0jVmcT/OPo80Fe0qo5fRwHc=","revision":"3e6d191694b5a3a2b99755f31b47fa209e4bcd09","revisionTime":"2017-08-28T02:45:49Z"}, - {"path":"github.com/hashicorp/go-retryablehttp","checksumSHA1":"ErJHGU6AVPZM9yoY/xV11TwSjQs=","revision":"6e85be8fee1dcaa02c0eaaac2df5a8fbecf94145","revisionTime":"2016-09-30T03:51:02Z"}, - {"path":"github.com/hashicorp/go-rootcerts","checksumSHA1":"A1PcINvF3UiwHRKn8UcgARgvGRs=","revision":"6bb64b370b90e7ef1fa532be9e591a81c3493e00","revisionTime":"2016-05-03T14:34:40Z"}, - {"path":"github.com/hashicorp/go-sockaddr","checksumSHA1":"X2tSlVe532du67MEIU1KHoCT68k=","revision":"e12d9401a74f025fe672cd1a84b2081c773990d3","revisionTime":"2017-06-22T20:44:38Z"}, - {"path":"github.com/hashicorp/go-sockaddr/template","checksumSHA1":"mIUCMmRHslN2bxQZ0uObMnXxk9E=","revision":"e12d9401a74f025fe672cd1a84b2081c773990d3","revisionTime":"2017-06-22T20:44:38Z"}, + {"checksumSHA1":"R6me0jVmcT/OPo80Fe0qo5fRwHc=","path":"github.com/hashicorp/go-plugin","revision":"3e6d191694b5a3a2b99755f31b47fa209e4bcd09","revisionTime":"2017-08-28T02:45:49Z"}, + {"checksumSHA1":"ErJHGU6AVPZM9yoY/xV11TwSjQs=","path":"github.com/hashicorp/go-retryablehttp","revision":"6e85be8fee1dcaa02c0eaaac2df5a8fbecf94145","revisionTime":"2016-09-30T03:51:02Z"}, + {"checksumSHA1":"A1PcINvF3UiwHRKn8UcgARgvGRs=","path":"github.com/hashicorp/go-rootcerts","revision":"6bb64b370b90e7ef1fa532be9e591a81c3493e00","revisionTime":"2016-05-03T14:34:40Z"}, + {"checksumSHA1":"X2tSlVe532du67MEIU1KHoCT68k=","path":"github.com/hashicorp/go-sockaddr","revision":"e12d9401a74f025fe672cd1a84b2081c773990d3","revisionTime":"2017-06-22T20:44:38Z"}, + {"checksumSHA1":"mIUCMmRHslN2bxQZ0uObMnXxk9E=","path":"github.com/hashicorp/go-sockaddr/template","revision":"e12d9401a74f025fe672cd1a84b2081c773990d3","revisionTime":"2017-06-22T20:44:38Z"}, {"path":"github.com/hashicorp/go-syslog","revision":"42a2b573b664dbf281bd48c3cc12c086b17a39ba"}, - {"path":"github.com/hashicorp/go-uuid","checksumSHA1":"mAkPa/RLuIwN53GbwIEMATexams=","revision":"64130c7a86d732268a38cb04cfbaf0cc987fda98","revisionTime":"2016-07-17T02:21:40Z"}, - {"path":"github.com/hashicorp/go-version","checksumSHA1":"tUGxc7rfX0cmhOOUDhMuAZ9rWsA=","revision":"03c5bf6be031b6dd45afec16b1cf94fc8938bc77","revisionTime":"2017-02-02T08:07:59Z"}, - {"path":"github.com/hashicorp/golang-lru","checksumSHA1":"d9PxF1XQGLMJZRct2R8qVM/eYlE=","revision":"a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4","revisionTime":"2016-02-07T21:47:19Z"}, + {"checksumSHA1":"mAkPa/RLuIwN53GbwIEMATexams=","path":"github.com/hashicorp/go-uuid","revision":"64130c7a86d732268a38cb04cfbaf0cc987fda98","revisionTime":"2016-07-17T02:21:40Z"}, + {"checksumSHA1":"tUGxc7rfX0cmhOOUDhMuAZ9rWsA=","path":"github.com/hashicorp/go-version","revision":"03c5bf6be031b6dd45afec16b1cf94fc8938bc77","revisionTime":"2017-02-02T08:07:59Z"}, + {"checksumSHA1":"d9PxF1XQGLMJZRct2R8qVM/eYlE=","path":"github.com/hashicorp/golang-lru","revision":"a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4","revisionTime":"2016-02-07T21:47:19Z"}, {"path":"github.com/hashicorp/golang-lru/simplelru","revision":"a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4"}, - {"path":"github.com/hashicorp/hcl","checksumSHA1":"8OPDk+bKyRGJoKcS4QNw9F7dpE8=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/hcl/ast","checksumSHA1":"XQmjDva9JCGGkIecOgwtBEMCJhU=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/hcl/parser","checksumSHA1":"croNloscHsjX87X+4/cKOURf1EY=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/hcl/scanner","checksumSHA1":"lgR7PSAZ0RtvAc9OCtCnNsF/x8g=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/hcl/strconv","checksumSHA1":"JlZmnzqdmFFyb1+2afLyR3BOE/8=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/hcl/token","checksumSHA1":"c6yprzj06ASwCo18TtbbNNBHljA=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/json/parser","checksumSHA1":"138aCV5n8n7tkGYMsMVQQnnLq+0=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/json/scanner","checksumSHA1":"YdvFsNOMSWMLnY6fcliWQa0O5Fw=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, - {"path":"github.com/hashicorp/hcl/json/token","checksumSHA1":"fNlXQCQEnb+B3k5UDL/r15xtSJY=","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"8OPDk+bKyRGJoKcS4QNw9F7dpE8=","path":"github.com/hashicorp/hcl","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"XQmjDva9JCGGkIecOgwtBEMCJhU=","path":"github.com/hashicorp/hcl/hcl/ast","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"croNloscHsjX87X+4/cKOURf1EY=","path":"github.com/hashicorp/hcl/hcl/parser","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"lgR7PSAZ0RtvAc9OCtCnNsF/x8g=","path":"github.com/hashicorp/hcl/hcl/scanner","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"JlZmnzqdmFFyb1+2afLyR3BOE/8=","path":"github.com/hashicorp/hcl/hcl/strconv","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"c6yprzj06ASwCo18TtbbNNBHljA=","path":"github.com/hashicorp/hcl/hcl/token","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"138aCV5n8n7tkGYMsMVQQnnLq+0=","path":"github.com/hashicorp/hcl/json/parser","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"YdvFsNOMSWMLnY6fcliWQa0O5Fw=","path":"github.com/hashicorp/hcl/json/scanner","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, + {"checksumSHA1":"fNlXQCQEnb+B3k5UDL/r15xtSJY=","path":"github.com/hashicorp/hcl/json/token","revision":"6e968a3fcdcbab092f5307fd0d85479d5af1e4dc","revisionTime":"2016-11-01T18:00:25Z"}, {"path":"github.com/hashicorp/logutils","revision":"0dc08b1671f34c4250ce212759ebd880f743d883"}, - {"path":"github.com/hashicorp/memberlist","checksumSHA1":"1zk7IeGClUqBo+Phsx89p7fQ/rQ=","revision":"23ad4b7d7b38496cd64c241dfd4c60b7794c254a","revisionTime":"2017-02-08T21:15:06Z"}, + {"checksumSHA1":"1zk7IeGClUqBo+Phsx89p7fQ/rQ=","path":"github.com/hashicorp/memberlist","revision":"23ad4b7d7b38496cd64c241dfd4c60b7794c254a","revisionTime":"2017-02-08T21:15:06Z"}, {"path":"github.com/hashicorp/net-rpc-msgpackrpc","revision":"a14192a58a694c123d8fe5481d4a4727d6ae82f3"}, - {"path":"github.com/hashicorp/raft","checksumSHA1":"ecpaHOImbL/NaivWrUDUUe5461E=","revision":"3a6f3bdfe4fc69e300c6d122b1a92051af6f0b95","revisionTime":"2017-08-07T22:22:24Z"}, - {"path":"github.com/hashicorp/raft-boltdb","checksumSHA1":"QAxukkv54/iIvLfsUP6IK4R0m/A=","revision":"d1e82c1ec3f15ee991f7cc7ffd5b67ff6f5bbaee","revisionTime":"2015-02-01T20:08:39Z"}, - {"path":"github.com/hashicorp/serf/coordinate","checksumSHA1":"/oss17GO4hXGM7QnUdI3VzcAHzA=","revision":"bbeddf0b3ab3072a60525afbd6b6f47d33839eee","revisionTime":"2017-07-14T18:26:01Z"}, - {"path":"github.com/hashicorp/serf/serf","checksumSHA1":"pvLOzocYsZtxuJ9pREHRTxYnoa4=","revision":"bbeddf0b3ab3072a60525afbd6b6f47d33839eee","revisionTime":"2017-07-14T18:26:01Z"}, - {"path":"github.com/hashicorp/vault","checksumSHA1":"eGzvBRMFD6ZB3A6uO750np7Om/E=","revision":"182ba68a9589d4cef95234134aaa498a686e3de3","revisionTime":"2016-08-21T23:40:57Z"}, - {"path":"github.com/hashicorp/vault/api","checksumSHA1":"hLIXn9iQhPcjY+/G64j3mIlLlK8=","revision":"0c3e14f047aede0a70256e1e8b321610910b246e","revisionTime":"2017-08-01T15:50:41Z"}, - {"path":"github.com/hashicorp/vault/helper/compressutil","checksumSHA1":"au+CDkddC4sVFV15UaPiI7FvSw0=","revision":"1fd46cbcb10569bd205c3f662e7a4f16f1e69056","revisionTime":"2017-08-11T01:28:18Z"}, - {"path":"github.com/hashicorp/vault/helper/jsonutil","checksumSHA1":"yUiSTPf0QUuL2r/81sjuytqBoeQ=","revision":"0c3e14f047aede0a70256e1e8b321610910b246e","revisionTime":"2017-08-01T15:50:41Z"}, - {"path":"github.com/hashicorp/vault/helper/parseutil","checksumSHA1":"GGveKvOwScWGZAAnupzpyw+0Jko=","revision":"1fd46cbcb10569bd205c3f662e7a4f16f1e69056","revisionTime":"2017-08-11T01:28:18Z"}, - {"path":"github.com/hashicorp/yamux","checksumSHA1":"VMaF3Q7RIrRzvbnPbqxuSLryOvc=","revision":"badf81fca035b8ebac61b5ab83330b72541056f4","revisionTime":"2016-06-09T13:59:02Z"}, - {"path":"github.com/hpcloud/tail/util","checksumSHA1":"0xM336Lb25URO/1W1/CtGoRygVU=","revision":"37f4271387456dd1bf82ab1ad9229f060cc45386","revisionTime":"2017-08-14T16:06:53Z"}, - {"path":"github.com/hpcloud/tail/watch","checksumSHA1":"TP4OAv5JMtzj2TB6OQBKqauaKDc=","revision":"37f4271387456dd1bf82ab1ad9229f060cc45386","revisionTime":"2017-08-14T16:06:53Z"}, - {"path":"github.com/jmespath/go-jmespath","comment":"0.2.2-2-gc01cf91","revision":"c01cf91b011868172fdcd9f41838e80c9d716264"}, + {"checksumSHA1":"ecpaHOImbL/NaivWrUDUUe5461E=","path":"github.com/hashicorp/raft","revision":"3a6f3bdfe4fc69e300c6d122b1a92051af6f0b95","revisionTime":"2017-08-07T22:22:24Z"}, + {"checksumSHA1":"QAxukkv54/iIvLfsUP6IK4R0m/A=","path":"github.com/hashicorp/raft-boltdb","revision":"d1e82c1ec3f15ee991f7cc7ffd5b67ff6f5bbaee","revisionTime":"2015-02-01T20:08:39Z"}, + {"checksumSHA1":"/oss17GO4hXGM7QnUdI3VzcAHzA=","path":"github.com/hashicorp/serf/coordinate","revision":"bbeddf0b3ab3072a60525afbd6b6f47d33839eee","revisionTime":"2017-07-14T18:26:01Z"}, + {"checksumSHA1":"pvLOzocYsZtxuJ9pREHRTxYnoa4=","path":"github.com/hashicorp/serf/serf","revision":"bbeddf0b3ab3072a60525afbd6b6f47d33839eee","revisionTime":"2017-07-14T18:26:01Z"}, + {"checksumSHA1":"eGzvBRMFD6ZB3A6uO750np7Om/E=","path":"github.com/hashicorp/vault","revision":"182ba68a9589d4cef95234134aaa498a686e3de3","revisionTime":"2016-08-21T23:40:57Z"}, + {"checksumSHA1":"hLIXn9iQhPcjY+/G64j3mIlLlK8=","path":"github.com/hashicorp/vault/api","revision":"0c3e14f047aede0a70256e1e8b321610910b246e","revisionTime":"2017-08-01T15:50:41Z"}, + {"checksumSHA1":"au+CDkddC4sVFV15UaPiI7FvSw0=","path":"github.com/hashicorp/vault/helper/compressutil","revision":"1fd46cbcb10569bd205c3f662e7a4f16f1e69056","revisionTime":"2017-08-11T01:28:18Z"}, + {"checksumSHA1":"yUiSTPf0QUuL2r/81sjuytqBoeQ=","path":"github.com/hashicorp/vault/helper/jsonutil","revision":"0c3e14f047aede0a70256e1e8b321610910b246e","revisionTime":"2017-08-01T15:50:41Z"}, + {"checksumSHA1":"GGveKvOwScWGZAAnupzpyw+0Jko=","path":"github.com/hashicorp/vault/helper/parseutil","revision":"1fd46cbcb10569bd205c3f662e7a4f16f1e69056","revisionTime":"2017-08-11T01:28:18Z"}, + {"checksumSHA1":"VMaF3Q7RIrRzvbnPbqxuSLryOvc=","path":"github.com/hashicorp/yamux","revision":"badf81fca035b8ebac61b5ab83330b72541056f4","revisionTime":"2016-06-09T13:59:02Z"}, + {"checksumSHA1":"0xM336Lb25URO/1W1/CtGoRygVU=","path":"github.com/hpcloud/tail/util","revision":"37f4271387456dd1bf82ab1ad9229f060cc45386","revisionTime":"2017-08-14T16:06:53Z"}, + {"checksumSHA1":"TP4OAv5JMtzj2TB6OQBKqauaKDc=","path":"github.com/hpcloud/tail/watch","revision":"37f4271387456dd1bf82ab1ad9229f060cc45386","revisionTime":"2017-08-14T16:06:53Z"}, + {"comment":"0.2.2-2-gc01cf91","path":"github.com/jmespath/go-jmespath","revision":"c01cf91b011868172fdcd9f41838e80c9d716264"}, {"path":"github.com/kardianos/osext","revision":"29ae4ffbc9a6fe9fb2bc5029050ce6996ea1d3bc"}, - {"path":"github.com/kr/pretty","checksumSHA1":"eOXF2PEvYLMeD8DSzLZJWbjYzco=","revision":"cfb55aafdaf3ec08f0db22699ab822c50091b1c4","revisionTime":"2016-08-23T17:07:15Z"}, - {"path":"github.com/kr/text","checksumSHA1":"uulQHQ7IsRKqDudBC8Go9J0gtAc=","revision":"7cafcd837844e784b526369c9bce262804aebc60","revisionTime":"2016-05-04T02:26:26Z"}, - {"path":"github.com/mattn/go-isatty","checksumSHA1":"trzmsZQDCc13zk/6qANox7Z/KCg=","revision":"fc9e8d8ef48496124e79ae0df75490096eccf6fe","revisionTime":"2017-03-22T23:44:13Z"}, - {"path":"github.com/mattn/go-shellwords","checksumSHA1":"ajImwVZHzsI+aNwsgzCSFSbmJqs=","revision":"f4e566c536cf69158e808ec28ef4182a37fdc981","revisionTime":"2015-03-21T17:42:21Z"}, - {"path":"github.com/matttproud/golang_protobuf_extensions/pbutil","checksumSHA1":"bKMZjd2wPw13VwoE7mBeSv5djFA=","revision":"c12348ce28de40eed0136aa2b644d0ee0650e56c","revisionTime":"2016-04-24T11:30:07Z"}, + {"checksumSHA1":"eOXF2PEvYLMeD8DSzLZJWbjYzco=","path":"github.com/kr/pretty","revision":"cfb55aafdaf3ec08f0db22699ab822c50091b1c4","revisionTime":"2016-08-23T17:07:15Z"}, + {"checksumSHA1":"uulQHQ7IsRKqDudBC8Go9J0gtAc=","path":"github.com/kr/text","revision":"7cafcd837844e784b526369c9bce262804aebc60","revisionTime":"2016-05-04T02:26:26Z"}, + {"checksumSHA1":"trzmsZQDCc13zk/6qANox7Z/KCg=","path":"github.com/mattn/go-isatty","revision":"fc9e8d8ef48496124e79ae0df75490096eccf6fe","revisionTime":"2017-03-22T23:44:13Z"}, + {"checksumSHA1":"ajImwVZHzsI+aNwsgzCSFSbmJqs=","path":"github.com/mattn/go-shellwords","revision":"f4e566c536cf69158e808ec28ef4182a37fdc981","revisionTime":"2015-03-21T17:42:21Z"}, + {"checksumSHA1":"bKMZjd2wPw13VwoE7mBeSv5djFA=","path":"github.com/matttproud/golang_protobuf_extensions/pbutil","revision":"c12348ce28de40eed0136aa2b644d0ee0650e56c","revisionTime":"2016-04-24T11:30:07Z"}, {"path":"github.com/miekg/dns","revision":"7e024ce8ce18b21b475ac6baf8fa3c42536bf2fa"}, - {"path":"github.com/mitchellh/cli","checksumSHA1":"UIqCj7qI0hhIMpAhS9YYqs2jD48=","revision":"65fcae5817c8600da98ada9d7edf26dd1a84837b","revisionTime":"2017-09-08T18:10:43Z"}, - {"path":"github.com/mitchellh/colorstring","checksumSHA1":"ttEN1Aupb7xpPMkQLqb3tzLFdXs=","revision":"8631ce90f28644f54aeedcb3e389a85174e067d1","revisionTime":"2015-09-17T21:48:07Z"}, - {"path":"github.com/mitchellh/copystructure","checksumSHA1":"+p4JY4wmFQAppCdlrJ8Kxybmht8=","revision":"d23ffcb85de31694d6ccaa23ccb4a03e55c1303f","revisionTime":"2017-05-25T01:39:02Z"}, - {"path":"github.com/mitchellh/go-homedir","checksumSHA1":"AXacfEchaUqT5RGmPmMXsOWRhv8=","revision":"756f7b183b7ab78acdbbee5c7f392838ed459dda","revisionTime":"2016-06-21T17:42:43Z"}, - {"path":"github.com/mitchellh/go-ps","checksumSHA1":"DcYIZnMiq/Tj22/ge9os3NwOhs4=","revision":"4fdf99ab29366514c69ccccddab5dc58b8d84062","revisionTime":"2017-03-09T13:30:38Z"}, - {"path":"github.com/mitchellh/go-testing-interface","checksumSHA1":"bDdhmDk8q6utWrccBhEOa6IoGkE=","revision":"a61a99592b77c9ba629d254a693acffaeb4b7e28","revisionTime":"2017-10-04T22:19:16Z"}, + {"checksumSHA1":"UIqCj7qI0hhIMpAhS9YYqs2jD48=","path":"github.com/mitchellh/cli","revision":"65fcae5817c8600da98ada9d7edf26dd1a84837b","revisionTime":"2017-09-08T18:10:43Z"}, + {"checksumSHA1":"ttEN1Aupb7xpPMkQLqb3tzLFdXs=","path":"github.com/mitchellh/colorstring","revision":"8631ce90f28644f54aeedcb3e389a85174e067d1","revisionTime":"2015-09-17T21:48:07Z"}, + {"checksumSHA1":"+p4JY4wmFQAppCdlrJ8Kxybmht8=","path":"github.com/mitchellh/copystructure","revision":"d23ffcb85de31694d6ccaa23ccb4a03e55c1303f","revisionTime":"2017-05-25T01:39:02Z"}, + {"checksumSHA1":"AXacfEchaUqT5RGmPmMXsOWRhv8=","path":"github.com/mitchellh/go-homedir","revision":"756f7b183b7ab78acdbbee5c7f392838ed459dda","revisionTime":"2016-06-21T17:42:43Z"}, + {"checksumSHA1":"DcYIZnMiq/Tj22/ge9os3NwOhs4=","path":"github.com/mitchellh/go-ps","revision":"4fdf99ab29366514c69ccccddab5dc58b8d84062","revisionTime":"2017-03-09T13:30:38Z"}, + {"checksumSHA1":"bDdhmDk8q6utWrccBhEOa6IoGkE=","path":"github.com/mitchellh/go-testing-interface","revision":"a61a99592b77c9ba629d254a693acffaeb4b7e28","revisionTime":"2017-10-04T22:19:16Z"}, {"path":"github.com/mitchellh/hashstructure","revision":"1ef5c71b025aef149d12346356ac5973992860bc"}, {"path":"github.com/mitchellh/mapstructure","revision":"281073eb9eb092240d33ef253c404f1cca550309"}, - {"path":"github.com/mitchellh/reflectwalk","checksumSHA1":"KqsMqI+Y+3EFYPhyzafpIneaVCM=","revision":"8d802ff4ae93611b807597f639c19f76074df5c6","revisionTime":"2017-05-08T17:38:06Z"}, - {"path":"github.com/opencontainers/go-digest","checksumSHA1":"NTperEHVh1uBqfTy9+oKceN4tKI=","revision":"21dfd564fd89c944783d00d069f33e3e7123c448","revisionTime":"2017-01-11T18:16:59Z"}, - {"path":"github.com/opencontainers/image-spec/specs-go","checksumSHA1":"ZGlIwSRjdLYCUII7JLE++N4w7Xc=","revision":"89b51c794e9113108a2914e38e66c826a649f2b5","revisionTime":"2017-11-03T11:36:04Z"}, - {"path":"github.com/opencontainers/image-spec/specs-go/v1","checksumSHA1":"jdbXRRzeu0njLE9/nCEZG+Yg/Jk=","revision":"89b51c794e9113108a2914e38e66c826a649f2b5","revisionTime":"2017-11-03T11:36:04Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/cgroups","checksumSHA1":"UPfYFznGeLEloCkGG8KKgsKjtPU=","comment":"v0.0.9-108-g89ab7f2","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/cgroups/fs","checksumSHA1":"xIrNApwB9+yQBhu2p6bt7blV+x4=","comment":"v0.0.9-108-g89ab7f2","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/configs","checksumSHA1":"CdhRZZmDeY+t3PN4Qpi1ojy50pE=","comment":"v0.0.9-108-g89ab7f2","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/system","checksumSHA1":"xo2LfoL27cGF6cChWvew2KfhpNI=","comment":"v0.0.9-108-g89ab7f2","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/user","checksumSHA1":"3AoPMXlmVq2+iWMpsdJZkcUKHB8=","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/opencontainers/runc/libcontainer/utils","checksumSHA1":"PCfoPliJrUhzLP4arNs2KjEb2Bc=","comment":"v0.0.9-108-g89ab7f2","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, - {"path":"github.com/pkg/errors","checksumSHA1":"ynJSWoF6v+3zMnh9R0QmmG6iGV8=","revision":"248dadf4e9068a0b3e79f02ed0a610d935de5302","revisionTime":"2016-10-29T09:36:37Z"}, - {"path":"github.com/pmezard/go-difflib/difflib","checksumSHA1":"LuFv4/jlrmFNnDb/5SCSEPAM9vU=","revision":"792786c7400a136282c1664665ae0a8db921c6c2","revisionTime":"2016-01-10T10:55:54Z"}, - {"path":"github.com/posener/complete","checksumSHA1":"rTNABfFJ9wtLQRH8uYNkEZGQOrY=","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, - {"path":"github.com/posener/complete/cmd","checksumSHA1":"NB7uVS0/BJDmNu68vPAlbrq4TME=","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, - {"path":"github.com/posener/complete/cmd/install","checksumSHA1":"gSX86Xl0w9hvtntdT8h23DZtSag=","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, - {"path":"github.com/posener/complete/match","checksumSHA1":"DMo94FwJAm9ZCYCiYdJU2+bh4no=","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, - {"path":"github.com/prometheus/client_golang/prometheus","checksumSHA1":"+5YXakGoZBEMrHp6h64TC5GSFfg=","revision":"671c87b04728565380d95c621edc687bfa00664c","revisionTime":"2017-09-07T15:06:25Z"}, - {"path":"github.com/prometheus/client_golang/prometheus/promhttp","checksumSHA1":"wsAkYlRRUNx+OAuUOIqdjO7dICM=","revision":"671c87b04728565380d95c621edc687bfa00664c","revisionTime":"2017-09-07T15:06:25Z"}, - {"path":"github.com/prometheus/client_model/go","checksumSHA1":"DvwvOlPNAgRntBzt3b3OSRMS2N4=","revision":"6f3806018612930941127f2a7c6c453ba2c527d2","revisionTime":"2017-02-16T18:52:47Z"}, - {"path":"github.com/prometheus/common/expfmt","checksumSHA1":"xfnn0THnqNwjwimeTClsxahYrIo=","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, - {"path":"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg","checksumSHA1":"GWlM3d2vPYyNATtTFgftS10/A9w=","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, - {"path":"github.com/prometheus/common/model","checksumSHA1":"3VoqH7TFfzA6Ds0zFzIbKCUvBmw=","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, - {"path":"github.com/prometheus/procfs","checksumSHA1":"ihxJIjxtbEYdQKwA0D0nRipj95I=","revision":"e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2","revisionTime":"2017-07-03T10:12:42Z"}, - {"path":"github.com/prometheus/procfs/xfs","checksumSHA1":"xCiFAAwVTrjsfZT1BIJQ3DgeNCY=","revision":"e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2","revisionTime":"2017-07-03T10:12:42Z"}, - {"path":"github.com/rkt/rkt/api/v1","checksumSHA1":"ge4Z0w3QJJYTBqJaK3S+a6MCxzQ=","revision":"3abde24bc284b7ded5784c56b4e8184c28999641","revisionTime":"2017-08-01T12:18:56Z","version":"v1.28.1","versionExact":"v1.28.1"}, - {"path":"github.com/rkt/rkt/networking/netinfo","checksumSHA1":"4QqLbh9MmajcN6gCx8Er1voiQys=","revision":"5e83d91aafef5f7a38fef62c045e8b57eeeb8bce","revisionTime":"2017-09-20T12:17:54Z"}, - {"path":"github.com/rs/cors","checksumSHA1":"I778b2sbNN/yjwKSdb3y7hz2yUQ=","revision":"eabcc6af4bbe5ad3a949d36450326a2b0b9894b8","revisionTime":"2017-08-01T07:32:01Z"}, - {"path":"github.com/ryanuber/columnize","checksumSHA1":"M57Rrfc8Z966p+IBtQ91QOcUtcg=","comment":"v2.0.1-8-g983d3a5","revision":"abc90934186a77966e2beeac62ed966aac0561d5","revisionTime":"2017-07-03T20:58:27Z"}, - {"path":"github.com/sean-/seed","checksumSHA1":"tnMZLo/kR9Kqx6GtmWwowtTLlA8=","revision":"e2103e2c35297fb7e17febb81e49b312087a2372","revisionTime":"2017-03-13T16:33:22Z"}, - {"path":"github.com/sethgrid/pester","checksumSHA1":"8Lm8nsMCFz4+gr9EvQLqK8+w+Ks=","revision":"8053687f99650573b28fb75cddf3f295082704d7","revisionTime":"2016-04-29T17:20:22Z"}, - {"path":"github.com/shirou/gopsutil/cpu","checksumSHA1":"T2ThCk35wXAZGh37nrgA07199dA=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/disk","checksumSHA1":"T4uyVXPqCS5rj4vYLgv04as0Avw=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/host","checksumSHA1":"YBXpUckp1TtJf2mfMLx/bpnm22Q=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/internal/common","checksumSHA1":"jUWM0P4G1bHpO9CPS8gcr4rt1t0=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/mem","checksumSHA1":"xIAuacHA0LNq1yM5Wd1q4lnbzxU=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/net","checksumSHA1":"moxD+mq0dMHnbTeFyeEHK0Iq7i8=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/gopsutil/process","checksumSHA1":"C6ybAAUmWz+PQKqJ8byV7Nj5JXQ=","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, - {"path":"github.com/shirou/w32","checksumSHA1":"Nve7SpDmjsv6+rhkXAkfg/UQx94=","revision":"bb4de0191aa41b5507caa14b0650cdbddcd9280b","revisionTime":"2016-09-30T03:27:40Z"}, - {"path":"github.com/skratchdot/open-golang/open","checksumSHA1":"h/HMhokbQHTdLUbruoBBTee+NYw=","revision":"75fb7ed4208cf72d323d7d02fd1a5964a7a9073c","revisionTime":"2016-03-02T14:40:31Z"}, - {"path":"github.com/spf13/pflag","checksumSHA1":"Q52Y7t0lEtk/wcDn5q7tS7B+jqs=","revision":"7aff26db30c1be810f9de5038ec5ef96ac41fd7c","revisionTime":"2017-08-24T17:57:12Z"}, - {"path":"github.com/stretchr/objx","checksumSHA1":"K0crHygPTP42i1nLKWphSlvOQJw=","revision":"1a9d0bb9f541897e62256577b352fdbc1fb4fd94","revisionTime":"2015-09-28T12:21:52Z"}, - {"path":"github.com/stretchr/testify/mock","checksumSHA1":"o+jsS/rxceTym4M3reSPfrPxaio=","revision":"f6abca593680b2315d2075e0f5e2a9751e3f431a","revisionTime":"2017-06-01T20:57:54Z"}, - {"path":"github.com/ugorji/go/codec","checksumSHA1":"8G1zvpE4gTtWQRuP/x2HPVDmflo=","revision":"0053ebfd9d0ee06ccefbfe17072021e1d4acebee","revisionTime":"2017-06-20T06:01:02Z"}, - {"path":"github.com/ugorji/go/codec/codecgen","checksumSHA1":"OgParimNuU2CJqr3pcTympeQZUc=","revision":"5efa3251c7f7d05e5d9704a69a984ec9f1386a40","revisionTime":"2017-06-20T10:48:52Z"}, - {"path":"github.com/ulikunitz/xz","checksumSHA1":"z2kAtVle4NFV2OExI85fZoTcsI4=","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, - {"path":"github.com/ulikunitz/xz/internal/hash","checksumSHA1":"vjnTkzNrMs5Xj6so/fq0mQ6dT1c=","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, - {"path":"github.com/ulikunitz/xz/internal/xlog","checksumSHA1":"m0pm57ASBK/CTdmC0ppRHO17mBs=","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, - {"path":"github.com/ulikunitz/xz/lzma","checksumSHA1":"2vZw6zc8xuNlyVz2QKvdlNSZQ1U=","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, - {"path":"go4.org/errorutil","checksumSHA1":"PMr/a5kcnC4toJtVwWhlU5E4tJY=","revision":"034d17a462f7b2dcd1a4a73553ec5357ff6e6c6e","revisionTime":"2017-05-24T23:16:39Z"}, - {"path":"golang.org/x/crypto/blake2b","checksumSHA1":"5TlXhxVMqfHQKpCKucmXNeE6/kc=","revision":"74b34b9dd60829a9fcaf56a59e81c3877a8ecd2c","revisionTime":"2017-09-02T17:19:23Z"}, - {"path":"golang.org/x/crypto/ssh/terminal","checksumSHA1":"nqWNlnMmVpt628zzvyo6Yv2CX5Q=","revision":"eb71ad9bd329b5ac0fd0148dd99bd62e8be8e035","revisionTime":"2017-08-07T10:11:13Z"}, - {"path":"golang.org/x/net/context","checksumSHA1":"9jjO5GjLa0XF/nfWihF02RoH4qc=","revision":"30db96677b74e24b967e23f911eb3364fc61a011","revisionTime":"2016-05-25T13:11:03Z"}, - {"path":"golang.org/x/net/context/ctxhttp","checksumSHA1":"WHc3uByvGaMcnSoI21fhzYgbOgg=","revision":"f09c4662a0bd6bd8943ac7b4931e185df9471da4","revisionTime":"2016-09-24T00:10:04Z"}, - {"path":"golang.org/x/net/http2","checksumSHA1":"kKuxyoDujo5CopTxAvvZ1rrLdd0=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/net/http2/hpack","checksumSHA1":"ezWhc7n/FtqkLDQKeU2JbW+80tE=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/net/idna","checksumSHA1":"g/Z/Ka0VgJESgQK7/SJCjm/aX0I=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/net/internal/timeseries","checksumSHA1":"UxahDzW2v4mf/+aFxruuupaoIwo=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/net/lex/httplex","checksumSHA1":"3xyuaSNmClqG4YWC7g0isQIbUTc=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/net/trace","checksumSHA1":"u/r66lwYfgg682u5hZG7/E7+VCY=","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, - {"path":"golang.org/x/sync/errgroup","checksumSHA1":"S0DP7Pn7sZUmXc55IzZnNvERu6s=","revision":"316e794f7b5e3df4e95175a45a5fb8b12f85cb4f","revisionTime":"2016-07-15T18:54:39Z"}, - {"path":"golang.org/x/sys/unix","checksumSHA1":"SIhhNXud9FKua0s3WlGPRRkDKRg=","revision":"8b4580aae2a0dd0c231a45d3ccb8434ff533b840","revisionTime":"2017-11-30T16:26:51Z"}, - {"path":"golang.org/x/sys/windows","checksumSHA1":"riTVymIu2BFphV6UlA73Fn9tmmU=","revision":"8b4580aae2a0dd0c231a45d3ccb8434ff533b840","revisionTime":"2017-11-30T16:26:51Z"}, - {"path":"golang.org/x/text/secure/bidirule","checksumSHA1":"tltivJ/uj/lqLk05IqGfCv2F/E8=","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, - {"path":"golang.org/x/text/transform","checksumSHA1":"ziMb9+ANGRJSSIuxYdRbA+cDRBQ=","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, - {"path":"golang.org/x/text/unicode/bidi","checksumSHA1":"iB6/RoQIzBaZxVi+t7tzbkwZTlo=","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, - {"path":"golang.org/x/text/unicode/norm","checksumSHA1":"km/8bLtOpIP7sua4MnEmiSDYTAE=","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, - {"path":"golang.org/x/time/rate","checksumSHA1":"h/06ikMECfJoTkWj2e1nJ30aDDg=","revision":"a4bde12657593d5e90d0533a3e4fd95e635124cb","revisionTime":"2016-02-02T18:34:45Z"}, - {"path":"google.golang.org/genproto/googleapis/rpc/status","checksumSHA1":"AvVpgwhxhJgjoSledwDtYrEKVE4=","revision":"b0a3dcfcd1a9bd48e63634bd8802960804cf8315","revisionTime":"2017-07-11T23:52:30Z"}, - {"path":"google.golang.org/grpc","checksumSHA1":"2HA7jxFtX4Dp7Lt3wafAUXa9IZc=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/codes","checksumSHA1":"/eTpFgjvMq5Bc9hYnw5fzKG4B6I=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/credentials","checksumSHA1":"5ylThBvJnIcyWhL17AC9+Sdbw2E=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/grpclb/grpc_lb_v1","checksumSHA1":"2NbY9kmMweE4VUsruRsvmViVnNg=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/grpclog","checksumSHA1":"MCQmohiDJwkgLWu/wpnekweQh8s=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/health","checksumSHA1":"pc9cweMiKQ5hVMuO9UoMGdbizaY=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/health/grpc_health_v1","checksumSHA1":"W5KfI1NIGJt7JaVnLzefDZr3+4s=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/internal","checksumSHA1":"U9vDe05/tQrvFBojOQX8Xk12W9I=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/keepalive","checksumSHA1":"hcuHgKp8W0wIzoCnNfKI8NUss5o=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/metadata","checksumSHA1":"N++Ur11m6Dq3j14/Hc2Kqmxroag=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/naming","checksumSHA1":"Zzb7Xsc3tbTJzrcZbSPyye+yxmw=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/peer","checksumSHA1":"n5EgDdBqFMa2KQFhtl+FF/4gIFo=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/stats","checksumSHA1":"ZY8Tq61fGK1stTuvwK5WoqcU8j8=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/status","checksumSHA1":"DIv9qbApAoh2cF2G3Br24lVPqUI=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/tap","checksumSHA1":"aixGx/Kd0cj9ZlZHacpHe3XgMQ4=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"google.golang.org/grpc/transport","checksumSHA1":"oFGr0JoquaPGVnV86fVL8MVTc3A=","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, - {"path":"gopkg.in/fsnotify.v1","checksumSHA1":"eIhF+hmL/XZhzTiAwhLD0M65vlY=","revision":"629574ca2a5df945712d3079857300b5e4da0236","revisionTime":"2016-10-11T02:33:12Z"}, - {"path":"gopkg.in/inf.v0","checksumSHA1":"6f8MEU31llHM1sLM/GGH4/Qxu0A=","revision":"3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4","revisionTime":"2015-09-11T12:57:57Z"}, - {"path":"gopkg.in/lxc/go-lxc.v2","checksumSHA1":"i97goLq3AIfUNB8l1hxGGMSW0+s=","revision":"f8a6938e600c634232eeef79dc04a1226f73a88b","revisionTime":"2016-08-03T16:52:18Z"}, - {"path":"gopkg.in/tomb.v1","checksumSHA1":"TO8baX+t1Qs7EmOYth80MkbKzFo=","revision":"dd632973f1e7218eb1089048e0798ec9ae7dceb8","revisionTime":"2014-10-24T13:56:13Z"}, - {"path":"gopkg.in/tomb.v2","checksumSHA1":"WiyCOMvfzRdymImAJ3ME6aoYUdM=","revision":"14b3d72120e8d10ea6e6b7f87f7175734b1faab8","revisionTime":"2014-06-26T14:46:23Z"}, - {"path":"gopkg.in/yaml.v2","checksumSHA1":"12GqsW8PiRPnezDDy0v4brZrndM=","revision":"a5b47d31c556af34a302ce5d659e6fea44d90de0","revisionTime":"2016-09-28T15:37:09Z"} + {"checksumSHA1":"KqsMqI+Y+3EFYPhyzafpIneaVCM=","path":"github.com/mitchellh/reflectwalk","revision":"8d802ff4ae93611b807597f639c19f76074df5c6","revisionTime":"2017-05-08T17:38:06Z"}, + {"checksumSHA1":"NTperEHVh1uBqfTy9+oKceN4tKI=","path":"github.com/opencontainers/go-digest","revision":"21dfd564fd89c944783d00d069f33e3e7123c448","revisionTime":"2017-01-11T18:16:59Z"}, + {"checksumSHA1":"ZGlIwSRjdLYCUII7JLE++N4w7Xc=","path":"github.com/opencontainers/image-spec/specs-go","revision":"89b51c794e9113108a2914e38e66c826a649f2b5","revisionTime":"2017-11-03T11:36:04Z"}, + {"checksumSHA1":"jdbXRRzeu0njLE9/nCEZG+Yg/Jk=","path":"github.com/opencontainers/image-spec/specs-go/v1","revision":"89b51c794e9113108a2914e38e66c826a649f2b5","revisionTime":"2017-11-03T11:36:04Z"}, + {"checksumSHA1":"UPfYFznGeLEloCkGG8KKgsKjtPU=","comment":"v0.0.9-108-g89ab7f2","path":"github.com/opencontainers/runc/libcontainer/cgroups","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"xIrNApwB9+yQBhu2p6bt7blV+x4=","comment":"v0.0.9-108-g89ab7f2","path":"github.com/opencontainers/runc/libcontainer/cgroups/fs","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"CdhRZZmDeY+t3PN4Qpi1ojy50pE=","comment":"v0.0.9-108-g89ab7f2","path":"github.com/opencontainers/runc/libcontainer/configs","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"xo2LfoL27cGF6cChWvew2KfhpNI=","comment":"v0.0.9-108-g89ab7f2","path":"github.com/opencontainers/runc/libcontainer/system","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"3AoPMXlmVq2+iWMpsdJZkcUKHB8=","path":"github.com/opencontainers/runc/libcontainer/user","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"PCfoPliJrUhzLP4arNs2KjEb2Bc=","comment":"v0.0.9-108-g89ab7f2","path":"github.com/opencontainers/runc/libcontainer/utils","revision":"89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8","revisionTime":"2016-03-31T09:02:02Z"}, + {"checksumSHA1":"ynJSWoF6v+3zMnh9R0QmmG6iGV8=","path":"github.com/pkg/errors","revision":"248dadf4e9068a0b3e79f02ed0a610d935de5302","revisionTime":"2016-10-29T09:36:37Z"}, + {"checksumSHA1":"LuFv4/jlrmFNnDb/5SCSEPAM9vU=","path":"github.com/pmezard/go-difflib/difflib","revision":"792786c7400a136282c1664665ae0a8db921c6c2","revisionTime":"2016-01-10T10:55:54Z"}, + {"checksumSHA1":"rTNABfFJ9wtLQRH8uYNkEZGQOrY=","path":"github.com/posener/complete","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, + {"checksumSHA1":"NB7uVS0/BJDmNu68vPAlbrq4TME=","path":"github.com/posener/complete/cmd","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, + {"checksumSHA1":"gSX86Xl0w9hvtntdT8h23DZtSag=","path":"github.com/posener/complete/cmd/install","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, + {"checksumSHA1":"DMo94FwJAm9ZCYCiYdJU2+bh4no=","path":"github.com/posener/complete/match","revision":"9f41f7636a724791a3b8b1d35e84caa1124f0d3c","revisionTime":"2017-08-29T17:11:12Z"}, + {"checksumSHA1":"+5YXakGoZBEMrHp6h64TC5GSFfg=","path":"github.com/prometheus/client_golang/prometheus","revision":"671c87b04728565380d95c621edc687bfa00664c","revisionTime":"2017-09-07T15:06:25Z"}, + {"checksumSHA1":"wsAkYlRRUNx+OAuUOIqdjO7dICM=","path":"github.com/prometheus/client_golang/prometheus/promhttp","revision":"671c87b04728565380d95c621edc687bfa00664c","revisionTime":"2017-09-07T15:06:25Z"}, + {"checksumSHA1":"DvwvOlPNAgRntBzt3b3OSRMS2N4=","path":"github.com/prometheus/client_model/go","revision":"6f3806018612930941127f2a7c6c453ba2c527d2","revisionTime":"2017-02-16T18:52:47Z"}, + {"checksumSHA1":"xfnn0THnqNwjwimeTClsxahYrIo=","path":"github.com/prometheus/common/expfmt","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, + {"checksumSHA1":"GWlM3d2vPYyNATtTFgftS10/A9w=","path":"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, + {"checksumSHA1":"3VoqH7TFfzA6Ds0zFzIbKCUvBmw=","path":"github.com/prometheus/common/model","revision":"2f17f4a9d485bf34b4bfaccc273805040e4f86c8","revisionTime":"2017-09-08T16:18:22Z"}, + {"checksumSHA1":"ihxJIjxtbEYdQKwA0D0nRipj95I=","path":"github.com/prometheus/procfs","revision":"e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2","revisionTime":"2017-07-03T10:12:42Z"}, + {"checksumSHA1":"xCiFAAwVTrjsfZT1BIJQ3DgeNCY=","path":"github.com/prometheus/procfs/xfs","revision":"e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2","revisionTime":"2017-07-03T10:12:42Z"}, + {"checksumSHA1":"ge4Z0w3QJJYTBqJaK3S+a6MCxzQ=","path":"github.com/rkt/rkt/api/v1","revision":"3abde24bc284b7ded5784c56b4e8184c28999641","revisionTime":"2017-08-01T12:18:56Z","version":"v1.28.1","versionExact":"v1.28.1"}, + {"checksumSHA1":"4QqLbh9MmajcN6gCx8Er1voiQys=","path":"github.com/rkt/rkt/networking/netinfo","revision":"5e83d91aafef5f7a38fef62c045e8b57eeeb8bce","revisionTime":"2017-09-20T12:17:54Z"}, + {"checksumSHA1":"I778b2sbNN/yjwKSdb3y7hz2yUQ=","path":"github.com/rs/cors","revision":"eabcc6af4bbe5ad3a949d36450326a2b0b9894b8","revisionTime":"2017-08-01T07:32:01Z"}, + {"checksumSHA1":"M57Rrfc8Z966p+IBtQ91QOcUtcg=","comment":"v2.0.1-8-g983d3a5","path":"github.com/ryanuber/columnize","revision":"abc90934186a77966e2beeac62ed966aac0561d5","revisionTime":"2017-07-03T20:58:27Z"}, + {"checksumSHA1":"tnMZLo/kR9Kqx6GtmWwowtTLlA8=","path":"github.com/sean-/seed","revision":"e2103e2c35297fb7e17febb81e49b312087a2372","revisionTime":"2017-03-13T16:33:22Z"}, + {"checksumSHA1":"8Lm8nsMCFz4+gr9EvQLqK8+w+Ks=","path":"github.com/sethgrid/pester","revision":"8053687f99650573b28fb75cddf3f295082704d7","revisionTime":"2016-04-29T17:20:22Z"}, + {"checksumSHA1":"T2ThCk35wXAZGh37nrgA07199dA=","path":"github.com/shirou/gopsutil/cpu","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"T4uyVXPqCS5rj4vYLgv04as0Avw=","path":"github.com/shirou/gopsutil/disk","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"YBXpUckp1TtJf2mfMLx/bpnm22Q=","path":"github.com/shirou/gopsutil/host","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"jUWM0P4G1bHpO9CPS8gcr4rt1t0=","path":"github.com/shirou/gopsutil/internal/common","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"xIAuacHA0LNq1yM5Wd1q4lnbzxU=","path":"github.com/shirou/gopsutil/mem","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"moxD+mq0dMHnbTeFyeEHK0Iq7i8=","path":"github.com/shirou/gopsutil/net","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"C6ybAAUmWz+PQKqJ8byV7Nj5JXQ=","path":"github.com/shirou/gopsutil/process","revision":"1c211f0807a3436707409fa313599dd8c7a48664","revisionTime":"2017-08-17T03:45:37Z"}, + {"checksumSHA1":"Nve7SpDmjsv6+rhkXAkfg/UQx94=","path":"github.com/shirou/w32","revision":"bb4de0191aa41b5507caa14b0650cdbddcd9280b","revisionTime":"2016-09-30T03:27:40Z"}, + {"checksumSHA1":"h/HMhokbQHTdLUbruoBBTee+NYw=","path":"github.com/skratchdot/open-golang/open","revision":"75fb7ed4208cf72d323d7d02fd1a5964a7a9073c","revisionTime":"2016-03-02T14:40:31Z"}, + {"checksumSHA1":"Q52Y7t0lEtk/wcDn5q7tS7B+jqs=","path":"github.com/spf13/pflag","revision":"7aff26db30c1be810f9de5038ec5ef96ac41fd7c","revisionTime":"2017-08-24T17:57:12Z"}, + {"checksumSHA1":"K0crHygPTP42i1nLKWphSlvOQJw=","path":"github.com/stretchr/objx","revision":"1a9d0bb9f541897e62256577b352fdbc1fb4fd94","revisionTime":"2015-09-28T12:21:52Z"}, + {"checksumSHA1":"o+jsS/rxceTym4M3reSPfrPxaio=","path":"github.com/stretchr/testify/mock","revision":"f6abca593680b2315d2075e0f5e2a9751e3f431a","revisionTime":"2017-06-01T20:57:54Z"}, + {"checksumSHA1":"t24KnvC9jRxiANVhpw2pqFpmEu8=","path":"github.com/tonnerre/golang-text","revision":"048ed3d792f7104850acbc8cfc01e5a6070f4c04","revisionTime":"2013-09-25T19:58:46Z"}, + {"checksumSHA1":"8G1zvpE4gTtWQRuP/x2HPVDmflo=","path":"github.com/ugorji/go/codec","revision":"0053ebfd9d0ee06ccefbfe17072021e1d4acebee","revisionTime":"2017-06-20T06:01:02Z"}, + {"checksumSHA1":"OgParimNuU2CJqr3pcTympeQZUc=","path":"github.com/ugorji/go/codec/codecgen","revision":"5efa3251c7f7d05e5d9704a69a984ec9f1386a40","revisionTime":"2017-06-20T10:48:52Z"}, + {"checksumSHA1":"z2kAtVle4NFV2OExI85fZoTcsI4=","path":"github.com/ulikunitz/xz","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, + {"checksumSHA1":"vjnTkzNrMs5Xj6so/fq0mQ6dT1c=","path":"github.com/ulikunitz/xz/internal/hash","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, + {"checksumSHA1":"m0pm57ASBK/CTdmC0ppRHO17mBs=","path":"github.com/ulikunitz/xz/internal/xlog","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, + {"checksumSHA1":"2vZw6zc8xuNlyVz2QKvdlNSZQ1U=","path":"github.com/ulikunitz/xz/lzma","revision":"0c6b41e72360850ca4f98dc341fd999726ea007f","revisionTime":"2017-06-05T21:53:11Z"}, + {"checksumSHA1":"PMr/a5kcnC4toJtVwWhlU5E4tJY=","path":"go4.org/errorutil","revision":"034d17a462f7b2dcd1a4a73553ec5357ff6e6c6e","revisionTime":"2017-05-24T23:16:39Z"}, + {"checksumSHA1":"5TlXhxVMqfHQKpCKucmXNeE6/kc=","path":"golang.org/x/crypto/blake2b","revision":"74b34b9dd60829a9fcaf56a59e81c3877a8ecd2c","revisionTime":"2017-09-02T17:19:23Z"}, + {"checksumSHA1":"nqWNlnMmVpt628zzvyo6Yv2CX5Q=","path":"golang.org/x/crypto/ssh/terminal","revision":"eb71ad9bd329b5ac0fd0148dd99bd62e8be8e035","revisionTime":"2017-08-07T10:11:13Z"}, + {"checksumSHA1":"9jjO5GjLa0XF/nfWihF02RoH4qc=","path":"golang.org/x/net/context","revision":"30db96677b74e24b967e23f911eb3364fc61a011","revisionTime":"2016-05-25T13:11:03Z"}, + {"checksumSHA1":"WHc3uByvGaMcnSoI21fhzYgbOgg=","path":"golang.org/x/net/context/ctxhttp","revision":"f09c4662a0bd6bd8943ac7b4931e185df9471da4","revisionTime":"2016-09-24T00:10:04Z"}, + {"checksumSHA1":"kKuxyoDujo5CopTxAvvZ1rrLdd0=","path":"golang.org/x/net/http2","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"ezWhc7n/FtqkLDQKeU2JbW+80tE=","path":"golang.org/x/net/http2/hpack","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"g/Z/Ka0VgJESgQK7/SJCjm/aX0I=","path":"golang.org/x/net/idna","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"UxahDzW2v4mf/+aFxruuupaoIwo=","path":"golang.org/x/net/internal/timeseries","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"3xyuaSNmClqG4YWC7g0isQIbUTc=","path":"golang.org/x/net/lex/httplex","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"u/r66lwYfgg682u5hZG7/E7+VCY=","path":"golang.org/x/net/trace","revision":"ab5485076ff3407ad2d02db054635913f017b0ed","revisionTime":"2017-07-19T21:11:51Z"}, + {"checksumSHA1":"S0DP7Pn7sZUmXc55IzZnNvERu6s=","path":"golang.org/x/sync/errgroup","revision":"316e794f7b5e3df4e95175a45a5fb8b12f85cb4f","revisionTime":"2016-07-15T18:54:39Z"}, + {"checksumSHA1":"SIhhNXud9FKua0s3WlGPRRkDKRg=","path":"golang.org/x/sys/unix","revision":"8b4580aae2a0dd0c231a45d3ccb8434ff533b840","revisionTime":"2017-11-30T16:26:51Z"}, + {"checksumSHA1":"riTVymIu2BFphV6UlA73Fn9tmmU=","path":"golang.org/x/sys/windows","revision":"8b4580aae2a0dd0c231a45d3ccb8434ff533b840","revisionTime":"2017-11-30T16:26:51Z"}, + {"checksumSHA1":"tltivJ/uj/lqLk05IqGfCv2F/E8=","path":"golang.org/x/text/secure/bidirule","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, + {"checksumSHA1":"ziMb9+ANGRJSSIuxYdRbA+cDRBQ=","path":"golang.org/x/text/transform","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, + {"checksumSHA1":"iB6/RoQIzBaZxVi+t7tzbkwZTlo=","path":"golang.org/x/text/unicode/bidi","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, + {"checksumSHA1":"km/8bLtOpIP7sua4MnEmiSDYTAE=","path":"golang.org/x/text/unicode/norm","revision":"88f656faf3f37f690df1a32515b479415e1a6769","revisionTime":"2017-10-26T07:52:28Z"}, + {"checksumSHA1":"h/06ikMECfJoTkWj2e1nJ30aDDg=","path":"golang.org/x/time/rate","revision":"a4bde12657593d5e90d0533a3e4fd95e635124cb","revisionTime":"2016-02-02T18:34:45Z"}, + {"checksumSHA1":"AvVpgwhxhJgjoSledwDtYrEKVE4=","path":"google.golang.org/genproto/googleapis/rpc/status","revision":"b0a3dcfcd1a9bd48e63634bd8802960804cf8315","revisionTime":"2017-07-11T23:52:30Z"}, + {"checksumSHA1":"2HA7jxFtX4Dp7Lt3wafAUXa9IZc=","path":"google.golang.org/grpc","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"/eTpFgjvMq5Bc9hYnw5fzKG4B6I=","path":"google.golang.org/grpc/codes","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"5ylThBvJnIcyWhL17AC9+Sdbw2E=","path":"google.golang.org/grpc/credentials","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"2NbY9kmMweE4VUsruRsvmViVnNg=","path":"google.golang.org/grpc/grpclb/grpc_lb_v1","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"MCQmohiDJwkgLWu/wpnekweQh8s=","path":"google.golang.org/grpc/grpclog","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"pc9cweMiKQ5hVMuO9UoMGdbizaY=","path":"google.golang.org/grpc/health","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"W5KfI1NIGJt7JaVnLzefDZr3+4s=","path":"google.golang.org/grpc/health/grpc_health_v1","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"U9vDe05/tQrvFBojOQX8Xk12W9I=","path":"google.golang.org/grpc/internal","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"hcuHgKp8W0wIzoCnNfKI8NUss5o=","path":"google.golang.org/grpc/keepalive","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"N++Ur11m6Dq3j14/Hc2Kqmxroag=","path":"google.golang.org/grpc/metadata","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"Zzb7Xsc3tbTJzrcZbSPyye+yxmw=","path":"google.golang.org/grpc/naming","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"n5EgDdBqFMa2KQFhtl+FF/4gIFo=","path":"google.golang.org/grpc/peer","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"ZY8Tq61fGK1stTuvwK5WoqcU8j8=","path":"google.golang.org/grpc/stats","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"DIv9qbApAoh2cF2G3Br24lVPqUI=","path":"google.golang.org/grpc/status","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"aixGx/Kd0cj9ZlZHacpHe3XgMQ4=","path":"google.golang.org/grpc/tap","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"oFGr0JoquaPGVnV86fVL8MVTc3A=","path":"google.golang.org/grpc/transport","revision":"0c41876308d45bc82e587965971e28be659a1aca","revisionTime":"2017-07-21T17:58:12Z"}, + {"checksumSHA1":"eIhF+hmL/XZhzTiAwhLD0M65vlY=","path":"gopkg.in/fsnotify.v1","revision":"629574ca2a5df945712d3079857300b5e4da0236","revisionTime":"2016-10-11T02:33:12Z"}, + {"checksumSHA1":"6f8MEU31llHM1sLM/GGH4/Qxu0A=","path":"gopkg.in/inf.v0","revision":"3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4","revisionTime":"2015-09-11T12:57:57Z"}, + {"checksumSHA1":"i97goLq3AIfUNB8l1hxGGMSW0+s=","path":"gopkg.in/lxc/go-lxc.v2","revision":"f8a6938e600c634232eeef79dc04a1226f73a88b","revisionTime":"2016-08-03T16:52:18Z"}, + {"checksumSHA1":"TO8baX+t1Qs7EmOYth80MkbKzFo=","path":"gopkg.in/tomb.v1","revision":"dd632973f1e7218eb1089048e0798ec9ae7dceb8","revisionTime":"2014-10-24T13:56:13Z"}, + {"checksumSHA1":"WiyCOMvfzRdymImAJ3ME6aoYUdM=","path":"gopkg.in/tomb.v2","revision":"14b3d72120e8d10ea6e6b7f87f7175734b1faab8","revisionTime":"2014-06-26T14:46:23Z"}, + {"checksumSHA1":"12GqsW8PiRPnezDDy0v4brZrndM=","path":"gopkg.in/yaml.v2","revision":"a5b47d31c556af34a302ce5d659e6fea44d90de0","revisionTime":"2016-09-28T15:37:09Z"} ], "rootPath": "github.com/hashicorp/nomad" -} +} \ No newline at end of file From 54e6b7ff74c3dab115b5701fdee45570b43dfd4d Mon Sep 17 00:00:00 2001 From: Kyle Havlovitz Date: Mon, 18 Dec 2017 13:16:33 -0800 Subject: [PATCH 2/6] Add autopilot docs --- website/source/api/operator.html.md | 229 ++++++++++++++++++ .../agent/configuration/autopilot.html.md | 64 +++++ .../docs/agent/configuration/server.html.md | 3 + .../source/docs/commands/operator.html.md.erb | 4 + .../operator/autopilot-get-config.html.md.erb | 63 +++++ .../operator/autopilot-set-config.html.md.erb | 55 +++++ .../docs/upgrade/upgrade-specific.html.md | 36 +++ .../source/guides/cluster/autopilot.html.md | 219 +++++++++++++++++ website/source/layouts/docs.erb | 9 + website/source/layouts/guides.erb | 3 + 10 files changed, 685 insertions(+) create mode 100644 website/source/docs/agent/configuration/autopilot.html.md create mode 100644 website/source/docs/commands/operator/autopilot-get-config.html.md.erb create mode 100644 website/source/docs/commands/operator/autopilot-set-config.html.md.erb create mode 100644 website/source/guides/cluster/autopilot.html.md diff --git a/website/source/api/operator.html.md b/website/source/api/operator.html.md index 5d71d3e1e82..75b7d819cd4 100644 --- a/website/source/api/operator.html.md +++ b/website/source/api/operator.html.md @@ -123,3 +123,232 @@ $ curl \ --request DELETE \ https://nomad.rocks/v1/operator/raft/peer?address=1.2.3.4 ``` + +## Read Autopilot Configuration + +This endpoint retrieves its latest Autopilot configuration. + +| Method | Path | Produces | +| ------ | ---------------------------- | -------------------------- | +| `GET` | `/operator/autopilot/configuration` | `application/json` | + +The table below shows this endpoint's support for +[blocking queries](/api/index.html#blocking-queries), +[consistency modes](/api/index.html#consistency-modes), and +[required ACLs](/api/index.html#acls). + +| Blocking Queries | Consistency Modes | ACL Required | +| ---------------- | ----------------- | --------------- | +| `NO` | `none` | `operator:read` | + +### Parameters + +- `dc` `(string: "")` - Specifies the datacenter to query. This will default to + the datacenter of the agent being queried. This is specified as part of the + URL as a query string. + +- `stale` `(bool: false)` - If the cluster does not currently have a leader an + error will be returned. You can use the `?stale` query parameter to read the + Raft configuration from any of the Nomad servers. + +### Sample Request + +```text +$ curl \ + https://nomad.rocks/operator/autopilot/configuration +``` + +### Sample Response + +```json +{ + "CleanupDeadServers": true, + "LastContactThreshold": "200ms", + "MaxTrailingLogs": 250, + "ServerStabilizationTime": "10s", + "RedundancyZoneTag": "", + "DisableUpgradeMigration": false, + "UpgradeVersionTag": "", + "CreateIndex": 4, + "ModifyIndex": 4 +} +``` + +For more information about the Autopilot configuration options, see the +[agent configuration section](/docs/agent/options.html#autopilot). + +## Update Autopilot Configuration + +This endpoint updates the Autopilot configuration of the cluster. + +| Method | Path | Produces | +| ------ | ---------------------------- | -------------------------- | +| `PUT` | `/operator/autopilot/configuration` | `application/json` | + +The table below shows this endpoint's support for +[blocking queries](/api/index.html#blocking-queries), +[consistency modes](/api/index.html#consistency-modes), and +[required ACLs](/api/index.html#acls). + +| Blocking Queries | Consistency Modes | ACL Required | +| ---------------- | ----------------- | ---------------- | +| `NO` | `none` | `opreator:write` | + +### Parameters + +- `dc` `(string: "")` - Specifies the datacenter to query. This will default to + the datacenter of the agent being queried. This is specified as part of the + URL as a query string. + +- `cas` `(int: 0)` - Specifies to use a Check-And-Set operation. The update will + only happen if the given index matches the `ModifyIndex` of the configuration + at the time of writing. + +- `CleanupDeadServers` `(bool: true)` - Specifies automatic removal of dead + server nodes periodically and whenever a new server is added to the cluster. + +- `LastContactThreshold` `(string: "200ms")` - Specifies the maximum amount of + time a server can go without contact from the leader before being considered + unhealthy. Must be a duration value such as `10s`. + +- `MaxTrailingLogs` `(int: 250)` specifies the maximum number of log entries + that a server can trail the leader by before being considered unhealthy. + +- `ServerStabilizationTime` `(string: "10s")` - Specifies the minimum amount of + time a server must be stable in the 'healthy' state before being added to the + cluster. Only takes effect if all servers are running Raft protocol version 3 + or higher. Must be a duration value such as `30s`. + +- `RedundancyZoneTag` `(string: "")` - Controls the node-meta key to use when + Autopilot is separating servers into zones for redundancy. Only one server in + each zone can be a voting member at one time. If left blank, this feature will + be disabled. + +- `DisableUpgradeMigration` `(bool: false)` - Disables Autopilot's upgrade + migration strategy in Nomad Enterprise of waiting until enough + newer-versioned servers have been added to the cluster before promoting any of + them to voters. + +- `UpgradeVersionTag` `(string: "")` - Controls the node-meta key to use for + version info when performing upgrade migrations. If left blank, the Nomad + version will be used. + +### Sample Payload + +```json +{ + "CleanupDeadServers": true, + "LastContactThreshold": "200ms", + "MaxTrailingLogs": 250, + "ServerStabilizationTime": "10s", + "RedundancyZoneTag": "", + "DisableUpgradeMigration": false, + "UpgradeVersionTag": "", + "CreateIndex": 4, + "ModifyIndex": 4 +} +``` + +## Read Health + +This endpoint queries the health of the autopilot status. + +| Method | Path | Produces | +| ------ | ---------------------------- | -------------------------- | +| `GET` | `/operator/autopilot/health` | `application/json` | + +The table below shows this endpoint's support for +[blocking queries](/api/index.html#blocking-queries), +[consistency modes](/api/index.html#consistency-modes), and +[required ACLs](/api/index.html#acls). + +| Blocking Queries | Consistency Modes | ACL Required | +| ---------------- | ----------------- | --------------- | +| `NO` | `none` | `opreator:read` | + +### Parameters + +- `dc` `(string: "")` - Specifies the datacenter to query. This will default to + the datacenter of the agent being queried. This is specified as part of the + URL as a query string. + +### Sample Request + +```text +$ curl \ + https://nomad.rocks/v1/operator/autopilot/health +``` + +### Sample response + +```json +{ + "Healthy": true, + "FailureTolerance": 0, + "Servers": [ + { + "ID": "e349749b-3303-3ddf-959c-b5885a0e1f6e", + "Name": "node1", + "Address": "127.0.0.1:8300", + "SerfStatus": "alive", + "Version": "0.8.0", + "Leader": true, + "LastContact": "0s", + "LastTerm": 2, + "LastIndex": 46, + "Healthy": true, + "Voter": true, + "StableSince": "2017-03-06T22:07:51Z" + }, + { + "ID": "e36ee410-cc3c-0a0c-c724-63817ab30303", + "Name": "node2", + "Address": "127.0.0.1:8205", + "SerfStatus": "alive", + "Version": "0.8.0", + "Leader": false, + "LastContact": "27.291304ms", + "LastTerm": 2, + "LastIndex": 46, + "Healthy": true, + "Voter": false, + "StableSince": "2017-03-06T22:18:26Z" + } + ] +} +``` + +- `Healthy` is whether all the servers are currently healthy. + +- `FailureTolerance` is the number of redundant healthy servers that could be + fail without causing an outage (this would be 2 in a healthy cluster of 5 + servers). + +- `Servers` holds detailed health information on each server: + + - `ID` is the Raft ID of the server. + + - `Name` is the node name of the server. + + - `Address` is the address of the server. + + - `SerfStatus` is the SerfHealth check status for the server. + + - `Version` is the Nomad version of the server. + + - `Leader` is whether this server is currently the leader. + + - `LastContact` is the time elapsed since this server's last contact with the leader. + + - `LastTerm` is the server's last known Raft leader term. + + - `LastIndex` is the index of the server's last committed Raft log entry. + + - `Healthy` is whether the server is healthy according to the current Autopilot configuration. + + - `Voter` is whether the server is a voting member of the Raft cluster. + + - `StableSince` is the time this server has been in its current `Healthy` state. + + The HTTP status code will indicate the health of the cluster. If `Healthy` is true, then a + status of 200 will be returned. If `Healthy` is false, then a status of 429 will be returned. diff --git a/website/source/docs/agent/configuration/autopilot.html.md b/website/source/docs/agent/configuration/autopilot.html.md new file mode 100644 index 00000000000..ed13f37aac0 --- /dev/null +++ b/website/source/docs/agent/configuration/autopilot.html.md @@ -0,0 +1,64 @@ +--- +layout: "docs" +page_title: "autopilot Stanza - Agent Configuration" +sidebar_current: "docs-agent-configuration-autopilot" +description: |- + The "autopilot" stanza configures the Nomad agent to configure Autopilot behavior. +--- + +# `autopilot` Stanza + + + + + + +
Placement + **acl** +
+ +The `autopilot` stanza configures the Nomad agent to configure Autopilot behavior. + +```hcl +autopilot { + cleanup_dead_servers = true + last_contact_threshold = "200ms" + max_trailing_logs = 250 + server_stabilization_time = "10s" + redundancy_zone_tag = "" + disable_upgrade_migration = true + upgrade_version_tag = "" +} +``` + +## `autopilot` Parameters + +- `cleanup_dead_servers` `(bool: true)` - Specifies automatic removal of dead + server nodes periodically and whenever a new server is added to the cluster. + +- `last_contact_threshold` `(string: "200ms")` - Specifies the maximum amount of + time a server can go without contact from the leader before being considered + unhealthy. Must be a duration value such as `10s`. + +- `max_trailing_logs` `(int: 250)` specifies the maximum number of log entries + that a server can trail the leader by before being considered unhealthy. + +- `server_stabilization_time` `(string: "10s")` - Specifies the minimum amount of + time a server must be stable in the 'healthy' state before being added to the + cluster. Only takes effect if all servers are running Raft protocol version 3 + or higher. Must be a duration value such as `30s`. + +- `redundancy_zone_tag` `(string: "")` - Controls the node-meta key to use when + Autopilot is separating servers into zones for redundancy. Only one server in + each zone can be a voting member at one time. If left blank, this feature will + be disabled. + +- `disable_upgrade_migration` `(bool: false)` - Disables Autopilot's upgrade + migration strategy in Nomad Enterprise of waiting until enough + newer-versioned servers have been added to the cluster before promoting any of + them to voters. + +- `upgrade_version_tag` `(string: "")` - Controls the node-meta key to use for + version info when performing upgrade migrations. If left blank, the Nomad + version will be used. + diff --git a/website/source/docs/agent/configuration/server.html.md b/website/source/docs/agent/configuration/server.html.md index 53f30b6a350..92854ae1888 100644 --- a/website/source/docs/agent/configuration/server.html.md +++ b/website/source/docs/agent/configuration/server.html.md @@ -102,6 +102,9 @@ server { second is a tradeoff as it lowers failure detection time of nodes at the tradeoff of false positives and increased load on the leader. +- `non_voting_server` `(bool: false)` - is whether this server will act as + a non-voting member of the cluster to help provide read scalability. (Enterprise-only) + - `num_schedulers` `(int: [num-cores])` - Specifies the number of parallel scheduler threads to run. This can be as many as one per core, or `0` to disallow this server from making any scheduling decisions. This defaults to diff --git a/website/source/docs/commands/operator.html.md.erb b/website/source/docs/commands/operator.html.md.erb index a30e80b6791..d410d2ff0d0 100644 --- a/website/source/docs/commands/operator.html.md.erb +++ b/website/source/docs/commands/operator.html.md.erb @@ -28,8 +28,12 @@ Usage: `nomad operator [options]` Run `nomad operator ` with no arguments for help on that subcommand. The following subcommands are available: +* [`autopilot get-config`][get-config] - Display the current Autopilot configuration +* [`autopilot set-config`][set-config] - Modify the current Autopilot configuration * [`raft list-peers`][list] - Display the current Raft peer configuration * [`raft remove-peer`][remove] - Remove a Nomad server from the Raft configuration +[get-config]: /docs/commands/operator/autopilot-get-config.html "Autopilot Get Config command" +[set-config]: /docs/commands/operator/autopilot-set-config.html "Autopilot Set Config command" [list]: /docs/commands/operator/raft-list-peers.html "Raft List Peers command" [remove]: /docs/commands/operator/raft-remove-peer.html "Raft Remove Peer command" diff --git a/website/source/docs/commands/operator/autopilot-get-config.html.md.erb b/website/source/docs/commands/operator/autopilot-get-config.html.md.erb new file mode 100644 index 00000000000..b3eefad290c --- /dev/null +++ b/website/source/docs/commands/operator/autopilot-get-config.html.md.erb @@ -0,0 +1,63 @@ +--- +layout: "docs" +page_title: "Commands: operator autopilot get-config" +sidebar_current: "docs-commands-operator-autopilot-get-config" +description: > + Display the current Autopilot configuration. +--- + +# Command: `operator autopilot get-config` + +The Autopilot operator command is used to view the current Autopilot configuration. See the +[Autopilot Guide](/guides/cluster/autopilot.html) for more information about Autopilot. + +## Usage + +``` +nomad operator autopilot get-config [options] +``` + +## General Options + +<%= partial "docs/commands/_general_options" %> + +The output looks like this: + +``` +CleanupDeadServers = true +LastContactThreshold = 200ms +MaxTrailingLogs = 250 +ServerStabilizationTime = 10s +RedundancyZoneTag = "" +DisableUpgradeMigration = false +UpgradeMigrationTag = "" +``` + +- `CleanupDeadServers` - Specifies automatic removal of dead + server nodes periodically and whenever a new server is added to the cluster. + +- `LastContactThreshold` - Specifies the maximum amount of + time a server can go without contact from the leader before being considered + unhealthy. Must be a duration value such as `10s`. + +- `MaxTrailingLogs` - specifies the maximum number of log entries + that a server can trail the leader by before being considered unhealthy. + +- `ServerStabilizationTime` - Specifies the minimum amount of + time a server must be stable in the 'healthy' state before being added to the + cluster. Only takes effect if all servers are running Raft protocol version 3 + or higher. Must be a duration value such as `30s`. + +- `RedundancyZoneTag` - Controls the node-meta key to use when + Autopilot is separating servers into zones for redundancy. Only one server in + each zone can be a voting member at one time. If left blank, this feature will + be disabled. + +- `DisableUpgradeMigration` - Disables Autopilot's upgrade + migration strategy in Nomad Enterprise of waiting until enough + newer-versioned servers have been added to the cluster before promoting any of + them to voters. + +- `UpgradeVersionTag` - Controls the node-meta key to use for + version info when performing upgrade migrations. If left blank, the Nomad + version will be used. \ No newline at end of file diff --git a/website/source/docs/commands/operator/autopilot-set-config.html.md.erb b/website/source/docs/commands/operator/autopilot-set-config.html.md.erb new file mode 100644 index 00000000000..6a683899eca --- /dev/null +++ b/website/source/docs/commands/operator/autopilot-set-config.html.md.erb @@ -0,0 +1,55 @@ +--- +layout: "docs" +page_title: "Commands: operator autopilot set-config" +sidebar_current: "docs-commands-operator-autopilot-set-config" +description: > + Modify the current Autopilot configuration. +--- + +# Command: `operator autopilot set-config` + +The Autopilot operator command is used to set the current Autopilot configuration. See the +[Autopilot Guide](/guides/cluster/autopilot.html) for more information about Autopilot. + + +## Usage + +``` +nomad operator autopilot set-config [options] +``` + +## General Options + +<%= partial "docs/commands/_general_options" %> + +## Set Config Options + +* `-cleanup-dead-servers` - Specifies whether to enable automatic removal of dead servers +upon the successful joining of new servers to the cluster. Must be one of `[true|false]`. + +* `-last-contact-threshold` - Controls the maximum amount of time a server can go without contact +from the leader before being considered unhealthy. Must be a duration value such as `200ms`. + +* `-max-trailing-logs` - Controls the maximum number of log entries that a server can trail +the leader by before being considered unhealthy. + +* `-server-stabilization-time` - Controls the minimum amount of time a server must be stable in +the 'healthy' state before being added to the cluster. Only takes effect if all servers are +running Raft protocol version 3 or higher. Must be a duration value such as `10s`. + +* `-disable-upgrade-migration` - (Enterprise-only) Controls whether Nomad will avoid promoting +new servers until it can perform a migration. Must be one of `[true|false]`. + +* `-redundancy-zone-tag`- (Enterprise-only) Controls the [`-node-meta`](/docs/agent/options.html#_node_meta) +key name used for separating servers into different redundancy zones. + +* `-upgrade-version-tag` - (Enterprise-only) Controls the [`-node-meta`](/docs/agent/options.html#_node_meta) +tag to use for version info when performing upgrade migrations. If left blank, the Nomad version will be used. + +The output looks like this: + +``` +Configuration updated! +``` + +The return code will indicate success or failure. diff --git a/website/source/docs/upgrade/upgrade-specific.html.md b/website/source/docs/upgrade/upgrade-specific.html.md index 64b0f3c567e..57386c63a24 100644 --- a/website/source/docs/upgrade/upgrade-specific.html.md +++ b/website/source/docs/upgrade/upgrade-specific.html.md @@ -15,6 +15,42 @@ details provided for their upgrades as a result of new features or changed behavior. This page is used to document those details separately from the standard upgrade flow. +## Nomad 0.8.0 + +#### Raft Protocol Version Compatibility + +When upgrading to Nomad 0.8.0 from a version lower than 0.7.0, users will need to +set the [`-raft-protocol`](/docs/agent/options.html#_raft_protocol) option to 1 in +order to maintain backwards compatibility with the old servers during the upgrade. +After the servers have been migrated to version 0.8.0, `-raft-protocol` can be moved +up to 2 and the servers restarted to match the default. + +The Raft protocol must be stepped up in this way; only adjacent version numbers are +compatible (for example, version 1 cannot talk to version 3). Here is a table of the +Raft Protocol versions supported by each Consul version: + + + + + + + + + + + + + + + + + + +
VersionSupported Raft Protocols
0.6 and earlier0
0.71
0.81, 2, 3
+ +In order to enable all [Autopilot](/guides/cluster/autopilot.html) features, all servers +in a Nomad cluster must be running with Raft protocol version 3 or later. + ## Nomad 0.6.0 ### Default `advertise` address changes diff --git a/website/source/guides/cluster/autopilot.html.md b/website/source/guides/cluster/autopilot.html.md new file mode 100644 index 00000000000..d327e3431e7 --- /dev/null +++ b/website/source/guides/cluster/autopilot.html.md @@ -0,0 +1,219 @@ +--- +layout: "guides" +page_title: "Autopilot" +sidebar_current: "guides-cluster-autopilot" +description: |- + This guide covers how to configure and use Autopilot features. +--- + +# Autopilot + +Autopilot is a set of new features added in Nomad 0.8 to allow for automatic +operator-friendly management of Nomad servers. It includes cleanup of dead +servers, monitoring the state of the Raft cluster, and stable server introduction. + +To enable Autopilot features (with the exception of dead server cleanup), +the [`raft_protocol`](/docs/agent/configuration/server.html#raft_protocol) setting in +the Agent configuration must be set to 3 or higher on all servers. In Nomad +0.8 this setting defaults to 2; in Nomad 0.9 it will default to 3. For more +information, see the [Version Upgrade section] +(/docs/upgrade/upgrade-specific.html#raft-protocol-version-compatibility) +on Raft Protocol versions. + +## Configuration + +The configuration of Autopilot is loaded by the leader from the agent's +[Autopilot settings](/docs/agent/options.html#autopilot) when initially +bootstrapping the cluster: + +``` +{ + "cleanup_dead_servers": true, + "last_contact_threshold": "200ms", + "max_trailing_logs": 250, + "server_stabilization_time": "10s", + "redundancy_zone_tag": "az", + "disable_upgrade_migration": false, + "upgrade_version_tag": "" +} +``` + +After bootstrapping, the configuration can be viewed or modified either via the +[`operator autopilot`](/docs/commands/operator/autopilot.html) subcommand or the +[`/v1/operator/autopilot/configuration`](/api/operator.html#autopilot-configuration) +HTTP endpoint: + +``` +$ nomad operator autopilot get-config +CleanupDeadServers = true +LastContactThreshold = 200ms +MaxTrailingLogs = 250 +ServerStabilizationTime = 10s +RedundancyZoneTag = "" +DisableUpgradeMigration = false +UpgradeVersionTag = "" + +$ Nomad operator autopilot set-config -cleanup-dead-servers=false +Configuration updated! + +$ Nomad operator autopilot get-config +CleanupDeadServers = false +LastContactThreshold = 200ms +MaxTrailingLogs = 250 +ServerStabilizationTime = 10s +RedundancyZoneTag = "" +DisableUpgradeMigration = false +UpgradeVersionTag = "" +``` + +## Dead Server Cleanup + +Dead servers will periodically be cleaned up and removed from the Raft peer +set, to prevent them from interfering with the quorum size and leader elections. +This cleanup will also happen whenever a new server is successfully added to the +cluster. + +Prior to Autopilot, it would take 72 hours for dead servers to be automatically reaped, +or operators had to script a `nomad force-leave`. If another server failure occurred, +it could jeopardize the quorum, even if the failed Nomad server had been automatically +replaced. Autopilot helps prevent these kinds of outages by quickly removing failed +servers as soon as a replacement Nomad server comes online. When servers are removed +by the cleanup process they will enter the "left" state. + +This option can be disabled by running `nomad operator autopilot set-config` +with the `-cleanup-dead-servers=false` option. + +## Server Health Checking + +An internal health check runs on the leader to track the stability of servers. +
A server is considered healthy if all of the following conditions are true: + +- It has a SerfHealth status of 'Alive' +- The time since its last contact with the current leader is below +`LastContactThreshold` +- Its latest Raft term matches the leader's term +- The number of Raft log entries it trails the leader by does not exceed +`MaxTrailingLogs` + +The status of these health checks can be viewed through the [`/v1/operator/autopilot/health`] +(/api/operator.html#read-health) HTTP endpoint, with a top level +`Healthy` field indicating the overall status of the cluster: + +``` +$ curl localhost:8500/v1/operator/autopilot/health +{ + "Healthy": true, + "FailureTolerance": 0, + "Servers": [ + { + "ID": "e349749b-3303-3ddf-959c-b5885a0e1f6e", + "Name": "node1", + "Address": "127.0.0.1:4647", + "SerfStatus": "alive", + "Version": "0.8.0", + "Leader": true, + "LastContact": "0s", + "LastTerm": 2, + "LastIndex": 10, + "Healthy": true, + "Voter": true, + "StableSince": "2017-03-28T18:28:52Z" + }, + { + "ID": "e35bde83-4e9c-434f-a6ef-453f44ee21ea", + "Name": "node2", + "Address": "127.0.0.1:4747", + "SerfStatus": "alive", + "Version": "0.8.0", + "Leader": false, + "LastContact": "35.371007ms", + "LastTerm": 2, + "LastIndex": 10, + "Healthy": true, + "Voter": false, + "StableSince": "2017-03-28T18:29:10Z" + } + ] +} +``` + +## Stable Server Introduction + +When a new server is added to the cluster, there is a waiting period where it +must be healthy and stable for a certain amount of time before being promoted +to a full, voting member. This can be configured via the `ServerStabilizationTime` +setting. + +--- + +~> The following Autopilot features are available only in + [Nomad Enterprise](https://www.hashicorp.com/products/nomad/) version 0.8.0 and later. + +## Server Read Scaling + +With the [`non_voting_server`](/docs/agent/configuration/server.html#non_voting_server) option, a +server can be explicitly marked as a non-voter and will never be promoted to a voting +member. This can be useful when more read scaling is needed; being a non-voter means +that the server will still have data replicated to it, but it will not be part of the +quorum that the leader must wait for before committing log entries. + +## Redundancy Zones + +Prior to Autopilot, it was difficult to deploy servers in a way that took advantage of +isolated failure domains such as AWS Availability Zones; users would be forced to either +have an overly-large quorum (2-3 nodes per AZ) or give up redundancy within an AZ by +deploying just one server in each. + +If the `RedundancyZoneTag` setting is set, Nomad will use its value to look for a +zone in each server's specified [`-meta`](/docs/agent/configuration/client.html#meta) +tag. For example, if `RedundancyZoneTag` is set to `zone`, and `-meta zone=east1a` +is used when starting a server, that server's redundancy zone will be `east1a`. + +Here's an example showing how to configure this: + +``` +$ nomad operator autopilot set-config -redundancy-zone-tag=zone +Configuration updated! +``` + +Nomad will then use these values to partition the servers by redundancy zone, and will +aim to keep one voting server per zone. Extra servers in each zone will stay as non-voters +on standby to be promoted if the active voter leaves or dies. + +## Upgrade Migrations + +Autopilot in Nomad Enterprise supports upgrade migrations by default. To disable this +functionality, set `DisableUpgradeMigration` to true. + +When a new server is added and Autopilot detects that its Nomad version is newer than +that of the existing servers, Autopilot will avoid promoting the new server until enough +newer-versioned servers have been added to the cluster. When the count of new servers +equals or exceeds that of the old servers, Autopilot will begin promoting the new servers +to voters and demoting the old servers. After this is finished, the old servers can be +safely removed from the cluster. + +To check the Nomad version of the servers, either the [autopilot health] +(/api/operator.html#read-health) endpoint or the `Nomad members` +command can be used: + +``` +$ Nomad members +Node Address Status Type Build Protocol DC +node1 127.0.0.1:8301 alive server 0.7.5 2 dc1 +node2 127.0.0.1:8703 alive server 0.7.5 2 dc1 +node3 127.0.0.1:8803 alive server 0.7.5 2 dc1 +node4 127.0.0.1:8203 alive server 0.8.0 2 dc1 +``` + +### Migrations Without a Nomad Version Change + +The `UpgradeVersionTag` can be used to override the version information used during +a migration, so that the migration logic can be used for updating the cluster when +changing configuration. + +If the `UpgradeVersionTag` setting is set, Nomad will use its value to look for a +version in each server's specified [`-meta`](/docs/agent/configuration/client.html#meta) +tag. For example, if `UpgradeVersionTag` is set to `build`, and `-meta build:0.0.2` +is used when starting a server, that server's version will be `0.0.2` when considered in +a migration. The upgrade logic will follow semantic versioning and the version string +must be in the form of either `X`, `X.Y`, or `X.Y.Z`. diff --git a/website/source/layouts/docs.erb b/website/source/layouts/docs.erb index 26a552e03b8..e841e5495cc 100644 --- a/website/source/layouts/docs.erb +++ b/website/source/layouts/docs.erb @@ -313,6 +313,12 @@ > operator