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  }