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  }