github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/cloud/providers/factory.go (about)

     1  package providers
     2  
     3  import (
     4  	"github.com/evergreen-ci/evergreen"
     5  	"github.com/evergreen-ci/evergreen/cloud"
     6  	"github.com/evergreen-ci/evergreen/cloud/providers/digitalocean"
     7  	"github.com/evergreen-ci/evergreen/cloud/providers/docker"
     8  	"github.com/evergreen-ci/evergreen/cloud/providers/ec2"
     9  	"github.com/evergreen-ci/evergreen/cloud/providers/mock"
    10  	"github.com/evergreen-ci/evergreen/cloud/providers/static"
    11  	"github.com/evergreen-ci/evergreen/model/host"
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  // GetCloudManager returns an implementation of CloudManager for the given provider name.
    16  // It returns an error if the provider name doesn't have a known implementation.
    17  func GetCloudManager(providerName string, settings *evergreen.Settings) (cloud.CloudManager, error) {
    18  
    19  	var provider cloud.CloudManager
    20  	switch providerName {
    21  	case static.ProviderName:
    22  		provider = &static.StaticManager{}
    23  	case mock.ProviderName:
    24  		provider = mock.FetchMockProvider()
    25  	case digitalocean.ProviderName:
    26  		provider = &digitalocean.DigitalOceanManager{}
    27  	case ec2.OnDemandProviderName:
    28  		provider = &ec2.EC2Manager{}
    29  	case ec2.SpotProviderName:
    30  		provider = &ec2.EC2SpotManager{}
    31  	case docker.ProviderName:
    32  		provider = &docker.DockerManager{}
    33  	default:
    34  		return nil, errors.Errorf("No known provider for '%v'", providerName)
    35  	}
    36  
    37  	if err := provider.Configure(settings); err != nil {
    38  		return nil, errors.Wrap(err, "Failed to configure cloud provider")
    39  	}
    40  
    41  	return provider, nil
    42  }
    43  
    44  // GetCloudHost returns an instance of CloudHost wrapping the given model.Host,
    45  // giving access to the provider-specific methods to manipulate on the host.
    46  func GetCloudHost(host *host.Host, settings *evergreen.Settings) (*cloud.CloudHost, error) {
    47  	mgr, err := GetCloudManager(host.Provider, settings)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	keyPath := ""
    53  	if host.Distro.SSHKey != "" {
    54  		keyPath = settings.Keys[host.Distro.SSHKey]
    55  	}
    56  	return &cloud.CloudHost{host, keyPath, mgr}, nil
    57  }