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 }