github.com/djenriquez/nomad-1@v0.8.1/api/allocations_test.go (about)

     1  package api
     2  
     3  import (
     4  	"reflect"
     5  	"sort"
     6  	"testing"
     7  
     8  	"time"
     9  
    10  	"github.com/hashicorp/nomad/helper"
    11  	"github.com/hashicorp/nomad/helper/uuid"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestAllocations_List(t *testing.T) {
    16  	t.Parallel()
    17  	c, s := makeClient(t, nil, nil)
    18  	defer s.Stop()
    19  	a := c.Allocations()
    20  
    21  	// Querying when no allocs exist returns nothing
    22  	allocs, qm, err := a.List(nil)
    23  	if err != nil {
    24  		t.Fatalf("err: %s", err)
    25  	}
    26  	if qm.LastIndex != 0 {
    27  		t.Fatalf("bad index: %d", qm.LastIndex)
    28  	}
    29  	if n := len(allocs); n != 0 {
    30  		t.Fatalf("expected 0 allocs, got: %d", n)
    31  	}
    32  
    33  	// TODO: do something that causes an allocation to actually happen
    34  	// so we can query for them.
    35  	return
    36  
    37  	//job := &Job{
    38  	//ID:   helper.StringToPtr("job1"),
    39  	//Name: helper.StringToPtr("Job #1"),
    40  	//Type: helper.StringToPtr(JobTypeService),
    41  	//}
    42  	//eval, _, err := c.Jobs().Register(job, nil)
    43  	//if err != nil {
    44  	//t.Fatalf("err: %s", err)
    45  	//}
    46  
    47  	//// List the allocations again
    48  	//allocs, qm, err = a.List(nil)
    49  	//if err != nil {
    50  	//t.Fatalf("err: %s", err)
    51  	//}
    52  	//if qm.LastIndex == 0 {
    53  	//t.Fatalf("bad index: %d", qm.LastIndex)
    54  	//}
    55  
    56  	//// Check that we got the allocation back
    57  	//if len(allocs) == 0 || allocs[0].EvalID != eval {
    58  	//t.Fatalf("bad: %#v", allocs)
    59  	//}
    60  }
    61  
    62  func TestAllocations_PrefixList(t *testing.T) {
    63  	t.Parallel()
    64  	c, s := makeClient(t, nil, nil)
    65  	defer s.Stop()
    66  	a := c.Allocations()
    67  
    68  	// Querying when no allocs exist returns nothing
    69  	allocs, qm, err := a.PrefixList("")
    70  	if err != nil {
    71  		t.Fatalf("err: %s", err)
    72  	}
    73  	if qm.LastIndex != 0 {
    74  		t.Fatalf("bad index: %d", qm.LastIndex)
    75  	}
    76  	if n := len(allocs); n != 0 {
    77  		t.Fatalf("expected 0 allocs, got: %d", n)
    78  	}
    79  
    80  	// TODO: do something that causes an allocation to actually happen
    81  	// so we can query for them.
    82  	return
    83  
    84  	//job := &Job{
    85  	//ID:   helper.StringToPtr("job1"),
    86  	//Name: helper.StringToPtr("Job #1"),
    87  	//Type: helper.StringToPtr(JobTypeService),
    88  	//}
    89  
    90  	//eval, _, err := c.Jobs().Register(job, nil)
    91  	//if err != nil {
    92  	//t.Fatalf("err: %s", err)
    93  	//}
    94  
    95  	//// List the allocations by prefix
    96  	//allocs, qm, err = a.PrefixList("foobar")
    97  	//if err != nil {
    98  	//t.Fatalf("err: %s", err)
    99  	//}
   100  	//if qm.LastIndex == 0 {
   101  	//t.Fatalf("bad index: %d", qm.LastIndex)
   102  	//}
   103  
   104  	//// Check that we got the allocation back
   105  	//if len(allocs) == 0 || allocs[0].EvalID != eval {
   106  	//t.Fatalf("bad: %#v", allocs)
   107  	//}
   108  }
   109  
   110  func TestAllocations_CreateIndexSort(t *testing.T) {
   111  	t.Parallel()
   112  	allocs := []*AllocationListStub{
   113  		{CreateIndex: 2},
   114  		{CreateIndex: 1},
   115  		{CreateIndex: 5},
   116  	}
   117  	sort.Sort(AllocIndexSort(allocs))
   118  
   119  	expect := []*AllocationListStub{
   120  		{CreateIndex: 5},
   121  		{CreateIndex: 2},
   122  		{CreateIndex: 1},
   123  	}
   124  	if !reflect.DeepEqual(allocs, expect) {
   125  		t.Fatalf("\n\n%#v\n\n%#v", allocs, expect)
   126  	}
   127  }
   128  
   129  func TestAllocations_RescheduleInfo(t *testing.T) {
   130  	t.Parallel()
   131  	// Create a job, task group and alloc
   132  	job := &Job{
   133  		Name:      helper.StringToPtr("foo"),
   134  		Namespace: helper.StringToPtr(DefaultNamespace),
   135  		ID:        helper.StringToPtr("bar"),
   136  		ParentID:  helper.StringToPtr("lol"),
   137  		TaskGroups: []*TaskGroup{
   138  			{
   139  				Name: helper.StringToPtr("bar"),
   140  				Tasks: []*Task{
   141  					{
   142  						Name: "task1",
   143  					},
   144  				},
   145  			},
   146  		},
   147  	}
   148  	job.Canonicalize()
   149  
   150  	alloc := &Allocation{
   151  		ID:        uuid.Generate(),
   152  		Namespace: DefaultNamespace,
   153  		EvalID:    uuid.Generate(),
   154  		Name:      "foo-bar[1]",
   155  		NodeID:    uuid.Generate(),
   156  		TaskGroup: *job.TaskGroups[0].Name,
   157  		JobID:     *job.ID,
   158  		Job:       job,
   159  	}
   160  
   161  	type testCase struct {
   162  		desc              string
   163  		reschedulePolicy  *ReschedulePolicy
   164  		rescheduleTracker *RescheduleTracker
   165  		time              time.Time
   166  		expAttempted      int
   167  		expTotal          int
   168  	}
   169  
   170  	testCases := []testCase{
   171  		{
   172  			desc:         "no reschedule policy",
   173  			expAttempted: 0,
   174  			expTotal:     0,
   175  		},
   176  		{
   177  			desc: "no reschedule events",
   178  			reschedulePolicy: &ReschedulePolicy{
   179  				Attempts: helper.IntToPtr(3),
   180  				Interval: helper.TimeToPtr(15 * time.Minute),
   181  			},
   182  			expAttempted: 0,
   183  			expTotal:     3,
   184  		},
   185  		{
   186  			desc: "all reschedule events within interval",
   187  			reschedulePolicy: &ReschedulePolicy{
   188  				Attempts: helper.IntToPtr(3),
   189  				Interval: helper.TimeToPtr(15 * time.Minute),
   190  			},
   191  			time: time.Now(),
   192  			rescheduleTracker: &RescheduleTracker{
   193  				Events: []*RescheduleEvent{
   194  					{
   195  						RescheduleTime: time.Now().Add(-5 * time.Minute).UTC().UnixNano(),
   196  					},
   197  				},
   198  			},
   199  			expAttempted: 1,
   200  			expTotal:     3,
   201  		},
   202  		{
   203  			desc: "some reschedule events outside interval",
   204  			reschedulePolicy: &ReschedulePolicy{
   205  				Attempts: helper.IntToPtr(3),
   206  				Interval: helper.TimeToPtr(15 * time.Minute),
   207  			},
   208  			time: time.Now(),
   209  			rescheduleTracker: &RescheduleTracker{
   210  				Events: []*RescheduleEvent{
   211  					{
   212  						RescheduleTime: time.Now().Add(-45 * time.Minute).UTC().UnixNano(),
   213  					},
   214  					{
   215  						RescheduleTime: time.Now().Add(-30 * time.Minute).UTC().UnixNano(),
   216  					},
   217  					{
   218  						RescheduleTime: time.Now().Add(-10 * time.Minute).UTC().UnixNano(),
   219  					},
   220  					{
   221  						RescheduleTime: time.Now().Add(-5 * time.Minute).UTC().UnixNano(),
   222  					},
   223  				},
   224  			},
   225  			expAttempted: 2,
   226  			expTotal:     3,
   227  		},
   228  	}
   229  
   230  	for _, tc := range testCases {
   231  		t.Run(tc.desc, func(t *testing.T) {
   232  			require := require.New(t)
   233  			alloc.RescheduleTracker = tc.rescheduleTracker
   234  			job.TaskGroups[0].ReschedulePolicy = tc.reschedulePolicy
   235  			attempted, total := alloc.RescheduleInfo(tc.time)
   236  			require.Equal(tc.expAttempted, attempted)
   237  			require.Equal(tc.expTotal, total)
   238  		})
   239  	}
   240  
   241  }
   242  
   243  func TestAllocations_ShouldMigrate(t *testing.T) {
   244  	t.Parallel()
   245  	require.True(t, DesiredTransition{Migrate: helper.BoolToPtr(true)}.ShouldMigrate())
   246  	require.False(t, DesiredTransition{}.ShouldMigrate())
   247  	require.False(t, DesiredTransition{Migrate: helper.BoolToPtr(false)}.ShouldMigrate())
   248  }