github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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  	"gopkg.in/goose.v1/nova"
     9  
    10  	"github.com/juju/juju/environs"
    11  	"github.com/juju/juju/instance"
    12  	"github.com/juju/juju/network"
    13  	"github.com/juju/juju/provider/common"
    14  	"github.com/juju/juju/provider/openstack"
    15  )
    16  
    17  type firewallerFactory struct {
    18  }
    19  
    20  var _ openstack.FirewallerFactory = (*firewallerFactory)(nil)
    21  
    22  // GetFirewaller implements FirewallerFactory
    23  func (f *firewallerFactory) GetFirewaller(env environs.Environ) openstack.Firewaller {
    24  	return &rackspaceFirewaller{}
    25  }
    26  
    27  type rackspaceFirewaller struct{}
    28  
    29  var _ openstack.Firewaller = (*rackspaceFirewaller)(nil)
    30  
    31  // InitialNetworks implements Firewaller interface.
    32  func (c *rackspaceFirewaller) InitialNetworks() []nova.ServerNetworks {
    33  	// These are the default rackspace networks, see:
    34  	// http://docs.rackspace.com/servers/api/v2/cs-devguide/content/provision_server_with_networks.html
    35  	return []nova.ServerNetworks{
    36  		{NetworkId: "00000000-0000-0000-0000-000000000000"}, //Racksapce PublicNet
    37  		{NetworkId: "11111111-1111-1111-1111-111111111111"}, //Rackspace ServiceNet
    38  	}
    39  }
    40  
    41  // OpenPorts is not supported.
    42  func (c *rackspaceFirewaller) OpenPorts(ports []network.PortRange) error {
    43  	return errors.NotSupportedf("OpenPorts")
    44  }
    45  
    46  // ClosePorts is not supported.
    47  func (c *rackspaceFirewaller) ClosePorts(ports []network.PortRange) error {
    48  	return errors.NotSupportedf("ClosePorts")
    49  }
    50  
    51  // Ports returns the port ranges opened for the whole environment.
    52  // Must only be used if the environment was setup with the
    53  // FwGlobal firewall mode.
    54  func (c *rackspaceFirewaller) Ports() ([]network.PortRange, error) {
    55  	return nil, errors.NotSupportedf("Ports")
    56  }
    57  
    58  // DeleteAllGroups implements OpenstackFirewaller interface.
    59  func (c *rackspaceFirewaller) DeleteAllGroups() error {
    60  	return nil
    61  }
    62  
    63  // GetSecurityGroups implements OpenstackFirewaller interface.
    64  func (c *rackspaceFirewaller) GetSecurityGroups(ids ...instance.Id) ([]string, error) {
    65  	return nil, nil
    66  }
    67  
    68  // SetUpGroups implements OpenstackFirewaller interface.
    69  func (c *rackspaceFirewaller) SetUpGroups(machineId string, apiPort int) ([]nova.SecurityGroup, error) {
    70  	return nil, nil
    71  }
    72  
    73  // OpenInstancePorts implements Firewaller interface.
    74  func (c *rackspaceFirewaller) OpenInstancePorts(inst instance.Instance, machineId string, ports []network.PortRange) error {
    75  	return c.changePorts(inst, true, ports)
    76  }
    77  
    78  // CloseInstancePorts implements Firewaller interface.
    79  func (c *rackspaceFirewaller) CloseInstancePorts(inst instance.Instance, machineId string, ports []network.PortRange) error {
    80  	return c.changePorts(inst, false, ports)
    81  }
    82  
    83  // InstancePorts implements Firewaller interface.
    84  func (c *rackspaceFirewaller) InstancePorts(inst instance.Instance, machineId string) ([]network.PortRange, error) {
    85  	_, configurator, err := c.getInstanceConfigurator(inst)
    86  	if err != nil {
    87  		return nil, errors.Trace(err)
    88  	}
    89  	return configurator.FindOpenPorts()
    90  }
    91  
    92  func (c *rackspaceFirewaller) changePorts(inst instance.Instance, insert bool, ports []network.PortRange) error {
    93  	addresses, sshClient, err := c.getInstanceConfigurator(inst)
    94  	if err != nil {
    95  		return errors.Trace(err)
    96  	}
    97  
    98  	for _, addr := range addresses {
    99  		if addr.Scope == network.ScopePublic {
   100  			err = sshClient.ChangePorts(addr.Value, insert, ports)
   101  			if err != nil {
   102  				return errors.Trace(err)
   103  			}
   104  		}
   105  	}
   106  	return nil
   107  }
   108  
   109  func (c *rackspaceFirewaller) getInstanceConfigurator(inst instance.Instance) ([]network.Address, common.InstanceConfigurator, error) {
   110  	addresses, err := inst.Addresses()
   111  	if err != nil {
   112  		return nil, nil, errors.Trace(err)
   113  	}
   114  	if len(addresses) == 0 {
   115  		return addresses, nil, errors.New("No addresses found")
   116  	}
   117  
   118  	client := common.NewSshInstanceConfigurator(addresses[0].Value)
   119  	return addresses, client, err
   120  }