github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/scheduler/nodeinfo_test.go (about)

     1  package scheduler
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/docker/swarmkit/api"
     7  	"github.com/docker/swarmkit/api/genericresource"
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestRemoveTask(t *testing.T) {
    12  	nodeResourceSpec := &api.Resources{
    13  		NanoCPUs:    100000,
    14  		MemoryBytes: 1000000,
    15  		Generic: append(
    16  			genericresource.NewSet("orange", "blue", "red", "green"),
    17  			genericresource.NewDiscrete("apple", 6),
    18  		),
    19  	}
    20  
    21  	node := &api.Node{
    22  		Description: &api.NodeDescription{Resources: nodeResourceSpec},
    23  	}
    24  
    25  	tasks := map[string]*api.Task{
    26  		"task1": {
    27  			ID: "task1",
    28  		},
    29  		"task2": {
    30  			ID: "task2",
    31  		},
    32  	}
    33  
    34  	available := api.Resources{
    35  		NanoCPUs:    100000,
    36  		MemoryBytes: 1000000,
    37  		Generic: append(
    38  			genericresource.NewSet("orange", "blue", "red"),
    39  			genericresource.NewDiscrete("apple", 5),
    40  		),
    41  	}
    42  
    43  	taskRes := &api.Resources{
    44  		NanoCPUs:    5000,
    45  		MemoryBytes: 5000,
    46  		Generic: []*api.GenericResource{
    47  			genericresource.NewDiscrete("apple", 1),
    48  			genericresource.NewDiscrete("orange", 1),
    49  		},
    50  	}
    51  
    52  	task1 := &api.Task{
    53  		ID: "task1",
    54  		Spec: api.TaskSpec{
    55  			Resources: &api.ResourceRequirements{Reservations: taskRes},
    56  		},
    57  		AssignedGenericResources: append(
    58  			genericresource.NewSet("orange", "green"),
    59  			genericresource.NewDiscrete("apple", 1),
    60  		),
    61  	}
    62  
    63  	task3 := &api.Task{
    64  		ID: "task3",
    65  	}
    66  
    67  	// nodeInfo has no tasks
    68  	nodeInfo := newNodeInfo(node, nil, available)
    69  	assert.False(t, nodeInfo.removeTask(task1))
    70  
    71  	// nodeInfo's tasks has taskID
    72  	nodeInfo = newNodeInfo(node, tasks, available)
    73  	assert.True(t, nodeInfo.removeTask(task1))
    74  
    75  	// nodeInfo's tasks has no taskID
    76  	assert.False(t, nodeInfo.removeTask(task3))
    77  
    78  	nodeAvailableResources := nodeInfo.AvailableResources
    79  
    80  	cpuLeft := available.NanoCPUs + taskRes.NanoCPUs
    81  	memoryLeft := available.MemoryBytes + taskRes.MemoryBytes
    82  
    83  	assert.Equal(t, cpuLeft, nodeAvailableResources.NanoCPUs)
    84  	assert.Equal(t, memoryLeft, nodeAvailableResources.MemoryBytes)
    85  
    86  	assert.Equal(t, 4, len(nodeAvailableResources.Generic))
    87  
    88  	apples := genericresource.GetResource("apple", nodeAvailableResources.Generic)
    89  	oranges := genericresource.GetResource("orange", nodeAvailableResources.Generic)
    90  	assert.Len(t, apples, 1)
    91  	assert.Len(t, oranges, 3)
    92  
    93  	for _, k := range []string{"red", "blue", "green"} {
    94  		assert.True(t, genericresource.HasResource(
    95  			genericresource.NewString("orange", k), oranges),
    96  		)
    97  	}
    98  
    99  	assert.Equal(t, int64(6), apples[0].GetDiscreteResourceSpec().Value)
   100  }
   101  
   102  func TestAddTask(t *testing.T) {
   103  	node := &api.Node{}
   104  
   105  	tasks := map[string]*api.Task{
   106  		"task1": {
   107  			ID: "task1",
   108  		},
   109  		"task2": {
   110  			ID: "task2",
   111  		},
   112  	}
   113  
   114  	task1 := &api.Task{
   115  		ID: "task1",
   116  	}
   117  
   118  	available := api.Resources{
   119  		NanoCPUs:    100000,
   120  		MemoryBytes: 1000000,
   121  		Generic: append(
   122  			genericresource.NewSet("orange", "blue", "red"),
   123  			genericresource.NewDiscrete("apple", 5),
   124  		),
   125  	}
   126  
   127  	taskRes := &api.Resources{
   128  		NanoCPUs:    5000,
   129  		MemoryBytes: 5000,
   130  		Generic: []*api.GenericResource{
   131  			genericresource.NewDiscrete("apple", 2),
   132  			genericresource.NewDiscrete("orange", 1),
   133  		},
   134  	}
   135  
   136  	task3 := &api.Task{
   137  		ID: "task3",
   138  		Spec: api.TaskSpec{
   139  			Resources: &api.ResourceRequirements{Reservations: taskRes},
   140  		},
   141  	}
   142  
   143  	nodeInfo := newNodeInfo(node, tasks, available)
   144  
   145  	// add task with ID existing
   146  	assert.False(t, nodeInfo.addTask(task1))
   147  
   148  	// add task with ID non-existing
   149  	assert.True(t, nodeInfo.addTask(task3))
   150  
   151  	// add again
   152  	assert.False(t, nodeInfo.addTask(task3))
   153  
   154  	// Check resource consumption of node
   155  	nodeAvailableResources := nodeInfo.AvailableResources
   156  
   157  	cpuLeft := available.NanoCPUs - taskRes.NanoCPUs
   158  	memoryLeft := available.MemoryBytes - taskRes.MemoryBytes
   159  
   160  	assert.Equal(t, cpuLeft, nodeAvailableResources.NanoCPUs)
   161  	assert.Equal(t, memoryLeft, nodeAvailableResources.MemoryBytes)
   162  
   163  	apples := genericresource.GetResource("apple", nodeAvailableResources.Generic)
   164  	oranges := genericresource.GetResource("orange", nodeAvailableResources.Generic)
   165  	assert.Len(t, apples, 1)
   166  	assert.Len(t, oranges, 1)
   167  
   168  	o := oranges[0].GetNamedResourceSpec()
   169  	assert.True(t, o.Value == "blue" || o.Value == "red")
   170  	assert.Equal(t, int64(3), apples[0].GetDiscreteResourceSpec().Value)
   171  
   172  }