github.com/ryanslade/nomad@v0.2.4-0.20160128061903-fc95782f2089/api/nodes_test.go (about)

     1  package api
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"sort"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/nomad/testutil"
    11  )
    12  
    13  func TestNodes_List(t *testing.T) {
    14  	c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) {
    15  		c.DevMode = true
    16  	})
    17  	defer s.Stop()
    18  	nodes := c.Nodes()
    19  
    20  	var qm *QueryMeta
    21  	var out []*NodeListStub
    22  	var err error
    23  
    24  	testutil.WaitForResult(func() (bool, error) {
    25  		out, qm, err = nodes.List(nil)
    26  		if err != nil {
    27  			return false, err
    28  		}
    29  		if n := len(out); n != 1 {
    30  			return false, fmt.Errorf("expected 1 node, got: %d", n)
    31  		}
    32  		return true, nil
    33  	}, func(err error) {
    34  		t.Fatalf("err: %s", err)
    35  	})
    36  
    37  	// Check that we got valid QueryMeta.
    38  	assertQueryMeta(t, qm)
    39  }
    40  
    41  func TestNodes_PrefixList(t *testing.T) {
    42  	c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) {
    43  		c.DevMode = true
    44  	})
    45  	defer s.Stop()
    46  	nodes := c.Nodes()
    47  
    48  	var qm *QueryMeta
    49  	var out []*NodeListStub
    50  	var err error
    51  
    52  	// Get the node ID
    53  	var nodeID, dc string
    54  	testutil.WaitForResult(func() (bool, error) {
    55  		out, _, err := nodes.List(nil)
    56  		if err != nil {
    57  			return false, err
    58  		}
    59  		if n := len(out); n != 1 {
    60  			return false, fmt.Errorf("expected 1 node, got: %d", n)
    61  		}
    62  		nodeID = out[0].ID
    63  		dc = out[0].Datacenter
    64  		return true, nil
    65  	}, func(err error) {
    66  		t.Fatalf("err: %s", err)
    67  	})
    68  
    69  	// Find node based on four character prefix
    70  	out, qm, err = nodes.PrefixList(nodeID[:4])
    71  	if err != nil {
    72  		t.Fatalf("err: %s", err)
    73  	}
    74  	if n := len(out); n != 1 {
    75  		t.Fatalf("expected 1 node, got: %d ", n)
    76  	}
    77  
    78  	// Check that we got valid QueryMeta.
    79  	assertQueryMeta(t, qm)
    80  }
    81  
    82  func TestNodes_Info(t *testing.T) {
    83  	c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) {
    84  		c.DevMode = true
    85  	})
    86  	defer s.Stop()
    87  	nodes := c.Nodes()
    88  
    89  	// Retrieving a non-existent node returns error
    90  	_, _, err := nodes.Info("12345678-abcd-efab-cdef-123456789abc", nil)
    91  	if err == nil || !strings.Contains(err.Error(), "not found") {
    92  		t.Fatalf("expected not found error, got: %#v", err)
    93  	}
    94  
    95  	// Get the node ID
    96  	var nodeID, dc string
    97  	testutil.WaitForResult(func() (bool, error) {
    98  		out, _, err := nodes.List(nil)
    99  		if err != nil {
   100  			return false, err
   101  		}
   102  		if n := len(out); n != 1 {
   103  			return false, fmt.Errorf("expected 1 node, got: %d", n)
   104  		}
   105  		nodeID = out[0].ID
   106  		dc = out[0].Datacenter
   107  		return true, nil
   108  	}, func(err error) {
   109  		t.Fatalf("err: %s", err)
   110  	})
   111  
   112  	// Querying for existing nodes returns properly
   113  	result, qm, err := nodes.Info(nodeID, nil)
   114  	if err != nil {
   115  		t.Fatalf("err: %s", err)
   116  	}
   117  	assertQueryMeta(t, qm)
   118  
   119  	// Check that the result is what we expect
   120  	if result.ID != nodeID || result.Datacenter != dc {
   121  		t.Fatalf("expected %s (%s), got: %s (%s)",
   122  			nodeID, dc,
   123  			result.ID, result.Datacenter)
   124  	}
   125  }
   126  
   127  func TestNodes_ToggleDrain(t *testing.T) {
   128  	c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) {
   129  		c.DevMode = true
   130  	})
   131  	defer s.Stop()
   132  	nodes := c.Nodes()
   133  
   134  	// Wait for node registration and get the ID
   135  	var nodeID string
   136  	testutil.WaitForResult(func() (bool, error) {
   137  		out, _, err := nodes.List(nil)
   138  		if err != nil {
   139  			return false, err
   140  		}
   141  		if n := len(out); n != 1 {
   142  			return false, fmt.Errorf("expected 1 node, got: %d", n)
   143  		}
   144  		nodeID = out[0].ID
   145  		return true, nil
   146  	}, func(err error) {
   147  		t.Fatalf("err: %s", err)
   148  	})
   149  
   150  	// Check for drain mode
   151  	out, _, err := nodes.Info(nodeID, nil)
   152  	if err != nil {
   153  		t.Fatalf("err: %s", err)
   154  	}
   155  	if out.Drain {
   156  		t.Fatalf("drain mode should be off")
   157  	}
   158  
   159  	// Toggle it on
   160  	wm, err := nodes.ToggleDrain(nodeID, true, nil)
   161  	if err != nil {
   162  		t.Fatalf("err: %s", err)
   163  	}
   164  	assertWriteMeta(t, wm)
   165  
   166  	// Check again
   167  	out, _, err = nodes.Info(nodeID, nil)
   168  	if err != nil {
   169  		t.Fatalf("err: %s", err)
   170  	}
   171  	if !out.Drain {
   172  		t.Fatalf("drain mode should be on")
   173  	}
   174  
   175  	// Toggle off again
   176  	wm, err = nodes.ToggleDrain(nodeID, false, nil)
   177  	if err != nil {
   178  		t.Fatalf("err: %s", err)
   179  	}
   180  	assertWriteMeta(t, wm)
   181  
   182  	// Check again
   183  	out, _, err = nodes.Info(nodeID, nil)
   184  	if err != nil {
   185  		t.Fatalf("err: %s", err)
   186  	}
   187  	if out.Drain {
   188  		t.Fatalf("drain mode should be off")
   189  	}
   190  }
   191  
   192  func TestNodes_Allocations(t *testing.T) {
   193  	c, s := makeClient(t, nil, nil)
   194  	defer s.Stop()
   195  	nodes := c.Nodes()
   196  
   197  	// Looking up by a non-existent node returns nothing. We
   198  	// don't check the index here because it's possible the node
   199  	// has already registered, in which case we will get a non-
   200  	// zero result anyways.
   201  	allocs, _, err := nodes.Allocations("nope", nil)
   202  	if err != nil {
   203  		t.Fatalf("err: %s", err)
   204  	}
   205  	if n := len(allocs); n != 0 {
   206  		t.Fatalf("expected 0 allocs, got: %d", n)
   207  	}
   208  }
   209  
   210  func TestNodes_ForceEvaluate(t *testing.T) {
   211  	c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) {
   212  		c.DevMode = true
   213  	})
   214  	defer s.Stop()
   215  	nodes := c.Nodes()
   216  
   217  	// Force-eval on a non-existent node fails
   218  	_, _, err := nodes.ForceEvaluate("12345678-abcd-efab-cdef-123456789abc", nil)
   219  	if err == nil || !strings.Contains(err.Error(), "not found") {
   220  		t.Fatalf("expected not found error, got: %#v", err)
   221  	}
   222  
   223  	// Wait for node registration and get the ID
   224  	var nodeID string
   225  	testutil.WaitForResult(func() (bool, error) {
   226  		out, _, err := nodes.List(nil)
   227  		if err != nil {
   228  			return false, err
   229  		}
   230  		if n := len(out); n != 1 {
   231  			return false, fmt.Errorf("expected 1 node, got: %d", n)
   232  		}
   233  		nodeID = out[0].ID
   234  		return true, nil
   235  	}, func(err error) {
   236  		t.Fatalf("err: %s", err)
   237  	})
   238  
   239  	// Try force-eval again. We don't check the WriteMeta because
   240  	// there are no allocations to process, so we would get an index
   241  	// of zero. Same goes for the eval ID.
   242  	_, _, err = nodes.ForceEvaluate(nodeID, nil)
   243  	if err != nil {
   244  		t.Fatalf("err: %s", err)
   245  	}
   246  }
   247  
   248  func TestNodes_Sort(t *testing.T) {
   249  	nodes := []*NodeListStub{
   250  		&NodeListStub{CreateIndex: 2},
   251  		&NodeListStub{CreateIndex: 1},
   252  		&NodeListStub{CreateIndex: 5},
   253  	}
   254  	sort.Sort(NodeIndexSort(nodes))
   255  
   256  	expect := []*NodeListStub{
   257  		&NodeListStub{CreateIndex: 5},
   258  		&NodeListStub{CreateIndex: 2},
   259  		&NodeListStub{CreateIndex: 1},
   260  	}
   261  	if !reflect.DeepEqual(nodes, expect) {
   262  		t.Fatalf("\n\n%#v\n\n%#v", nodes, expect)
   263  	}
   264  }