github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/command/service_info_test.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/hashicorp/nomad/api"
     9  	"github.com/hashicorp/nomad/ci"
    10  	"github.com/hashicorp/nomad/testutil"
    11  	"github.com/mitchellh/cli"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestServiceInfoCommand_Run(t *testing.T) {
    17  	ci.Parallel(t)
    18  
    19  	srv, client, url := testServer(t, true, nil)
    20  	defer srv.Shutdown()
    21  
    22  	// Wait until our test node is ready.
    23  	testutil.WaitForResult(func() (bool, error) {
    24  		nodes, _, err := client.Nodes().List(nil)
    25  		if err != nil {
    26  			return false, err
    27  		}
    28  		if len(nodes) == 0 {
    29  			return false, fmt.Errorf("missing node")
    30  		}
    31  		if _, ok := nodes[0].Drivers["mock_driver"]; !ok {
    32  			return false, fmt.Errorf("mock_driver not ready")
    33  		}
    34  		return true, nil
    35  	}, func(err error) {
    36  		require.NoError(t, err)
    37  	})
    38  
    39  	ui := cli.NewMockUi()
    40  	cmd := &ServiceInfoCommand{
    41  		Meta: Meta{
    42  			Ui:          ui,
    43  			flagAddress: url,
    44  		},
    45  	}
    46  
    47  	// Run the command without any arguments to ensure we are performing this
    48  	// check.
    49  	require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
    50  	require.Contains(t, ui.ErrorWriter.String(),
    51  		"This command takes one argument: <service_name>")
    52  	ui.ErrorWriter.Reset()
    53  
    54  	// Create a test job with a Nomad service.
    55  	testJob := testJob("service-discovery-nomad-info")
    56  	testJob.TaskGroups[0].Services = []*api.Service{
    57  		{Name: "service-discovery-nomad-info", Provider: "nomad", PortLabel: "9999", Tags: []string{"foo", "bar"}}}
    58  
    59  	// Register that job.
    60  	regResp, _, err := client.Jobs().Register(testJob, nil)
    61  	require.NoError(t, err)
    62  	registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
    63  	require.Equal(t, 0, registerCode)
    64  
    65  	// Reset the output writer, otherwise we will have additional information here.
    66  	ui.OutputWriter.Reset()
    67  
    68  	// Job register doesn't assure the service registration has completed. It
    69  	// therefore needs this wrapper to account for eventual service
    70  	// registration. One this has completed, we can perform lookups without
    71  	// similar wraps.
    72  	require.Eventually(t, func() bool {
    73  
    74  		defer ui.OutputWriter.Reset()
    75  
    76  		// Perform a standard lookup.
    77  		if code := cmd.Run([]string{"-address=" + url, "service-discovery-nomad-info"}); code != 0 {
    78  			return false
    79  		}
    80  
    81  		// Test each header and data entry.
    82  		s := ui.OutputWriter.String()
    83  		if !assert.Contains(t, s, "Job ID") {
    84  			return false
    85  		}
    86  		if !assert.Contains(t, s, "Address") {
    87  			return false
    88  		}
    89  		if !assert.Contains(t, s, "Node ID") {
    90  			return false
    91  		}
    92  		if !assert.Contains(t, s, "Alloc ID") {
    93  			return false
    94  		}
    95  		if !assert.Contains(t, s, "service-discovery-nomad-info") {
    96  			return false
    97  		}
    98  		if !assert.Contains(t, s, ":9999") {
    99  			return false
   100  		}
   101  		if !assert.Contains(t, s, "[foo,bar]") {
   102  			return false
   103  		}
   104  		return true
   105  	}, 5*time.Second, 100*time.Millisecond)
   106  
   107  	// Perform a verbose lookup.
   108  	code := cmd.Run([]string{"-address=" + url, "-verbose", "service-discovery-nomad-info"})
   109  	require.Equal(t, 0, code)
   110  
   111  	// Test KV entries.
   112  	s := ui.OutputWriter.String()
   113  	require.Contains(t, s, "Service Name = service-discovery-nomad-info")
   114  	require.Contains(t, s, "Namespace    = default")
   115  	require.Contains(t, s, "Job ID       = service-discovery-nomad-info")
   116  	require.Contains(t, s, "Datacenter   = dc1")
   117  	require.Contains(t, s, "Address      = :9999")
   118  	require.Contains(t, s, "Tags         = [foo,bar]")
   119  
   120  	ui.OutputWriter.Reset()
   121  	ui.ErrorWriter.Reset()
   122  }
   123  
   124  func Test_argsWithNewPageToken(t *testing.T) {
   125  	ci.Parallel(t)
   126  
   127  	testCases := []struct {
   128  		inputOsArgs    []string
   129  		inputNextToken string
   130  		expectedOutput string
   131  		name           string
   132  	}{
   133  		{
   134  			inputOsArgs:    []string{"nomad", "service", "info", "-page-token=abcdef", "example-cache"},
   135  			inputNextToken: "ghijkl",
   136  			expectedOutput: "nomad service info -page-token=ghijkl example-cache",
   137  			name:           "page token with equals sign",
   138  		},
   139  		{
   140  			inputOsArgs:    []string{"nomad", "service", "info", "-page-token", "abcdef", "example-cache"},
   141  			inputNextToken: "ghijkl",
   142  			expectedOutput: "nomad service info -page-token ghijkl example-cache",
   143  			name:           "page token with whitespace gap",
   144  		},
   145  		{
   146  			inputOsArgs:    []string{"nomad", "service", "info", "-per-page", "3", "-page-token", "abcdef", "example-cache"},
   147  			inputNextToken: "ghijkl",
   148  			expectedOutput: "nomad service info -per-page 3 -page-token ghijkl example-cache",
   149  			name:           "per page and page token",
   150  		},
   151  		{
   152  			inputOsArgs:    []string{"nomad", "service", "info", "-page-token", "abcdef", "-per-page", "3", "example-cache"},
   153  			inputNextToken: "ghijkl",
   154  			expectedOutput: "nomad service info -page-token ghijkl -per-page 3 example-cache",
   155  			name:           "page token and per page",
   156  		},
   157  		{
   158  			inputOsArgs:    []string{"nomad", "service", "info", "-page-token", "abcdef", "-per-page=3", "example-cache"},
   159  			inputNextToken: "ghijkl",
   160  			expectedOutput: "nomad service info -page-token ghijkl -per-page=3 example-cache",
   161  			name:           "page token and per page with equal",
   162  		},
   163  		{
   164  			inputOsArgs:    []string{"nomad", "service", "info", "-verbose", "-page-token", "abcdef", "-per-page=3", "example-cache"},
   165  			inputNextToken: "ghijkl",
   166  			expectedOutput: "nomad service info -verbose -page-token ghijkl -per-page=3 example-cache",
   167  			name:           "page token per page with verbose",
   168  		},
   169  	}
   170  
   171  	for _, tc := range testCases {
   172  		t.Run(tc.name, func(t *testing.T) {
   173  			actualOutput := argsWithNewPageToken(tc.inputOsArgs, tc.inputNextToken)
   174  			require.Equal(t, tc.expectedOutput, actualOutput)
   175  		})
   176  	}
   177  }