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 }