github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/rackspace/firewaller.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package rackspace
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/core/instance"
    10  	"github.com/juju/juju/environs"
    11  	"github.com/juju/juju/environs/context"
    12  	"github.com/juju/juju/environs/instances"
    13  	"github.com/juju/juju/network"
    14  	"github.com/juju/juju/provider/common"
    15  	"github.com/juju/juju/provider/openstack"
    16  )
    17  
    18  type firewallerFactory struct {
    19  }
    20  
    21  var _ openstack.FirewallerFactory = (*firewallerFactory)(nil)
    22  
    23  // GetFirewaller implements FirewallerFactory
    24  func (f *firewallerFactory) GetFirewaller(env environs.Environ) openstack.Firewaller {
    25  	return &rackspaceFirewaller{}
    26  }
    27  
    28  type rackspaceFirewaller struct{}
    29  
    30  var _ openstack.Firewaller = (*rackspaceFirewaller)(nil)
    31  
    32  // OpenPorts is not supported.
    33  func (c *rackspaceFirewaller) OpenPorts(ctx context.ProviderCallContext, rules []network.IngressRule) error {
    34  	return errors.NotSupportedf("OpenPorts")
    35  }
    36  
    37  // ClosePorts is not supported.
    38  func (c *rackspaceFirewaller) ClosePorts(ctx context.ProviderCallContext, rules []network.IngressRule) error {
    39  	return errors.NotSupportedf("ClosePorts")
    40  }
    41  
    42  // IngressRules returns the port ranges opened for the whole environment.
    43  // Must only be used if the environment was setup with the
    44  // FwGlobal firewall mode.
    45  func (c *rackspaceFirewaller) IngressRules(ctx context.ProviderCallContext) ([]network.IngressRule, error) {
    46  	return nil, errors.NotSupportedf("Ports")
    47  }
    48  
    49  // DeleteGroups implements OpenstackFirewaller interface.
    50  func (c *rackspaceFirewaller) DeleteGroups(ctx context.ProviderCallContext, names ...string) error {
    51  	return nil
    52  }
    53  
    54  // DeleteAllModelGroups implements OpenstackFirewaller interface.
    55  func (c *rackspaceFirewaller) DeleteAllModelGroups(ctx context.ProviderCallContext) error {
    56  	return nil
    57  }
    58  
    59  // DeleteAllControllerGroups implements OpenstackFirewaller interface.
    60  func (c *rackspaceFirewaller) DeleteAllControllerGroups(ctx context.ProviderCallContext, controllerUUID string) error {
    61  	return nil
    62  }
    63  
    64  func (c *rackspaceFirewaller) UpdateGroupController(ctx context.ProviderCallContext, controllerUUID string) error {
    65  	return nil
    66  }
    67  
    68  // GetSecurityGroups implements OpenstackFirewaller interface.
    69  func (c *rackspaceFirewaller) GetSecurityGroups(ctx context.ProviderCallContext, ids ...instance.Id) ([]string, error) {
    70  	return nil, nil
    71  }
    72  
    73  // SetUpGroups implements OpenstackFirewaller interface.
    74  func (c *rackspaceFirewaller) SetUpGroups(ctx context.ProviderCallContext, controllerUUID, machineId string, apiPort int) ([]string, error) {
    75  	return nil, nil
    76  }
    77  
    78  // OpenInstancePorts implements Firewaller interface.
    79  func (c *rackspaceFirewaller) OpenInstancePorts(ctx context.ProviderCallContext, inst instances.Instance, machineId string, rules []network.IngressRule) error {
    80  	return c.changeIngressRules(ctx, inst, true, rules)
    81  }
    82  
    83  // CloseInstancePorts implements Firewaller interface.
    84  func (c *rackspaceFirewaller) CloseInstancePorts(ctx context.ProviderCallContext, inst instances.Instance, machineId string, rules []network.IngressRule) error {
    85  	return c.changeIngressRules(ctx, inst, false, rules)
    86  }
    87  
    88  // InstanceIngressRules implements Firewaller interface.
    89  func (c *rackspaceFirewaller) InstanceIngressRules(ctx context.ProviderCallContext, inst instances.Instance, machineId string) ([]network.IngressRule, error) {
    90  	_, configurator, err := c.getInstanceConfigurator(ctx, inst)
    91  	if err != nil {
    92  		return nil, errors.Trace(err)
    93  	}
    94  	rules, err := configurator.FindIngressRules()
    95  	if err != nil {
    96  		common.HandleCredentialError(IsAuthorisationFailure, err, ctx)
    97  	}
    98  	return rules, err
    99  }
   100  
   101  func (c *rackspaceFirewaller) changeIngressRules(ctx context.ProviderCallContext, inst instances.Instance, insert bool, rules []network.IngressRule) error {
   102  	addresses, sshClient, err := c.getInstanceConfigurator(ctx, inst)
   103  	if err != nil {
   104  		return errors.Trace(err)
   105  	}
   106  
   107  	for _, addr := range addresses {
   108  		if addr.Scope == network.ScopePublic {
   109  			err = sshClient.ChangeIngressRules(addr.Value, insert, rules)
   110  			if err != nil {
   111  				common.HandleCredentialError(IsAuthorisationFailure, err, ctx)
   112  				return errors.Trace(err)
   113  			}
   114  		}
   115  	}
   116  	return nil
   117  }
   118  
   119  func (c *rackspaceFirewaller) getInstanceConfigurator(ctx context.ProviderCallContext, inst instances.Instance) ([]network.Address, common.InstanceConfigurator, error) {
   120  	addresses, err := inst.Addresses(ctx)
   121  	if err != nil {
   122  		common.HandleCredentialError(IsAuthorisationFailure, err, ctx)
   123  		return nil, nil, errors.Trace(err)
   124  	}
   125  	if len(addresses) == 0 {
   126  		return addresses, nil, errors.New("No addresses found")
   127  	}
   128  
   129  	client := common.NewSshInstanceConfigurator(addresses[0].Value)
   130  	return addresses, client, err
   131  }