mirror of
https://github.com/openfaas/faas.git
synced 2025-06-10 17:26:47 +00:00
Cover replica scaling with tests.
This commit is contained in:
parent
52266a6741
commit
c211ba0d07
@ -12,38 +12,43 @@ import (
|
||||
"github.com/docker/docker/client"
|
||||
)
|
||||
|
||||
// CalculateReplicas decides what replica count to set depending on a Prometheus alert
|
||||
func CalculateReplicas(status string, currentReplicas uint64) uint64 {
|
||||
newReplicas := currentReplicas
|
||||
|
||||
if status == "firing" {
|
||||
if currentReplicas == 1 {
|
||||
newReplicas = 5
|
||||
} else {
|
||||
if currentReplicas+5 > 20 {
|
||||
newReplicas = 20
|
||||
} else {
|
||||
newReplicas = currentReplicas + 5
|
||||
}
|
||||
}
|
||||
} else { // Resolved event.
|
||||
newReplicas = 1
|
||||
}
|
||||
return newReplicas
|
||||
}
|
||||
|
||||
func scaleService(req requests.PrometheusAlert, c *client.Client) error {
|
||||
var err error
|
||||
//Todo: convert to loop / handler.
|
||||
serviceName := req.Alerts[0].Labels.FunctionName
|
||||
service, _, inspectErr := c.ServiceInspectWithRaw(context.Background(), serviceName)
|
||||
if inspectErr == nil {
|
||||
var replicas uint64
|
||||
|
||||
if req.Status == "firing" {
|
||||
if *service.Spec.Mode.Replicated.Replicas < 20 {
|
||||
replicas = *service.Spec.Mode.Replicated.Replicas + uint64(5)
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
} else { // Resolved event.
|
||||
// Previously decremented by 5, but event only fires once, so set to 1/1.
|
||||
if *service.Spec.Mode.Replicated.Replicas > 1 {
|
||||
// replicas = *service.Spec.Mode.Replicated.Replicas - uint64(5)
|
||||
// if replicas < 1 {
|
||||
// replicas = 1
|
||||
// }
|
||||
// return nil
|
||||
currentReplicas := *service.Spec.Mode.Replicated.Replicas
|
||||
status := req.Status
|
||||
newReplicas := CalculateReplicas(status, currentReplicas)
|
||||
|
||||
replicas = 1
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
if newReplicas == currentReplicas {
|
||||
return nil
|
||||
}
|
||||
|
||||
log.Printf("Scaling %s to %d replicas.\n", serviceName, replicas)
|
||||
|
||||
service.Spec.Mode.Replicated.Replicas = &replicas
|
||||
log.Printf("Scaling %s to %d replicas.\n", serviceName, newReplicas)
|
||||
service.Spec.Mode.Replicated.Replicas = &newReplicas
|
||||
updateOpts := types.ServiceUpdateOptions{}
|
||||
updateOpts.RegistryAuthFrom = types.RegistryAuthFromSpec
|
||||
|
||||
|
47
gateway/tests/alerthandler_test.go
Normal file
47
gateway/tests/alerthandler_test.go
Normal file
@ -0,0 +1,47 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/alexellis/faas/gateway/handlers"
|
||||
)
|
||||
|
||||
func TestScale1to5(t *testing.T) {
|
||||
newReplicas := handlers.CalculateReplicas("firing", 1)
|
||||
if newReplicas != 5 {
|
||||
t.Log("Expected increment in blocks of 5 from 1 to 5")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestScale5to10(t *testing.T) {
|
||||
newReplicas := handlers.CalculateReplicas("firing", 5)
|
||||
if newReplicas != 10 {
|
||||
t.Log("Expected increment in blocks of 5 from 5 to 10")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestScaleCeilingOf20Replicas_Noaction(t *testing.T) {
|
||||
newReplicas := handlers.CalculateReplicas("firing", 20)
|
||||
if newReplicas != 20 {
|
||||
t.Log("Expected ceiling of 20 replicas")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestScaleCeilingOf20Replicas(t *testing.T) {
|
||||
newReplicas := handlers.CalculateReplicas("firing", 19)
|
||||
if newReplicas != 20 {
|
||||
t.Log("Expected ceiling of 20 replicas")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestBackingOff10to1(t *testing.T) {
|
||||
newReplicas := handlers.CalculateReplicas("resolved", 10)
|
||||
if newReplicas != 1 {
|
||||
t.Log("Expected backing off to 1 replica")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/alexellis/faas/gateway/handlers"
|
||||
"github.com/alexellis/faas/gateway/requests"
|
||||
)
|
||||
|
||||
func TestIsAlexa(t *testing.T) {
|
||||
requestBody, _ := ioutil.ReadFile("./alexhostname_request.json")
|
||||
var result requests.AlexaRequestBody
|
||||
|
||||
result = handlers.IsAlexa(requestBody)
|
||||
|
||||
if len(result.Session.Application.ApplicationId) == 0 {
|
||||
t.Fail()
|
||||
}
|
||||
if len(result.Session.SessionId) == 0 {
|
||||
t.Fail()
|
||||
}
|
||||
if len(result.Request.Intent.Name) == 0 {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user