open-nomad/api/scaling_test.go

123 lines
3.1 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package api
import (
"testing"
"github.com/hashicorp/nomad/api/internal/testutil"
"github.com/shoenig/test/must"
)
func TestScalingPolicies_ListPolicies(t *testing.T) {
testutil.Parallel(t)
c, s := makeClient(t, nil, nil)
defer s.Stop()
scaling := c.Scaling()
jobs := c.Jobs()
// Check that we don't have any scaling policies before registering a job that has one
policies, _, err := scaling.ListPolicies(nil)
must.NoError(t, err)
must.SliceEmpty(t, policies)
// Register a job with a scaling policy
job := testJob()
job.TaskGroups[0].Scaling = &ScalingPolicy{
Max: pointerOf(int64(100)),
}
_, _, err = jobs.Register(job, nil)
must.NoError(t, err)
// Check that we have a scaling policy now
policies, _, err = scaling.ListPolicies(nil)
must.NoError(t, err)
must.Len(t, 1, policies)
policy := policies[0]
// Check that the scaling policy references the right namespace
namespace := DefaultNamespace
if job.Namespace != nil && *job.Namespace != "" {
namespace = *job.Namespace
}
must.Eq(t, policy.Target["Namespace"], namespace)
// Check that the scaling policy references the right job
must.Eq(t, policy.Target["Job"], *job.ID)
// Check that the scaling policy references the right group
must.Eq(t, policy.Target["Group"], *job.TaskGroups[0].Name)
// Check that the scaling policy has the right type
must.Eq(t, ScalingPolicyTypeHorizontal, policy.Type)
}
func TestScalingPolicies_GetPolicy(t *testing.T) {
testutil.Parallel(t)
c, s := makeClient(t, nil, nil)
defer s.Stop()
scaling := c.Scaling()
jobs := c.Jobs()
// Empty ID should return 404
_, _, err := scaling.GetPolicy("", nil)
must.ErrorContains(t, err, "404")
// Non-existent ID should return 404
_, _, err = scaling.GetPolicy("i-do-not-exist", nil)
must.ErrorContains(t, err, "404")
// Register a job with a scaling policy
job := testJob()
policy := &ScalingPolicy{
Enabled: pointerOf(true),
Min: pointerOf(int64(1)),
Max: pointerOf(int64(1)),
Policy: map[string]interface{}{
"key": "value",
},
}
job.TaskGroups[0].Scaling = policy
_, _, err = jobs.Register(job, nil)
must.NoError(t, err)
// Find newly created scaling policy ID
var policyID string
policies, _, err := scaling.ListPolicies(nil)
must.NoError(t, err)
for _, p := range policies {
if p.Target["Job"] == *job.ID {
policyID = p.ID
break
}
}
if policyID == "" {
t.Fatalf("unable to find scaling policy for job %s", *job.ID)
}
// Fetch scaling policy
resp, _, err := scaling.GetPolicy(policyID, nil)
must.NoError(t, err)
// Check that the scaling policy fields match
namespace := DefaultNamespace
if job.Namespace != nil && *job.Namespace != "" {
namespace = *job.Namespace
}
expectedTarget := map[string]string{
"Namespace": namespace,
"Job": *job.ID,
"Group": *job.TaskGroups[0].Name,
}
must.Eq(t, expectedTarget, resp.Target)
must.Eq(t, policy.Policy, resp.Policy)
must.Eq(t, policy.Enabled, resp.Enabled)
must.Eq(t, *policy.Min, *resp.Min)
must.Eq(t, policy.Max, resp.Max)
must.Eq(t, ScalingPolicyTypeHorizontal, resp.Type)
}