github.com/djenriquez/nomad-1@v0.8.1/command/agent/consul/catalog_testing.go (about) 1 package consul 2 3 import ( 4 "fmt" 5 "log" 6 "sync" 7 8 "github.com/hashicorp/consul/api" 9 ) 10 11 // MockCatalog can be used for testing where the CatalogAPI is needed. 12 type MockCatalog struct { 13 logger *log.Logger 14 } 15 16 func NewMockCatalog(l *log.Logger) *MockCatalog { 17 return &MockCatalog{logger: l} 18 } 19 20 func (m *MockCatalog) Datacenters() ([]string, error) { 21 dcs := []string{"dc1"} 22 m.logger.Printf("[DEBUG] mock_consul: Datacenters() -> (%q, nil)", dcs) 23 return dcs, nil 24 } 25 26 func (m *MockCatalog) Service(service, tag string, q *api.QueryOptions) ([]*api.CatalogService, *api.QueryMeta, error) { 27 m.logger.Printf("[DEBUG] mock_consul: Service(%q, %q, %#v) -> (nil, nil, nil)", service, tag, q) 28 return nil, nil, nil 29 } 30 31 // MockAgent is a fake in-memory Consul backend for ServiceClient. 32 type MockAgent struct { 33 // maps of what services and checks have been registered 34 services map[string]*api.AgentServiceRegistration 35 checks map[string]*api.AgentCheckRegistration 36 mu sync.Mutex 37 38 // when UpdateTTL is called the check ID will have its counter inc'd 39 checkTTLs map[string]int 40 41 // What check status to return from Checks() 42 checkStatus string 43 } 44 45 // NewMockAgent that returns all checks as passing. 46 func NewMockAgent() *MockAgent { 47 return &MockAgent{ 48 services: make(map[string]*api.AgentServiceRegistration), 49 checks: make(map[string]*api.AgentCheckRegistration), 50 checkTTLs: make(map[string]int), 51 checkStatus: api.HealthPassing, 52 } 53 } 54 55 // SetStatus that Checks() should return. Returns old status value. 56 func (c *MockAgent) SetStatus(s string) string { 57 c.mu.Lock() 58 old := c.checkStatus 59 c.checkStatus = s 60 c.mu.Unlock() 61 return old 62 } 63 64 func (c *MockAgent) Self() (map[string]map[string]interface{}, error) { 65 s := map[string]map[string]interface{}{ 66 "Member": { 67 "Addr": "127.0.0.1", 68 "DelegateCur": 4, 69 "DelegateMax": 5, 70 "DelegateMin": 2, 71 "Name": "rusty", 72 "Port": 8301, 73 "ProtocolCur": 2, 74 "ProtocolMax": 5, 75 "ProtocolMin": 1, 76 "Status": 1, 77 "Tags": map[string]interface{}{ 78 "build": "0.8.1:'e9ca44d", 79 }, 80 }, 81 } 82 return s, nil 83 } 84 85 func (c *MockAgent) Services() (map[string]*api.AgentService, error) { 86 c.mu.Lock() 87 defer c.mu.Unlock() 88 89 r := make(map[string]*api.AgentService, len(c.services)) 90 for k, v := range c.services { 91 r[k] = &api.AgentService{ 92 ID: v.ID, 93 Service: v.Name, 94 Tags: make([]string, len(v.Tags)), 95 Port: v.Port, 96 Address: v.Address, 97 EnableTagOverride: v.EnableTagOverride, 98 } 99 copy(r[k].Tags, v.Tags) 100 } 101 return r, nil 102 } 103 104 // Checks implements the Agent API Checks method. 105 func (c *MockAgent) Checks() (map[string]*api.AgentCheck, error) { 106 c.mu.Lock() 107 defer c.mu.Unlock() 108 109 r := make(map[string]*api.AgentCheck, len(c.checks)) 110 for k, v := range c.checks { 111 r[k] = &api.AgentCheck{ 112 CheckID: v.ID, 113 Name: v.Name, 114 Status: c.checkStatus, 115 Notes: v.Notes, 116 ServiceID: v.ServiceID, 117 ServiceName: c.services[v.ServiceID].Name, 118 } 119 } 120 return r, nil 121 } 122 123 // CheckRegs returns the raw AgentCheckRegistrations registered with this mock 124 // agent. 125 func (c *MockAgent) CheckRegs() []*api.AgentCheckRegistration { 126 c.mu.Lock() 127 defer c.mu.Unlock() 128 129 regs := make([]*api.AgentCheckRegistration, 0, len(c.checks)) 130 for _, check := range c.checks { 131 regs = append(regs, check) 132 } 133 return regs 134 } 135 136 func (c *MockAgent) CheckRegister(check *api.AgentCheckRegistration) error { 137 c.mu.Lock() 138 defer c.mu.Unlock() 139 c.checks[check.ID] = check 140 141 // Be nice and make checks reachable-by-service 142 scheck := check.AgentServiceCheck 143 c.services[check.ServiceID].Checks = append(c.services[check.ServiceID].Checks, &scheck) 144 return nil 145 } 146 147 func (c *MockAgent) CheckDeregister(checkID string) error { 148 c.mu.Lock() 149 defer c.mu.Unlock() 150 delete(c.checks, checkID) 151 delete(c.checkTTLs, checkID) 152 return nil 153 } 154 155 func (c *MockAgent) ServiceRegister(service *api.AgentServiceRegistration) error { 156 c.mu.Lock() 157 defer c.mu.Unlock() 158 c.services[service.ID] = service 159 return nil 160 } 161 162 func (c *MockAgent) ServiceDeregister(serviceID string) error { 163 c.mu.Lock() 164 defer c.mu.Unlock() 165 delete(c.services, serviceID) 166 return nil 167 } 168 169 func (c *MockAgent) UpdateTTL(id string, output string, status string) error { 170 c.mu.Lock() 171 defer c.mu.Unlock() 172 check, ok := c.checks[id] 173 if !ok { 174 return fmt.Errorf("unknown check id: %q", id) 175 } 176 // Flip initial status to passing 177 check.Status = "passing" 178 c.checkTTLs[id]++ 179 return nil 180 }