github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  // DeleteAllModelGroups implements OpenstackFirewaller interface.
    59  func (c *rackspaceFirewaller) DeleteAllModelGroups() error {
    60  	return nil
    61  }
    62  
    63  // DeleteAllControllerGroups implements OpenstackFirewaller interface.
    64  func (c *rackspaceFirewaller) DeleteAllControllerGroups(controllerUUID string) error {
    65  	return nil
    66  }
    67  
    68  // GetSecurityGroups implements OpenstackFirewaller interface.
    69  func (c *rackspaceFirewaller) GetSecurityGroups(ids ...instance.Id) ([]string, error) {
    70  	return nil, nil
    71  }
    72  
    73  // SetUpGroups implements OpenstackFirewaller interface.
    74  func (c *rackspaceFirewaller) SetUpGroups(controllerUUID, machineId string, apiPort int) ([]nova.SecurityGroup, error) {
    75  	return nil, nil
    76  }
    77  
    78  // OpenInstancePorts implements Firewaller interface.
    79  func (c *rackspaceFirewaller) OpenInstancePorts(inst instance.Instance, machineId string, ports []network.PortRange) error {
    80  	return c.changePorts(inst, true, ports)
    81  }
    82  
    83  // CloseInstancePorts implements Firewaller interface.
    84  func (c *rackspaceFirewaller) CloseInstancePorts(inst instance.Instance, machineId string, ports []network.PortRange) error {
    85  	return c.changePorts(inst, false, ports)
    86  }
    87  
    88  // InstancePorts implements Firewaller interface.
    89  func (c *rackspaceFirewaller) InstancePorts(inst instance.Instance, machineId string) ([]network.PortRange, error) {
    90  	_, configurator, err := c.getInstanceConfigurator(inst)
    91  	if err != nil {
    92  		return nil, errors.Trace(err)
    93  	}
    94  	return configurator.FindOpenPorts()
    95  }
    96  
    97  func (c *rackspaceFirewaller) changePorts(inst instance.Instance, insert bool, ports []network.PortRange) error {
    98  	addresses, sshClient, err := c.getInstanceConfigurator(inst)
    99  	if err != nil {
   100  		return errors.Trace(err)
   101  	}
   102  
   103  	for _, addr := range addresses {
   104  		if addr.Scope == network.ScopePublic {
   105  			err = sshClient.ChangePorts(addr.Value, insert, ports)
   106  			if err != nil {
   107  				return errors.Trace(err)
   108  			}
   109  		}
   110  	}
   111  	return nil
   112  }
   113  
   114  func (c *rackspaceFirewaller) getInstanceConfigurator(inst instance.Instance) ([]network.Address, common.InstanceConfigurator, error) {
   115  	addresses, err := inst.Addresses()
   116  	if err != nil {
   117  		return nil, nil, errors.Trace(err)
   118  	}
   119  	if len(addresses) == 0 {
   120  		return addresses, nil, errors.New("No addresses found")
   121  	}
   122  
   123  	client := common.NewSshInstanceConfigurator(addresses[0].Value)
   124  	return addresses, client, err
   125  }