github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/jujuctesting/networking.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuctesting 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/core/network" 12 "github.com/juju/juju/rpc/params" 13 ) 14 15 // NetworkInterface holds the values for the hook context. 16 type NetworkInterface struct { 17 PublicAddress string 18 PrivateAddress string 19 PortRangesByEndpoint network.GroupedPortRanges 20 NetworkInfoResults map[string]params.NetworkInfoResult 21 } 22 23 // CheckPorts checks the current ports. 24 func (ni *NetworkInterface) CheckPortRanges(c *gc.C, expected network.GroupedPortRanges) { 25 c.Check(ni.PortRangesByEndpoint, jc.DeepEquals, expected) 26 } 27 28 // AddPortRanges adds the specified port range. 29 func (ni *NetworkInterface) AddPortRange(endpoint string, portRange network.PortRange) { 30 if ni.PortRangesByEndpoint == nil { 31 ni.PortRangesByEndpoint = make(network.GroupedPortRanges) 32 } 33 ni.PortRangesByEndpoint[endpoint] = append(ni.PortRangesByEndpoint[endpoint], portRange) 34 network.SortPortRanges(ni.PortRangesByEndpoint[endpoint]) 35 } 36 37 // RemovePortRange removes the specified port range. 38 func (ni *NetworkInterface) RemovePortRange(endpoint string, portRange network.PortRange) { 39 if ni.PortRangesByEndpoint == nil { 40 return 41 } 42 43 for i, existingPortRange := range ni.PortRangesByEndpoint[endpoint] { 44 if existingPortRange == portRange { 45 ni.PortRangesByEndpoint[endpoint] = append(ni.PortRangesByEndpoint[endpoint][:i], ni.PortRangesByEndpoint[endpoint][i+1:]...) 46 break 47 } 48 } 49 network.SortPortRanges(ni.PortRangesByEndpoint[endpoint]) 50 } 51 52 // ContextNetworking is a test double for jujuc.ContextNetworking. 53 type ContextNetworking struct { 54 contextBase 55 info *NetworkInterface 56 } 57 58 // PublicAddress implements jujuc.ContextNetworking. 59 func (c *ContextNetworking) PublicAddress() (string, error) { 60 c.stub.AddCall("PublicAddress") 61 62 return c.info.PublicAddress, c.stub.NextErr() 63 64 } 65 66 // PrivateAddress implements jujuc.ContextNetworking. 67 func (c *ContextNetworking) PrivateAddress() (string, error) { 68 c.stub.AddCall("PrivateAddress") 69 70 return c.info.PrivateAddress, c.stub.NextErr() 71 72 } 73 74 // OpenPortRange implements jujuc.ContextNetworking. 75 func (c *ContextNetworking) OpenPortRange(endpoint string, portRange network.PortRange) error { 76 c.stub.AddCall("OpenPortRange", endpoint, portRange) 77 if err := c.stub.NextErr(); err != nil { 78 return errors.Trace(err) 79 } 80 81 c.info.AddPortRange(endpoint, portRange) 82 return nil 83 } 84 85 // ClosePortRange implements jujuc.ContextNetworking. 86 func (c *ContextNetworking) ClosePortRange(endpoint string, portRange network.PortRange) error { 87 c.stub.AddCall("ClosePortRange", endpoint, portRange) 88 if err := c.stub.NextErr(); err != nil { 89 return errors.Trace(err) 90 } 91 92 c.info.RemovePortRange(endpoint, portRange) 93 return nil 94 } 95 96 // OpenedPortRanges implements jujuc.ContextNetworking. 97 func (c *ContextNetworking) OpenedPortRanges() network.GroupedPortRanges { 98 c.stub.AddCall("OpenedPortRanges") 99 _ = c.stub.NextErr() 100 101 return c.info.PortRangesByEndpoint 102 } 103 104 // NetworkInfo implements jujuc.ContextNetworking. 105 func (c *ContextNetworking) NetworkInfo(bindingNames []string, relationId int) (map[string]params.NetworkInfoResult, error) { 106 c.stub.AddCall("NetworkInfo", bindingNames, relationId) 107 if err := c.stub.NextErr(); err != nil { 108 return nil, errors.Trace(err) 109 } 110 111 return c.info.NetworkInfoResults, nil 112 }