github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/network-get_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuc_test 5 6 import ( 7 "fmt" 8 "strings" 9 10 "github.com/juju/cmd/v3" 11 "github.com/juju/cmd/v3/cmdtesting" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/rpc/params" 16 "github.com/juju/juju/worker/uniter/runner/jujuc" 17 ) 18 19 type NetworkGetSuite struct { 20 ContextSuite 21 } 22 23 var _ = gc.Suite(&NetworkGetSuite{}) 24 25 func (s *NetworkGetSuite) SetUpSuite(c *gc.C) { 26 s.ContextSuite.SetUpSuite(c) 27 } 28 29 func (s *NetworkGetSuite) createCommand(c *gc.C) cmd.Command { 30 hctx := s.GetHookContext(c, -1, "") 31 32 presetBindings := make(map[string]params.NetworkInfoResult) 33 presetBindings["known-relation"] = params.NetworkInfoResult{ 34 Info: []params.NetworkInfo{ 35 { 36 MACAddress: "00:11:22:33:44:00", 37 InterfaceName: "eth0", 38 Addresses: []params.InterfaceAddress{ 39 { 40 Address: "10.10.0.23", 41 CIDR: "10.10.0.0/24", 42 }, 43 { 44 Address: "192.168.1.111", 45 CIDR: "192.168.1.0/24", 46 }, 47 }, 48 }, 49 { 50 MACAddress: "00:11:22:33:44:11", 51 InterfaceName: "eth1", 52 Addresses: []params.InterfaceAddress{ 53 { 54 Address: "10.10.1.23", 55 CIDR: "10.10.1.0/24", 56 }, 57 { 58 Address: "192.168.2.111", 59 CIDR: "192.168.2.0/24", 60 }, 61 }, 62 }, 63 }, 64 } 65 presetBindings["known-extra"] = params.NetworkInfoResult{ 66 Info: []params.NetworkInfo{ 67 { 68 MACAddress: "00:11:22:33:44:22", 69 InterfaceName: "eth2", 70 Addresses: []params.InterfaceAddress{ 71 { 72 Address: "10.20.1.42", 73 CIDR: "10.20.1.42/24", 74 }, 75 { 76 Address: "fc00::1", 77 CIDR: "fc00::/64", 78 }, 79 }, 80 }, 81 }, 82 } 83 presetBindings["valid-no-config"] = params.NetworkInfoResult{} 84 // Simulate known but unspecified bindings. 85 presetBindings["known-unbound"] = params.NetworkInfoResult{ 86 Info: []params.NetworkInfo{ 87 { 88 MACAddress: "00:11:22:33:44:33", 89 InterfaceName: "eth3", 90 Addresses: []params.InterfaceAddress{ 91 { 92 Address: "10.33.1.8", 93 CIDR: "10.33.1.8/24", 94 }, 95 }, 96 }, 97 }, 98 } 99 // Simulate info with egress and ingress data. 100 presetBindings["ingress-egress"] = params.NetworkInfoResult{ 101 Info: []params.NetworkInfo{ 102 { 103 MACAddress: "00:11:22:33:44:33", 104 InterfaceName: "eth3", 105 Addresses: []params.InterfaceAddress{ 106 { 107 Address: "10.33.1.8", 108 CIDR: "10.33.1.8/24", 109 }, 110 }, 111 }, 112 }, 113 IngressAddresses: []string{"100.1.2.3", "100.4.3.2"}, 114 EgressSubnets: []string{"192.168.1.0/8", "10.0.0.0/8"}, 115 } 116 117 hctx.info.NetworkInterface.NetworkInfoResults = presetBindings 118 119 com, err := jujuc.NewCommand(hctx, "network-get") 120 c.Assert(err, jc.ErrorIsNil) 121 return jujuc.NewJujucCommandWrappedForTest(com) 122 } 123 124 func (s *NetworkGetSuite) TestNetworkGet(c *gc.C) { 125 for i, t := range []struct { 126 summary string 127 args []string 128 code int 129 out string 130 }{{ 131 summary: "no arguments", 132 code: 2, 133 out: `no arguments specified`, 134 }, { 135 summary: "empty binding name specified", 136 code: 2, 137 args: []string{""}, 138 out: `no binding name specified`, 139 }, { 140 summary: "unknown binding given, no extra args given", 141 code: 1, 142 args: []string{"unknown"}, 143 out: `no network config found for binding "unknown"`, 144 }, { 145 summary: "unknown binding given, with additional args", 146 args: []string{"unknown", "--ingress-address"}, 147 code: 1, 148 out: `no network config found for binding "unknown"`, 149 }, { 150 summary: "API server returns no config for this binding, with --ingress-address", 151 args: []string{"valid-no-config", "--ingress-address"}, 152 code: 1, 153 out: `no network config found for binding "valid-no-config"`, 154 }, { 155 summary: "API server returns no config for this binding, no address args", 156 args: []string{"valid-no-config"}, 157 code: 1, 158 out: `no network config found for binding "valid-no-config"`, 159 }, { 160 summary: "explicitly bound, extra-binding name given with single flag arg", 161 args: []string{"known-extra", "--ingress-address"}, 162 out: "10.20.1.42", 163 }, { 164 summary: "explicitly bound, extra-binding name given with multiple flag args", 165 args: []string{"known-extra", "--ingress-address", "--bind-address"}, 166 out: ` 167 bind-address: 10.20.1.42 168 ingress-address: 10.20.1.42`[1:], 169 }, { 170 summary: "explicitly bound, extra-binding name given without extra args", 171 args: []string{"known-extra"}, 172 out: ` 173 bind-addresses: 174 - mac-address: "00:11:22:33:44:22" 175 interface-name: eth2 176 addresses: 177 - hostname: "" 178 value: 10.20.1.42 179 cidr: 10.20.1.42/24 180 address: 10.20.1.42 181 - hostname: "" 182 value: fc00::1 183 cidr: fc00::/64 184 address: fc00::1 185 macaddress: "00:11:22:33:44:22" 186 interfacename: eth2`[1:], 187 }, { 188 summary: "explicitly bound relation name given with single flag arg", 189 args: []string{"known-relation", "--ingress-address"}, 190 out: "10.10.0.23", 191 }, { 192 summary: "explicitly bound relation name given without extra args", 193 args: []string{"known-relation"}, 194 out: ` 195 bind-addresses: 196 - mac-address: "00:11:22:33:44:00" 197 interface-name: eth0 198 addresses: 199 - hostname: "" 200 value: 10.10.0.23 201 cidr: 10.10.0.0/24 202 address: 10.10.0.23 203 - hostname: "" 204 value: 192.168.1.111 205 cidr: 192.168.1.0/24 206 address: 192.168.1.111 207 macaddress: "00:11:22:33:44:00" 208 interfacename: eth0 209 - mac-address: "00:11:22:33:44:11" 210 interface-name: eth1 211 addresses: 212 - hostname: "" 213 value: 10.10.1.23 214 cidr: 10.10.1.0/24 215 address: 10.10.1.23 216 - hostname: "" 217 value: 192.168.2.111 218 cidr: 192.168.2.0/24 219 address: 192.168.2.111 220 macaddress: "00:11:22:33:44:11" 221 interfacename: eth1`[1:], 222 }, { 223 summary: "no user requested binding falls back to binding address, with ingress-address arg", 224 args: []string{"known-unbound", "--ingress-address"}, 225 out: "10.33.1.8", 226 }, { 227 summary: "no user requested binding falls back to primary address, without address args", 228 args: []string{"known-unbound"}, 229 out: ` 230 bind-addresses: 231 - mac-address: "00:11:22:33:44:33" 232 interface-name: eth3 233 addresses: 234 - hostname: "" 235 value: 10.33.1.8 236 cidr: 10.33.1.8/24 237 address: 10.33.1.8 238 macaddress: "00:11:22:33:44:33" 239 interfacename: eth3`[1:], 240 }, { 241 summary: "explicit ingress and egress information", 242 args: []string{"ingress-egress", "--ingress-address", "--bind-address", "--egress-subnets"}, 243 out: ` 244 bind-address: 10.33.1.8 245 egress-subnets: 246 - 192.168.1.0/8 247 - 10.0.0.0/8 248 ingress-address: 100.1.2.3`[1:], 249 }, { 250 summary: "explicit ingress and egress information, no extra args", 251 args: []string{"ingress-egress"}, 252 out: ` 253 bind-addresses: 254 - mac-address: "00:11:22:33:44:33" 255 interface-name: eth3 256 addresses: 257 - hostname: "" 258 value: 10.33.1.8 259 cidr: 10.33.1.8/24 260 address: 10.33.1.8 261 macaddress: "00:11:22:33:44:33" 262 interfacename: eth3 263 egress-subnets: 264 - 192.168.1.0/8 265 - 10.0.0.0/8 266 ingress-addresses: 267 - 100.1.2.3 268 - 100.4.3.2`[1:], 269 }} { 270 c.Logf("test %d: %s", i, t.summary) 271 s.testScenario(c, t.args, t.code, t.out) 272 } 273 } 274 275 func (s *NetworkGetSuite) testScenario(c *gc.C, args []string, code int, out string) { 276 ctx := cmdtesting.Context(c) 277 278 c.Check(cmd.Main(s.createCommand(c), ctx, args), gc.Equals, code) 279 280 if code == 0 { 281 c.Check(bufferString(ctx.Stderr), gc.Equals, "") 282 expect := out 283 if expect != "" { 284 expect = expect + "\n" 285 } 286 c.Check(bufferString(ctx.Stdout), gc.Equals, expect) 287 } else { 288 c.Check(bufferString(ctx.Stdout), gc.Equals, "") 289 expect := fmt.Sprintf(`(.|\n)*ERROR %s\n`, out) 290 c.Check(bufferString(ctx.Stderr), gc.Matches, expect) 291 } 292 } 293 294 func (s *NetworkGetSuite) TestHelp(c *gc.C) { 295 helpLine := `Usage: network-get [options] <binding-name> [--ingress-address] [--bind-address] [--egress-subnets]` 296 297 com := s.createCommand(c) 298 ctx := cmdtesting.Context(c) 299 code := cmd.Main(com, ctx, []string{"--help"}) 300 c.Check(code, gc.Equals, 0) 301 302 c.Check(strings.Split(bufferString(ctx.Stdout), "\n")[0], gc.Equals, helpLine) 303 c.Check(bufferString(ctx.Stderr), gc.Equals, "") 304 }