github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/unit-get_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Copyright 2014 Cloudbase Solutions SRL
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package jujuc_test
     6  
     7  import (
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/juju/cmd/v3"
    13  	"github.com/juju/cmd/v3/cmdtesting"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/rpc/params"
    18  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    19  )
    20  
    21  type UnitGetSuite struct {
    22  	ContextSuite
    23  }
    24  
    25  var _ = gc.Suite(&UnitGetSuite{})
    26  
    27  var unitGetTests = []struct {
    28  	args []string
    29  	out  string
    30  }{
    31  	{[]string{"private-address"}, "192.168.0.99\n"},
    32  	{[]string{"private-address", "--format", "yaml"}, "192.168.0.99\n"},
    33  	{[]string{"private-address", "--format", "json"}, `"192.168.0.99"` + "\n"},
    34  	{[]string{"public-address"}, "gimli.minecraft.testing.invalid\n"},
    35  	{[]string{"public-address", "--format", "yaml"}, "gimli.minecraft.testing.invalid\n"},
    36  	{[]string{"public-address", "--format", "json"}, `"gimli.minecraft.testing.invalid"` + "\n"},
    37  }
    38  
    39  func (s *UnitGetSuite) createCommand(c *gc.C) cmd.Command {
    40  	hctx := s.GetHookContext(c, -1, "")
    41  	com, err := jujuc.NewCommand(hctx, "unit-get")
    42  	c.Assert(err, jc.ErrorIsNil)
    43  	return jujuc.NewJujucCommandWrappedForTest(com)
    44  }
    45  
    46  func (s *UnitGetSuite) TestOutputFormat(c *gc.C) {
    47  	for _, t := range unitGetTests {
    48  		com := s.createCommand(c)
    49  		ctx := cmdtesting.Context(c)
    50  		code := cmd.Main(com, ctx, t.args)
    51  		c.Check(code, gc.Equals, 0)
    52  		c.Check(bufferString(ctx.Stderr), gc.Equals, "")
    53  		c.Check(bufferString(ctx.Stdout), gc.Matches, t.out)
    54  	}
    55  }
    56  
    57  func (s *UnitGetSuite) TestHelp(c *gc.C) {
    58  	com := s.createCommand(c)
    59  	ctx := cmdtesting.Context(c)
    60  	code := cmd.Main(com, ctx, []string{"--help"})
    61  	c.Assert(code, gc.Equals, 0)
    62  	c.Assert(strings.Split(bufferString(ctx.Stdout), "\n")[0], gc.Equals, "Usage: unit-get [options] <setting>")
    63  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
    64  }
    65  
    66  func (s *UnitGetSuite) TestOutputPath(c *gc.C) {
    67  	com := s.createCommand(c)
    68  	ctx := cmdtesting.Context(c)
    69  	code := cmd.Main(com, ctx, []string{"--output", "some-file", "private-address"})
    70  	c.Assert(code, gc.Equals, 0)
    71  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
    72  	c.Assert(bufferString(ctx.Stdout), gc.Equals, "")
    73  	content, err := os.ReadFile(filepath.Join(ctx.Dir, "some-file"))
    74  	c.Assert(err, jc.ErrorIsNil)
    75  	c.Assert(string(content), gc.Equals, "192.168.0.99\n")
    76  }
    77  
    78  func (s *UnitGetSuite) TestUnknownSetting(c *gc.C) {
    79  	com := s.createCommand(c)
    80  	err := cmdtesting.InitCommand(com, []string{"protected-address"})
    81  	c.Assert(err, gc.ErrorMatches, `unknown setting "protected-address"`)
    82  }
    83  
    84  func (s *UnitGetSuite) TestUnknownArg(c *gc.C) {
    85  	com := s.createCommand(c)
    86  	err := cmdtesting.InitCommand(com, []string{"private-address", "blah"})
    87  	c.Assert(err, gc.ErrorMatches, `unrecognized args: \["blah"\]`)
    88  }
    89  
    90  func (s *UnitGetSuite) TestNetworkInfoPrivateAddress(c *gc.C) {
    91  
    92  	// first - test with no NetworkInfoResults, should fall back
    93  	resultsEmpty := make(map[string]params.NetworkInfoResult)
    94  	resultsNoDefault := make(map[string]params.NetworkInfoResult)
    95  	resultsNoDefault["binding"] = params.NetworkInfoResult{
    96  		Info: []params.NetworkInfo{
    97  			{
    98  				MACAddress:    "00:11:22:33:44:0",
    99  				InterfaceName: "eth0",
   100  				Addresses: []params.InterfaceAddress{
   101  					{
   102  
   103  						Address: "10.20.1.42",
   104  						CIDR:    "10.20.1.42/24",
   105  					},
   106  				},
   107  			},
   108  		},
   109  	}
   110  	resultsDefaultNoAddress := make(map[string]params.NetworkInfoResult)
   111  	resultsDefaultNoAddress[""] = params.NetworkInfoResult{
   112  		Info: []params.NetworkInfo{
   113  			{
   114  				MACAddress:    "00:11:22:33:44:0",
   115  				InterfaceName: "eth0",
   116  			},
   117  		},
   118  	}
   119  	resultsDefaultAddress := make(map[string]params.NetworkInfoResult)
   120  	resultsDefaultAddress[""] = params.NetworkInfoResult{
   121  		Info: []params.NetworkInfo{
   122  			{
   123  				MACAddress:    "00:11:22:33:44:0",
   124  				InterfaceName: "eth0",
   125  				Addresses: []params.InterfaceAddress{
   126  					{
   127  						Address: "10.20.1.42",
   128  						CIDR:    "10.20.1.42/24",
   129  					},
   130  					{
   131  						Address: "fc00::1",
   132  						CIDR:    "fc00::/64",
   133  					},
   134  				},
   135  			},
   136  		},
   137  	}
   138  
   139  	resultsDefaultAddressV6 := make(map[string]params.NetworkInfoResult)
   140  	resultsDefaultAddressV6[""] = params.NetworkInfoResult{
   141  		Info: []params.NetworkInfo{
   142  			{
   143  				MACAddress:    "00:11:22:33:44:0",
   144  				InterfaceName: "eth0",
   145  				Addresses: []params.InterfaceAddress{
   146  					{
   147  						Address: "fc00::1",
   148  						CIDR:    "fc00::/64",
   149  					},
   150  				},
   151  			},
   152  		},
   153  	}
   154  
   155  	resultsResolvedHost := map[string]params.NetworkInfoResult{
   156  		"": {
   157  			Info: []params.NetworkInfo{{
   158  				MACAddress:    "00:11:22:33:44:0",
   159  				InterfaceName: "eth0",
   160  				Addresses: []params.InterfaceAddress{
   161  					{
   162  						Address:  "10.20.1.42",
   163  						Hostname: "host-name.somewhere.invalid",
   164  					},
   165  				},
   166  			}},
   167  		},
   168  	}
   169  
   170  	launchCommand := func(input map[string]params.NetworkInfoResult, expected string) {
   171  		hctx := s.GetHookContext(c, -1, "")
   172  		hctx.info.NetworkInterface.NetworkInfoResults = input
   173  		com, err := jujuc.NewCommand(hctx, "unit-get")
   174  		c.Assert(err, jc.ErrorIsNil)
   175  		ctx := cmdtesting.Context(c)
   176  		code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, []string{"private-address"})
   177  		c.Assert(code, gc.Equals, 0)
   178  		c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
   179  		c.Assert(bufferString(ctx.Stdout), gc.Equals, expected+"\n")
   180  	}
   181  
   182  	launchCommand(resultsEmpty, "192.168.0.99")
   183  	launchCommand(resultsNoDefault, "192.168.0.99")
   184  	launchCommand(resultsDefaultNoAddress, "192.168.0.99")
   185  	launchCommand(resultsDefaultAddress, "10.20.1.42")
   186  	launchCommand(resultsDefaultAddressV6, "fc00::1")
   187  	launchCommand(resultsResolvedHost, "host-name.somewhere.invalid")
   188  }