github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/command/recommendation_list_test.go (about)

     1  package command
     2  
     3  import (
     4  	"sort"
     5  	"testing"
     6  
     7  	"github.com/mitchellh/cli"
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/hashicorp/nomad/api"
    12  )
    13  
    14  func TestRecommendationListCommand_Run(t *testing.T) {
    15  	require := require.New(t)
    16  	t.Parallel()
    17  	srv, client, url := testServer(t, true, nil)
    18  	defer srv.Shutdown()
    19  
    20  	ui := cli.NewMockUi()
    21  	cmd := &RecommendationListCommand{Meta: Meta{Ui: ui}}
    22  
    23  	// Perform an initial list, which should return zero results.
    24  	code := cmd.Run([]string{"-address=" + url})
    25  	if srv.Enterprise {
    26  		require.Equal(0, code)
    27  		out := ui.OutputWriter.String()
    28  		require.Contains(out, "No recommendations found")
    29  	} else {
    30  		require.Equal(1, code)
    31  		require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
    32  	}
    33  
    34  	// Register a test job to write a recommendation against.
    35  	testJob := testJob("recommendation_list")
    36  	regResp, _, err := client.Jobs().Register(testJob, nil)
    37  	require.NoError(err)
    38  	registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
    39  	require.Equal(0, registerCode)
    40  
    41  	// Write a recommendation.
    42  	rec := api.Recommendation{
    43  		JobID:    *testJob.ID,
    44  		Group:    *testJob.TaskGroups[0].Name,
    45  		Task:     testJob.TaskGroups[0].Tasks[0].Name,
    46  		Resource: "CPU",
    47  		Value:    1050,
    48  		Meta:     map[string]interface{}{"test-meta-entry": "test-meta-value"},
    49  		Stats:    map[string]float64{"p13": 1.13},
    50  	}
    51  	_, _, err = client.Recommendations().Upsert(&rec, nil)
    52  	if srv.Enterprise {
    53  		require.NoError(err)
    54  	} else {
    55  		require.Error(err, "Nomad Enterprise only endpoint")
    56  	}
    57  
    58  	// Perform a new list which should yield results.
    59  	code = cmd.Run([]string{"-address=" + url})
    60  	if srv.Enterprise {
    61  		require.Equal(0, code)
    62  		out := ui.OutputWriter.String()
    63  		require.Contains(out, "ID")
    64  		require.Contains(out, "Job")
    65  		require.Contains(out, "Group")
    66  		require.Contains(out, "Task")
    67  		require.Contains(out, "Resource")
    68  		require.Contains(out, "Value")
    69  		require.Contains(out, "CPU")
    70  	} else {
    71  		require.Equal(1, code)
    72  		require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
    73  	}
    74  }
    75  
    76  func TestRecommendationListCommand_Sort(t *testing.T) {
    77  	testCases := []struct {
    78  		inputRecommendationList []*api.Recommendation
    79  		expectedOutputList      []*api.Recommendation
    80  		name                    string
    81  	}{
    82  		{
    83  			inputRecommendationList: []*api.Recommendation{
    84  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
    85  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
    86  			},
    87  			expectedOutputList: []*api.Recommendation{
    88  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
    89  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
    90  			},
    91  			name: "single job with both resources",
    92  		},
    93  		{
    94  			inputRecommendationList: []*api.Recommendation{
    95  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
    96  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
    97  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
    98  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
    99  			},
   100  			expectedOutputList: []*api.Recommendation{
   101  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
   102  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
   103  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
   104  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   105  			},
   106  			name: "single job with multiple groups",
   107  		},
   108  		{
   109  			inputRecommendationList: []*api.Recommendation{
   110  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   111  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
   112  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   113  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
   114  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
   115  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   116  			},
   117  			expectedOutputList: []*api.Recommendation{
   118  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   119  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   120  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
   121  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
   122  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
   123  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   124  			},
   125  			name: "multiple jobs",
   126  		},
   127  		{
   128  			inputRecommendationList: []*api.Recommendation{
   129  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   130  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
   131  				{Namespace: "cefault", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   132  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   133  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
   134  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
   135  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   136  				{Namespace: "cefault", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   137  			},
   138  			expectedOutputList: []*api.Recommendation{
   139  				{Namespace: "cefault", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   140  				{Namespace: "cefault", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   141  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "CPU"},
   142  				{Namespace: "default", JobID: "distro", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   143  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "CPU"},
   144  				{Namespace: "default", JobID: "example", Group: "cache", Task: "mongodb", Resource: "MemoryMB"},
   145  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "CPU"},
   146  				{Namespace: "default", JobID: "example", Group: "cache", Task: "redis", Resource: "MemoryMB"},
   147  			},
   148  			name: "multiple namespaces",
   149  		},
   150  	}
   151  
   152  	for _, tc := range testCases {
   153  		t.Run(tc.name, func(t *testing.T) {
   154  			sortedRecs := recommendationList{r: tc.inputRecommendationList}
   155  			sort.Sort(sortedRecs)
   156  			assert.Equal(t, tc.expectedOutputList, sortedRecs.r, tc.name)
   157  		})
   158  	}
   159  }