github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/orchestrator/task_test.go (about) 1 package orchestrator 2 3 import ( 4 "sort" 5 "strconv" 6 "testing" 7 8 google_protobuf "github.com/gogo/protobuf/types" 9 "github.com/stretchr/testify/assert" 10 11 "github.com/docker/swarmkit/api" 12 ) 13 14 // Test IsTaskDirty() for placement constraints. 15 func TestIsTaskDirty(t *testing.T) { 16 service := &api.Service{ 17 ID: "id1", 18 SpecVersion: &api.Version{Index: 1}, 19 Spec: api.ServiceSpec{ 20 Annotations: api.Annotations{ 21 Name: "name1", 22 }, 23 Task: api.TaskSpec{ 24 Runtime: &api.TaskSpec_Container{ 25 Container: &api.ContainerSpec{ 26 Image: "v:1", 27 }, 28 }, 29 }, 30 }, 31 } 32 33 task := &api.Task{ 34 ID: "task1", 35 Spec: api.TaskSpec{ 36 Runtime: &api.TaskSpec_Container{ 37 Container: &api.ContainerSpec{ 38 Image: "v:1", 39 }, 40 }, 41 }, 42 } 43 44 node := &api.Node{ 45 ID: "node1", 46 } 47 48 assert.False(t, IsTaskDirty(service, task, node)) 49 50 // Update only placement constraints. 51 service.SpecVersion.Index++ 52 service.Spec.Task.Placement = &api.Placement{} 53 service.Spec.Task.Placement.Constraints = append(service.Spec.Task.Placement.Constraints, "node=node1") 54 assert.False(t, IsTaskDirty(service, task, node)) 55 56 // Update only placement constraints again. 57 service.SpecVersion.Index++ 58 service.Spec.Task.Placement = &api.Placement{} 59 service.Spec.Task.Placement.Constraints = append(service.Spec.Task.Placement.Constraints, "node!=node1") 60 assert.True(t, IsTaskDirty(service, task, node)) 61 62 // Update only placement constraints 63 service.SpecVersion.Index++ 64 service.Spec.Task.Placement = &api.Placement{} 65 service.Spec.Task.GetContainer().Image = "v:2" 66 assert.True(t, IsTaskDirty(service, task, node)) 67 } 68 69 func TestIsTaskDirtyPlacementConstraintsOnly(t *testing.T) { 70 service := &api.Service{ 71 ID: "id1", 72 Spec: api.ServiceSpec{ 73 Annotations: api.Annotations{ 74 Name: "name1", 75 }, 76 Task: api.TaskSpec{ 77 Runtime: &api.TaskSpec_Container{ 78 Container: &api.ContainerSpec{ 79 Image: "v:1", 80 }, 81 }, 82 }, 83 }, 84 } 85 86 task := &api.Task{ 87 ID: "task1", 88 Spec: api.TaskSpec{ 89 Runtime: &api.TaskSpec_Container{ 90 Container: &api.ContainerSpec{ 91 Image: "v:1", 92 }, 93 }, 94 }, 95 } 96 97 assert.False(t, IsTaskDirtyPlacementConstraintsOnly(service.Spec.Task, task)) 98 99 // Update only placement constraints. 100 service.Spec.Task.Placement = &api.Placement{} 101 service.Spec.Task.Placement.Constraints = append(service.Spec.Task.Placement.Constraints, "node==*") 102 assert.True(t, IsTaskDirtyPlacementConstraintsOnly(service.Spec.Task, task)) 103 104 // Update something else in the task spec. 105 service.Spec.Task.GetContainer().Image = "v:2" 106 assert.False(t, IsTaskDirtyPlacementConstraintsOnly(service.Spec.Task, task)) 107 108 // Clear out placement constraints. 109 service.Spec.Task.Placement.Constraints = nil 110 assert.False(t, IsTaskDirtyPlacementConstraintsOnly(service.Spec.Task, task)) 111 } 112 113 // Test Task sorting, which is currently based on 114 // Status.AppliedAt, and then on Status.Timestamp. 115 func TestTaskSort(t *testing.T) { 116 var tasks []*api.Task 117 size := 5 118 seconds := int64(size) 119 for i := 0; i < size; i++ { 120 task := &api.Task{ 121 ID: "id_" + strconv.Itoa(i), 122 Status: api.TaskStatus{ 123 Timestamp: &google_protobuf.Timestamp{Seconds: seconds}, 124 }, 125 } 126 127 seconds-- 128 tasks = append(tasks, task) 129 } 130 131 sort.Sort(TasksByTimestamp(tasks)) 132 for i, task := range tasks { 133 expected := &google_protobuf.Timestamp{Seconds: int64(i + 1)} 134 assert.Equal(t, expected, task.Status.Timestamp) 135 assert.Equal(t, "id_"+strconv.Itoa(size-(i+1)), task.ID) 136 } 137 138 for i, task := range tasks { 139 task.Status.AppliedAt = &google_protobuf.Timestamp{Seconds: int64(size - i)} 140 } 141 142 sort.Sort(TasksByTimestamp(tasks)) 143 sort.Sort(TasksByTimestamp(tasks)) 144 for i, task := range tasks { 145 expected := &google_protobuf.Timestamp{Seconds: int64(i + 1)} 146 assert.Equal(t, expected, task.Status.AppliedAt) 147 assert.Equal(t, "id_"+strconv.Itoa(i), task.ID) 148 } 149 }