github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/rackspace/environ.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 "io/ioutil" 8 "os" 9 "time" 10 11 "github.com/juju/errors" 12 13 "github.com/juju/juju/cloudconfig/instancecfg" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/config" 16 "github.com/juju/juju/provider/common" 17 "github.com/juju/juju/state/multiwatcher" 18 jujuos "github.com/juju/utils/os" 19 "github.com/juju/utils/series" 20 "github.com/juju/utils/ssh" 21 ) 22 23 type environ struct { 24 environs.Environ 25 } 26 27 var bootstrap = common.Bootstrap 28 29 // Bootstrap implements environs.Environ. 30 func (e environ) Bootstrap(ctx environs.BootstrapContext, params environs.BootstrapParams) (*environs.BootstrapResult, error) { 31 // can't redirect to openstack provider as ussually, because correct environ should be passed for common.Bootstrap 32 return bootstrap(ctx, e, params) 33 } 34 35 func isController(mcfg *instancecfg.InstanceConfig) bool { 36 return multiwatcher.AnyJobNeedsState(mcfg.Jobs...) 37 } 38 39 var waitSSH = common.WaitSSH 40 41 // StartInstance implements environs.Environ. 42 func (e environ) StartInstance(args environs.StartInstanceParams) (*environs.StartInstanceResult, error) { 43 osString, err := series.GetOSFromSeries(args.Tools.OneSeries()) 44 if err != nil { 45 return nil, errors.Trace(err) 46 } 47 fwmode := e.Config().FirewallMode() 48 if osString == jujuos.Windows && fwmode != config.FwNone { 49 return nil, errors.Errorf("rackspace provider doesn't support firewalls for windows instances") 50 51 } 52 r, err := e.Environ.StartInstance(args) 53 if err != nil { 54 return nil, errors.Trace(err) 55 } 56 if fwmode != config.FwNone { 57 interrupted := make(chan os.Signal, 1) 58 timeout := config.SSHTimeoutOpts{ 59 Timeout: time.Minute * 5, 60 RetryDelay: time.Second * 5, 61 AddressesDelay: time.Second * 20, 62 } 63 addr, err := waitSSH(ioutil.Discard, interrupted, ssh.DefaultClient, common.GetCheckNonceCommand(args.InstanceConfig), &common.RefreshableInstance{r.Instance, e}, timeout) 64 if err != nil { 65 return nil, errors.Trace(err) 66 } 67 client := newInstanceConfigurator(addr) 68 apiPort := 0 69 if isController(args.InstanceConfig) { 70 apiPort = args.InstanceConfig.StateServingInfo.APIPort 71 } 72 err = client.DropAllPorts([]int{apiPort, 22}, addr) 73 if err != nil { 74 return nil, errors.Trace(err) 75 } 76 } 77 return r, nil 78 } 79 80 var newInstanceConfigurator = common.NewSshInstanceConfigurator 81 82 // Provider implements environs.Environ. 83 func (e environ) Provider() environs.EnvironProvider { 84 return providerInstance 85 }