github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/ports_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  	"github.com/juju/cmd/v3"
     9  	"github.com/juju/cmd/v3/cmdtesting"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/core/network"
    14  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    15  )
    16  
    17  type PortsSuite struct {
    18  	ContextSuite
    19  }
    20  
    21  var _ = gc.Suite(&PortsSuite{})
    22  
    23  var portsTests = []struct {
    24  	cmd    []string
    25  	expect network.GroupedPortRanges
    26  }{
    27  	{[]string{"open-port", "80"}, makeAllEndpointsRanges("80/tcp")},
    28  	{[]string{"open-port", "99/tcp"}, makeAllEndpointsRanges("80/tcp", "99/tcp")},
    29  	{[]string{"open-port", "100-200"}, makeAllEndpointsRanges("80/tcp", "99/tcp", "100-200/tcp")},
    30  	{[]string{"open-port", "443/udp"}, makeAllEndpointsRanges("80/tcp", "99/tcp", "100-200/tcp", "443/udp")},
    31  	{[]string{"close-port", "80/TCP"}, makeAllEndpointsRanges("99/tcp", "100-200/tcp", "443/udp")},
    32  	{[]string{"close-port", "100-200/tcP"}, makeAllEndpointsRanges("99/tcp", "443/udp")},
    33  	{[]string{"close-port", "443"}, makeAllEndpointsRanges("99/tcp", "443/udp")},
    34  	{[]string{"close-port", "443/udp"}, makeAllEndpointsRanges("99/tcp")},
    35  	{[]string{"open-port", "123/udp"}, makeAllEndpointsRanges("99/tcp", "123/udp")},
    36  	{[]string{"close-port", "9999/UDP"}, makeAllEndpointsRanges("99/tcp", "123/udp")},
    37  	{[]string{"open-port", "icmp"}, makeAllEndpointsRanges("icmp", "99/tcp", "123/udp")},
    38  	// Tests with --endpoints.
    39  	{[]string{"open-port", "--endpoints", "foo,bar", "1337/tcp"}, network.GroupedPortRanges{
    40  		// Pre-existing ports from previous tests
    41  		"": []network.PortRange{
    42  			network.MustParsePortRange("icmp"),
    43  			network.MustParsePortRange("99/tcp"),
    44  			network.MustParsePortRange("123/udp"),
    45  		},
    46  		// Endpoint-specific ports
    47  		"foo": []network.PortRange{network.MustParsePortRange("1337/tcp")},
    48  		"bar": []network.PortRange{network.MustParsePortRange("1337/tcp")},
    49  	}},
    50  	{[]string{"close-port", "--endpoints", "foo", "1337/tcp"}, network.GroupedPortRanges{
    51  		"": []network.PortRange{
    52  			network.MustParsePortRange("icmp"),
    53  			network.MustParsePortRange("99/tcp"),
    54  			network.MustParsePortRange("123/udp"),
    55  		},
    56  		"foo": []network.PortRange{
    57  			// Removed
    58  		},
    59  		"bar": []network.PortRange{network.MustParsePortRange("1337/tcp")},
    60  	}},
    61  }
    62  
    63  func makeAllEndpointsRanges(stringRanges ...string) network.GroupedPortRanges {
    64  	var results []network.PortRange
    65  	for _, s := range stringRanges {
    66  		results = append(results, network.MustParsePortRange(s))
    67  	}
    68  	network.SortPortRanges(results)
    69  	return network.GroupedPortRanges{
    70  		"": results,
    71  	}
    72  }
    73  
    74  func (s *PortsSuite) TestOpenClose(c *gc.C) {
    75  	hctx := s.GetHookContext(c, -1, "")
    76  	for _, t := range portsTests {
    77  		com, err := jujuc.NewCommand(hctx, t.cmd[0])
    78  		c.Assert(err, jc.ErrorIsNil)
    79  		ctx := cmdtesting.Context(c)
    80  		code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, t.cmd[1:])
    81  		c.Check(code, gc.Equals, 0)
    82  		c.Assert(bufferString(ctx.Stdout), gc.Equals, "")
    83  		c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
    84  		hctx.info.CheckPortRanges(c, t.expect)
    85  	}
    86  }
    87  
    88  func (s *PortsSuite) TestHelp(c *gc.C) {
    89  	hctx := s.GetHookContext(c, -1, "")
    90  	open, err := jujuc.NewCommand(hctx, "open-port")
    91  	c.Assert(err, jc.ErrorIsNil)
    92  	flags := cmdtesting.NewFlagSet()
    93  	c.Assert(string(open.Info().Help(flags)), gc.Equals, `
    94  Usage: open-port <port>[/<protocol>] or <from>-<to>[/<protocol>] or icmp
    95  
    96  Summary:
    97  register a request to open a port or port range
    98  
    99  Details:
   100  open-port registers a request to open the specified port or port range.
   101  
   102  By default, the specified port or port range will be opened for all defined
   103  application endpoints. The --endpoints option can be used to constrain the
   104  open request to a comma-delimited list of application endpoints.
   105  `[1:])
   106  
   107  	close, err := jujuc.NewCommand(hctx, "close-port")
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	c.Assert(string(close.Info().Help(flags)), gc.Equals, `
   110  Usage: close-port <port>[/<protocol>] or <from>-<to>[/<protocol>] or icmp
   111  
   112  Summary:
   113  register a request to close a port or port range
   114  
   115  Details:
   116  close-port registers a request to close the specified port or port range.
   117  
   118  By default, the specified port or port range will be closed for all defined
   119  application endpoints. The --endpoints option can be used to constrain the
   120  close request to a comma-delimited list of application endpoints.
   121  `[1:])
   122  }
   123  
   124  // Since the deprecation warning gets output during Run, we really need
   125  // some valid commands to run
   126  var portsFormatDeprecationTests = []struct {
   127  	cmd []string
   128  }{
   129  	{[]string{"open-port", "--format", "foo", "80"}},
   130  	{[]string{"close-port", "--format", "foo", "80/TCP"}},
   131  }
   132  
   133  func (s *PortsSuite) TestOpenCloseDeprecation(c *gc.C) {
   134  	hctx := s.GetHookContext(c, -1, "")
   135  	for _, t := range portsFormatDeprecationTests {
   136  		name := t.cmd[0]
   137  		com, err := jujuc.NewCommand(hctx, name)
   138  		c.Assert(err, jc.ErrorIsNil)
   139  		ctx := cmdtesting.Context(c)
   140  		code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, t.cmd[1:])
   141  		c.Assert(code, gc.Equals, 0)
   142  		c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   143  		c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "--format flag deprecated for command \""+name+"\"")
   144  	}
   145  }