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 }