Fix bug that the count of the default task group is set to the prewarming pool size

This commit is contained in:
Maximilian Paß
2021-07-07 09:10:46 +02:00
parent 68eacae7fe
commit bd7fb53385
4 changed files with 31 additions and 25 deletions

View File

@@ -12,7 +12,9 @@ const (
TemplateJobPrefix = "template" TemplateJobPrefix = "template"
TaskGroupName = "default-group" TaskGroupName = "default-group"
TaskName = "default-task" TaskName = "default-task"
TaskCount = 1
TaskDriver = "docker" TaskDriver = "docker"
TaskCommand = "sleep"
ConfigTaskGroupName = "config" ConfigTaskGroupName = "config"
ConfigTaskName = "config" ConfigTaskName = "config"
ConfigTaskDriver = "exec" ConfigTaskDriver = "exec"
@@ -25,6 +27,7 @@ const (
) )
var ( var (
TaskArgs = []string{"infinity"}
ErrorConfigTaskGroupNotFound = errors.New("config task group not found in job") ErrorConfigTaskGroupNotFound = errors.New("config task group not found in job")
) )
@@ -79,7 +82,7 @@ func CreateTemplateJob(
job.ID = &id job.ID = &id
job.Name = &id job.Name = &id
var taskGroup = createTaskGroup(&job, TaskGroupName, prewarmingPoolSize) var taskGroup = createTaskGroup(&job, TaskGroupName)
configureTask(taskGroup, TaskName, cpuLimit, memoryLimit, image, networkAccess, exposedPorts) configureTask(taskGroup, TaskName, cpuLimit, memoryLimit, image, networkAccess, exposedPorts)
storeTemplateConfiguration(&job, prewarmingPoolSize) storeTemplateConfiguration(&job, prewarmingPoolSize)
@@ -96,15 +99,15 @@ func (a *APIClient) RegisterRunnerJob(template *nomadApi.Job) error {
return a.MonitorEvaluation(evalID, context.Background()) return a.MonitorEvaluation(evalID, context.Background())
} }
func createTaskGroup(job *nomadApi.Job, name string, prewarmingPoolSize uint) *nomadApi.TaskGroup { func createTaskGroup(job *nomadApi.Job, name string) *nomadApi.TaskGroup {
var taskGroup *nomadApi.TaskGroup var taskGroup *nomadApi.TaskGroup
if len(job.TaskGroups) == 0 { if len(job.TaskGroups) == 0 {
taskGroup = nomadApi.NewTaskGroup(name, int(prewarmingPoolSize)) taskGroup = nomadApi.NewTaskGroup(name, TaskCount)
job.TaskGroups = []*nomadApi.TaskGroup{taskGroup} job.TaskGroups = []*nomadApi.TaskGroup{taskGroup}
} else { } else {
taskGroup = job.TaskGroups[0] taskGroup = job.TaskGroups[0]
taskGroup.Name = &name taskGroup.Name = &name
count := 1 count := TaskCount
taskGroup.Count = &count taskGroup.Count = &count
} }
return taskGroup return taskGroup
@@ -173,7 +176,7 @@ func configureTask(
integerCPULimit := int(cpuLimit) integerCPULimit := int(cpuLimit)
integerMemoryLimit := int(memoryLimit) integerMemoryLimit := int(memoryLimit)
if task.Resources == nil { if task.Resources == nil {
task.Resources = &nomadApi.Resources{} task.Resources = nomadApi.DefaultResources()
} }
task.Resources.CPU = &integerCPULimit task.Resources.CPU = &integerCPULimit
task.Resources.MemoryMB = &integerMemoryLimit task.Resources.MemoryMB = &integerMemoryLimit
@@ -182,6 +185,8 @@ func configureTask(
task.Config = make(map[string]interface{}) task.Config = make(map[string]interface{})
} }
task.Config["image"] = image task.Config["image"] = image
task.Config["command"] = TaskCommand
task.Config["args"] = TaskArgs
configureNetwork(taskGroup, networkAccess, exposedPorts) configureNetwork(taskGroup, networkAccess, exposedPorts)
} }
@@ -206,12 +211,12 @@ func findOrCreateConfigTaskGroup(job *nomadApi.Job) *nomadApi.TaskGroup {
taskGroup = nomadApi.NewTaskGroup(ConfigTaskGroupName, 0) taskGroup = nomadApi.NewTaskGroup(ConfigTaskGroupName, 0)
job.AddTaskGroup(taskGroup) job.AddTaskGroup(taskGroup)
} }
createDummyTaskIfNotPresent(taskGroup) createConfigTaskIfNotPresent(taskGroup)
return taskGroup return taskGroup
} }
// createDummyTaskIfNotPresent ensures that a dummy task is in the task group so that the group is accepted by Nomad. // createConfigTaskIfNotPresent ensures that a dummy task is in the task group so that the group is accepted by Nomad.
func createDummyTaskIfNotPresent(taskGroup *nomadApi.TaskGroup) { func createConfigTaskIfNotPresent(taskGroup *nomadApi.TaskGroup) {
var task *nomadApi.Task var task *nomadApi.Task
for _, t := range taskGroup.Tasks { for _, t := range taskGroup.Tasks {
if t.Name == ConfigTaskName { if t.Name == ConfigTaskName {

View File

@@ -15,7 +15,7 @@ import (
) )
func createTestTaskGroup() *nomadApi.TaskGroup { func createTestTaskGroup() *nomadApi.TaskGroup {
return nomadApi.NewTaskGroup("taskGroup", 42) return nomadApi.NewTaskGroup("taskGroup", 1)
} }
func createTestTask() *nomadApi.Task { func createTestTask() *nomadApi.Task {
@@ -23,9 +23,12 @@ func createTestTask() *nomadApi.Task {
} }
func createTestResources() *nomadApi.Resources { func createTestResources() *nomadApi.Resources {
result := nomadApi.DefaultResources()
expectedCPULimit := 1337 expectedCPULimit := 1337
expectedMemoryLimit := 42 expectedMemoryLimit := 42
return &nomadApi.Resources{CPU: &expectedCPULimit, MemoryMB: &expectedMemoryLimit} result.CPU = &expectedCPULimit
result.MemoryMB = &expectedMemoryLimit
return result
} }
func TestCreateTaskGroupCreatesNewTaskGroupWhenJobHasNoTaskGroup(t *testing.T) { func TestCreateTaskGroupCreatesNewTaskGroupWhenJobHasNoTaskGroup(t *testing.T) {
@@ -33,7 +36,7 @@ func TestCreateTaskGroupCreatesNewTaskGroupWhenJobHasNoTaskGroup(t *testing.T) {
if assert.Equal(t, 0, len(job.TaskGroups)) { if assert.Equal(t, 0, len(job.TaskGroups)) {
expectedTaskGroup := createTestTaskGroup() expectedTaskGroup := createTestTaskGroup()
taskGroup := createTaskGroup(job, *expectedTaskGroup.Name, uint(*expectedTaskGroup.Count)) taskGroup := createTaskGroup(job, *expectedTaskGroup.Name)
assert.Equal(t, *expectedTaskGroup, *taskGroup) assert.Equal(t, *expectedTaskGroup, *taskGroup)
assert.Equal(t, []*nomadApi.TaskGroup{taskGroup}, job.TaskGroups, "it should add the task group to the job") assert.Equal(t, []*nomadApi.TaskGroup{taskGroup}, job.TaskGroups, "it should add the task group to the job")
@@ -48,9 +51,7 @@ func TestCreateTaskGroupOverwritesOptionsWhenJobHasTaskGroup(t *testing.T) {
job.TaskGroups = newTaskGroupList job.TaskGroups = newTaskGroupList
newName := *existingTaskGroup.Name + "longerName" newName := *existingTaskGroup.Name + "longerName"
newCount := *existingTaskGroup.Count + 42 taskGroup := createTaskGroup(job, newName)
taskGroup := createTaskGroup(job, newName, uint(newCount))
// create a new copy to avoid changing the original one as it is a pointer // create a new copy to avoid changing the original one as it is a pointer
expectedTaskGroup := *existingTaskGroup expectedTaskGroup := *existingTaskGroup
@@ -166,7 +167,10 @@ func TestConfigureTaskWhenNoTaskExists(t *testing.T) {
expectedTask := nomadApi.NewTask("task", TaskDriver) expectedTask := nomadApi.NewTask("task", TaskDriver)
expectedTask.Resources = expectedResources expectedTask.Resources = expectedResources
expectedImage := "python:latest" expectedImage := "python:latest"
expectedTask.Config = map[string]interface{}{"image": expectedImage, "network_mode": "none"} expectedCommand := "sleep"
expectedArgs := []string{"infinity"}
expectedTask.Config = map[string]interface{}{
"image": expectedImage, "command": expectedCommand, "args": expectedArgs, "network_mode": "none"}
expectedTaskGroup.Tasks = []*nomadApi.Task{expectedTask} expectedTaskGroup.Tasks = []*nomadApi.Task{expectedTask}
expectedTaskGroup.Networks = []*nomadApi.NetworkResource{} expectedTaskGroup.Networks = []*nomadApi.NetworkResource{}
@@ -203,11 +207,11 @@ func TestConfigureTaskWhenTaskExists(t *testing.T) {
} }
func TestCreateTemplateJobSetsAllGivenArguments(t *testing.T) { func TestCreateTemplateJobSetsAllGivenArguments(t *testing.T) {
testJob := helpers.CreateTemplateJob() base, testJob := helpers.CreateTemplateJob()
prewarmingPoolSize, err := strconv.Atoi(testJob.TaskGroups[1].Meta[ConfigMetaPoolSizeKey]) prewarmingPoolSize, err := strconv.Atoi(testJob.TaskGroups[1].Meta[ConfigMetaPoolSizeKey])
require.NoError(t, err) require.NoError(t, err)
job := CreateTemplateJob( job := CreateTemplateJob(
helpers.CreateTemplateJob(), base,
tests.DefaultJobID, tests.DefaultJobID,
uint(prewarmingPoolSize), uint(prewarmingPoolSize),
uint(*testJob.TaskGroups[0].Tasks[0].Resources.CPU), uint(*testJob.TaskGroups[0].Tasks[0].Resources.CPU),

View File

@@ -257,7 +257,7 @@ func (s *ManagerTestSuite) TestUpdateRunnersRemovesIdleAndUsedRunner() {
} }
func (s *ManagerTestSuite) TestUpdateEnvironmentRemovesIdleRunnersWhenScalingDown() { func (s *ManagerTestSuite) TestUpdateEnvironmentRemovesIdleRunnersWhenScalingDown() {
job := helpers.CreateTemplateJob() _, job := helpers.CreateTemplateJob()
initialRunners := uint(40) initialRunners := uint(40)
updatedRunners := uint(10) updatedRunners := uint(10)
err := s.nomadRunnerManager.registerEnvironment(anotherEnvironmentID, initialRunners, job, true) err := s.nomadRunnerManager.registerEnvironment(anotherEnvironmentID, initialRunners, job, true)

View File

@@ -141,17 +141,14 @@ func HttpPutJSON(url string, body interface{}) (response *http.Response, err err
return HttpPut(url, reader) return HttpPut(url, reader)
} }
func CreateTemplateJob() (job *nomadApi.Job) { func CreateTemplateJob() (base, job *nomadApi.Job) {
base = nomadApi.NewBatchJob(tests.DefaultJobID, tests.DefaultJobID, "region-name", 100)
job = nomadApi.NewBatchJob(tests.DefaultJobID, tests.DefaultJobID, "region-name", 100) job = nomadApi.NewBatchJob(tests.DefaultJobID, tests.DefaultJobID, "region-name", 100)
configTaskGroup := nomadApi.NewTaskGroup("config", 0) configTaskGroup := nomadApi.NewTaskGroup("config", 0)
configTaskGroup.Meta = make(map[string]string) configTaskGroup.Meta = make(map[string]string)
configTaskGroup.Meta["prewarmingPoolSize"] = "0" configTaskGroup.Meta["prewarmingPoolSize"] = "0"
configTask := nomadApi.NewTask("config", "exec") configTask := nomadApi.NewTask("config", "exec")
configTask.Config = map[string]interface{}{ configTask.Config = map[string]interface{}{"command": "true"}
"command": "true",
"image": "python:latest",
}
configTask.Resources = nomadApi.DefaultResources()
configTaskGroup.AddTask(configTask) configTaskGroup.AddTask(configTask)
defaultTaskGroup := nomadApi.NewTaskGroup("default-group", 1) defaultTaskGroup := nomadApi.NewTaskGroup("default-group", 1)
@@ -167,5 +164,5 @@ func CreateTemplateJob() (job *nomadApi.Job) {
defaultTaskGroup.AddTask(defaultTask) defaultTaskGroup.AddTask(defaultTask)
job.TaskGroups = []*nomadApi.TaskGroup{defaultTaskGroup, configTaskGroup} job.TaskGroups = []*nomadApi.TaskGroup{defaultTaskGroup, configTaskGroup}
return job return base, job
} }