Allow duplicate service names as long as they're in a different group (#13)
This commit is contained in:
		| @ -2,6 +2,9 @@ package core | ||||
|  | ||||
| // ServiceStatus contains the evaluation Results of a Service | ||||
| type ServiceStatus struct { | ||||
| 	// Name of the service | ||||
| 	Name string `json:"name,omitempty"` | ||||
|  | ||||
| 	// Group the service is a part of. Used for grouping multiple services together on the front end. | ||||
| 	Group string `json:"group,omitempty"` | ||||
|  | ||||
| @ -12,6 +15,7 @@ type ServiceStatus struct { | ||||
| // NewServiceStatus creates a new ServiceStatus | ||||
| func NewServiceStatus(service *Service) *ServiceStatus { | ||||
| 	return &ServiceStatus{ | ||||
| 		Name:    service.Name, | ||||
| 		Group:   service.Group, | ||||
| 		Results: make([]*Result, 0), | ||||
| 	} | ||||
|  | ||||
| @ -3,15 +3,18 @@ package core | ||||
| import "testing" | ||||
|  | ||||
| func TestNewServiceStatus(t *testing.T) { | ||||
| 	service := &Service{Group: "test"} | ||||
| 	service := &Service{Name: "name", Group: "group"} | ||||
| 	serviceStatus := NewServiceStatus(service) | ||||
| 	if serviceStatus.Name != service.Name { | ||||
| 		t.Errorf("expected %s, got %s", service.Name, serviceStatus.Name) | ||||
| 	} | ||||
| 	if serviceStatus.Group != service.Group { | ||||
| 		t.Errorf("expected %s, got %s", service.Group, serviceStatus.Group) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestServiceStatus_AddResult(t *testing.T) { | ||||
| 	service := &Service{Group: "test"} | ||||
| 	service := &Service{Name: "name", Group: "group"} | ||||
| 	serviceStatus := NewServiceStatus(service) | ||||
| 	for i := 0; i < 50; i++ { | ||||
| 		serviceStatus.AddResult(&Result{}) | ||||
|  | ||||
| @ -219,11 +219,11 @@ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		function createStatusBadge(serviceName, index, success) { | ||||
| 		function createStatusBadge(serviceStatusIndex, index, success) { | ||||
| 			if (success) { | ||||
| 				return "<span class='status badge badge-success' style='width: 5%' onmouseenter='showTooltip(\""+serviceName+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>✓</span>"; | ||||
| 				return "<span class='status badge badge-success' style='width: 5%' onmouseenter='showTooltip(\""+serviceStatusIndex+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>✓</span>"; | ||||
| 			} | ||||
| 			return "<span class='status badge badge-danger' style='width: 5%' onmouseenter='showTooltip(\""+serviceName+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>X</span>"; | ||||
| 			return "<span class='status badge badge-danger' style='width: 5%' onmouseenter='showTooltip(\""+serviceStatusIndex+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>X</span>"; | ||||
| 		} | ||||
|  | ||||
| 		function refreshStatuses() { | ||||
| @ -238,17 +238,17 @@ | ||||
|  | ||||
| 		function buildTable() { | ||||
| 			let outputByGroup = {}; | ||||
| 			for (let serviceName in serviceStatuses) { | ||||
| 			for (let serviceStatusIndex in serviceStatuses) { | ||||
| 				let serviceStatusOverTime = ""; | ||||
| 				let serviceStatus = serviceStatuses[serviceName]; | ||||
| 				let serviceStatus = serviceStatuses[serviceStatusIndex]; | ||||
| 				let hostname = serviceStatus.results[serviceStatus.results.length-1].hostname; | ||||
| 				let minResponseTime = null; | ||||
| 				let maxResponseTime = null; | ||||
| 				let newestTimestamp = null; | ||||
| 				let oldestTimestamp = null; | ||||
| 				for (let key in serviceStatus.results) { | ||||
| 					let serviceResult = serviceStatus.results[key]; | ||||
| 					serviceStatusOverTime = createStatusBadge(serviceName, key, serviceResult.success) + serviceStatusOverTime; | ||||
| 				for (let resultIndex in serviceStatus.results) { | ||||
| 					let serviceResult = serviceStatus.results[resultIndex]; | ||||
| 					serviceStatusOverTime = createStatusBadge(serviceStatusIndex, resultIndex, serviceResult.success) + serviceStatusOverTime; | ||||
| 					const responseTime = parseInt(serviceResult.duration/1000000); | ||||
| 					if (minResponseTime == null || minResponseTime > responseTime) { | ||||
| 						minResponseTime = responseTime; | ||||
| @ -268,7 +268,7 @@ | ||||
| 					+ "<div class='container py-3 border-left border-right border-top border-black rounded-0'>" | ||||
| 					+ "  <div class='row mb-2'>" | ||||
| 					+ "    <div class='col-md-10'>" | ||||
| 					+ "      <span class='font-weight-bold'>" + serviceName + "</span> <span class='text-secondary font-weight-lighter'>- " + hostname + "</span>" | ||||
| 					+ "      <span class='font-weight-bold'>" + serviceStatus.name + "</span> <span class='text-secondary font-weight-lighter'>- " + hostname + "</span>" | ||||
| 					+ "    </div>" | ||||
| 					+ "    <div class='col-md-2 text-right'>" | ||||
| 					+ "      <span class='font-weight-lighter status-min-max-ms'>" + (minResponseTime === maxResponseTime ? minResponseTime : (minResponseTime + "-" + maxResponseTime)) + "ms</span>" | ||||
|  | ||||
| @ -81,11 +81,12 @@ func monitor(service *core.Service) { | ||||
|  | ||||
| // UpdateServiceStatuses updates the slice of service statuses | ||||
| func UpdateServiceStatuses(service *core.Service, result *core.Result) { | ||||
| 	key := fmt.Sprintf("%s_%s", service.Group, service.Name) | ||||
| 	serviceStatusesMutex.Lock() | ||||
| 	serviceStatus, exists := serviceStatuses[service.Name] | ||||
| 	serviceStatus, exists := serviceStatuses[key] | ||||
| 	if !exists { | ||||
| 		serviceStatus = core.NewServiceStatus(service) | ||||
| 		serviceStatuses[service.Name] = serviceStatus | ||||
| 		serviceStatuses[key] = serviceStatus | ||||
| 	} | ||||
| 	serviceStatus.AddResult(result) | ||||
| 	serviceStatusesMutex.Unlock() | ||||
|  | ||||
		Reference in New Issue
	
	Block a user