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 }