func writeService(c *cli.Context, service *msg.Service) { if c.GlobalBool("json") { if err := json.NewEncoder(os.Stdout).Encode(service); err != nil { writeError(err) } } else { fmt.Printf("UUID: %s\nName: %s\nHost: %s\nPort: %d\nEnvironment: %s\nRegion: %s\nVersion: %s\n\n", service.UUID, service.Name, service.Host, service.Port, service.Environment, service.Region, service.Version) fmt.Printf("TTL %d\nRemaining TTL: %d\n", service.TTL, service.RemainingTTL()) } }
func TestGetService(t *testing.T) { s := newTestServer("", "", "") defer s.Stop() m := msg.Service{ UUID: "123", Name: "TestService", Version: "1.0.0", Region: "Test", Host: "localhost", Environment: "Production", Port: 9000, TTL: 4, Expires: getExpirationTime(4), } s.registry.Add(m) req, _ := http.NewRequest("GET", "/skydns/services/"+m.UUID, nil) resp := httptest.NewRecorder() s.router.ServeHTTP(resp, req) if resp.Code != http.StatusOK { t.Fatal("Failed to retrieve service") } m.TTL = 3 // TTL will be lower as time has passed expected, err := json.Marshal(m) if err != nil { t.Fatal(err) } // Newline is expected expected = append(expected, []byte("\n")...) if !bytes.Equal(resp.Body.Bytes(), expected) { t.Fatalf("Returned service is invalid. Expected %q but received %q", string(expected), resp.Body.String()) } }
// Handle API add service requests func (s *Server) addServiceHTTPHandler(w http.ResponseWriter, req *http.Request) { stats.AddServiceCount.Inc(1) vars := mux.Vars(req) var uuid string var ok bool if uuid, ok = vars["uuid"]; !ok { http.Error(w, "UUID required", http.StatusBadRequest) return } var serv msg.Service if err := json.NewDecoder(req.Body).Decode(&serv); err != nil { log.Println("Error: ", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } if serv.Host == "" || serv.Port == 0 { http.Error(w, "Host and Port required", http.StatusBadRequest) return } serv.UUID = uuid if _, err := s.raftServer.Do(NewAddServiceCommand(serv)); err != nil { switch err { case registry.ErrExists: http.Error(w, err.Error(), http.StatusConflict) case raft.NotLeaderError: s.redirectToLeader(w, req) default: log.Println("Error: ", err) http.Error(w, err.Error(), http.StatusInternalServerError) } return } w.WriteHeader(http.StatusCreated) }
func TestUpdateTTL(t *testing.T) { s := newTestServer("", "", "") defer s.Stop() m := msg.Service{ UUID: "123", Name: "TestService", Version: "1.0.0", Region: "Test", Host: "localhost", Environment: "Production", Port: 9000, TTL: 4, } s.registry.Add(m) m.TTL = 25 b, err := json.Marshal(m) if err != nil { t.Fatal(err) } req, _ := http.NewRequest("PATCH", "/skydns/services/"+m.UUID, bytes.NewBuffer(b)) resp := httptest.NewRecorder() s.router.ServeHTTP(resp, req) if resp.Code != http.StatusOK { t.Fatal("Failed to update TTL") } if serv, err := s.registry.GetUUID(m.UUID); err != nil || serv.TTL != 24 { t.Fatal("Failed to update TTL", err, serv.TTL) } }
// Creates a new AddServiceCommand func NewAddServiceCommand(s msg.Service) *AddServiceCommand { s.Expires = getExpirationTime(s.TTL) return &AddServiceCommand{s} }