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  }