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  }