github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/joyent/export_test.go (about)

     1  // Copyright 2013 Joyent Inc.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package joyent
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"text/template"
    10  	"time"
    11  
    12  	"github.com/joyent/gosign/auth"
    13  	jc "github.com/juju/testing/checkers"
    14  	"github.com/juju/utils"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/constraints"
    18  	"github.com/juju/juju/environs"
    19  	"github.com/juju/juju/environs/config"
    20  	"github.com/juju/juju/environs/configstore"
    21  	"github.com/juju/juju/environs/imagemetadata"
    22  	"github.com/juju/juju/environs/instances"
    23  	"github.com/juju/juju/environs/jujutest"
    24  	"github.com/juju/juju/environs/storage"
    25  	envtesting "github.com/juju/juju/environs/testing"
    26  	"github.com/juju/juju/testing"
    27  )
    28  
    29  // Use ShortAttempt to poll for short-term events.
    30  var ShortAttempt = utils.AttemptStrategy{
    31  	Total: 5 * time.Second,
    32  	Delay: 200 * time.Millisecond,
    33  }
    34  
    35  var Provider environs.EnvironProvider = GetProviderInstance()
    36  var EnvironmentVariables = environmentVariables
    37  
    38  var indexData = `
    39  		{
    40  		 "index": {
    41  		  "com.ubuntu.cloud:released:joyent": {
    42  		   "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    43  		   "clouds": [
    44  			{
    45  			 "region": "{{.Region}}",
    46  			 "endpoint": "{{.SdcEndpoint.URL}}"
    47  			}
    48  		   ],
    49  		   "cloudname": "joyent",
    50  		   "datatype": "image-ids",
    51  		   "format": "products:1.0",
    52  		   "products": [
    53  			"com.ubuntu.cloud:server:14.04:amd64",
    54  			"com.ubuntu.cloud:server:12.10:amd64",
    55  			"com.ubuntu.cloud:server:13.04:amd64"
    56  		   ],
    57  		   "path": "streams/v1/com.ubuntu.cloud:released:joyent.json"
    58  		  }
    59  		 },
    60  		 "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    61  		 "format": "index:1.0"
    62  		}
    63  `
    64  
    65  var imagesData = `
    66  {
    67    "content_id": "com.ubuntu.cloud:released:joyent",
    68    "format": "products:1.0",
    69    "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    70    "datatype": "image-ids",
    71    "products": {
    72      "com.ubuntu.cloud:server:14.04:amd64": {
    73        "release": "trusty",
    74        "version": "14.04",
    75        "arch": "amd64",
    76        "versions": {
    77          "20140214": {
    78            "items": {
    79              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
    80                "region": "some-region",
    81                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
    82                "virt": "kvm"
    83              }
    84            },
    85            "pubname": "ubuntu-trusty-14.04-amd64-server-20140214",
    86            "label": "release"
    87          }
    88        }
    89      },
    90      "com.ubuntu.cloud:server:12.10:amd64": {
    91        "release": "quantal",
    92        "version": "12.10",
    93        "arch": "amd64",
    94        "versions": {
    95          "20140214": {
    96            "items": {
    97              "11223344-0a0a-ee88-22ab-00aa11bb22cc": {
    98                "region": "some-region",
    99                "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc",
   100                "virt": "kvm"
   101              }
   102            },
   103            "pubname": "ubuntu-quantal-12.10-amd64-server-20140214",
   104            "label": "release"
   105          }
   106        }
   107      },
   108      "com.ubuntu.cloud:server:13.04:amd64": {
   109        "release": "raring",
   110        "version": "13.04",
   111        "arch": "amd64",
   112        "versions": {
   113          "20140214": {
   114            "items": {
   115              "11223344-0a0a-dd77-33cd-abcd1234e5f6": {
   116                "region": "some-region",
   117                "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6",
   118                "virt": "kvm"
   119              }
   120            },
   121            "pubname": "ubuntu-raring-13.04-amd64-server-20140214",
   122            "label": "release"
   123          }
   124        }
   125      }
   126    }
   127  }
   128  `
   129  
   130  func parseIndexData(creds *auth.Credentials) bytes.Buffer {
   131  	var metadata bytes.Buffer
   132  
   133  	t := template.Must(template.New("").Parse(indexData))
   134  	if err := t.Execute(&metadata, creds); err != nil {
   135  		panic(fmt.Errorf("cannot generate index metdata: %v", err))
   136  	}
   137  
   138  	return metadata
   139  }
   140  
   141  // This provides the content for code accessing test://host/... URLs. This allows
   142  // us to set the responses for things like the Metadata server, by pointing
   143  // metadata requests at test://host/...
   144  var testRoundTripper = &jujutest.ProxyRoundTripper{}
   145  
   146  func init() {
   147  	testRoundTripper.RegisterForScheme("test")
   148  }
   149  
   150  var origImagesUrl = imagemetadata.DefaultBaseURL
   151  
   152  // Set Metadata requests to be served by the filecontent supplied.
   153  func UseExternalTestImageMetadata(creds *auth.Credentials) {
   154  	metadata := parseIndexData(creds)
   155  	files := map[string]string{
   156  		"/streams/v1/index.json":                            metadata.String(),
   157  		"/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData,
   158  	}
   159  	testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil)
   160  	imagemetadata.DefaultBaseURL = "test://host"
   161  }
   162  
   163  func UnregisterExternalTestImageMetadata() {
   164  	testRoundTripper.Sub = nil
   165  	imagemetadata.DefaultBaseURL = origImagesUrl
   166  }
   167  
   168  // RegisterMachinesEndpoint creates a fake endpoint so that
   169  // machines api calls succeed.
   170  func RegisterMachinesEndpoint() {
   171  	files := map[string]string{
   172  		"/test/machines": "",
   173  	}
   174  	testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil)
   175  }
   176  
   177  // UnregisterMachinesEndpoint resets the machines endpoint.
   178  func UnregisterMachinesEndpoint() {
   179  	testRoundTripper.Sub = nil
   180  }
   181  
   182  func FindInstanceSpec(e environs.Environ, series, arch, cons string) (spec *instances.InstanceSpec, err error) {
   183  	env := e.(*joyentEnviron)
   184  	spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{
   185  		Series:      series,
   186  		Arches:      []string{arch},
   187  		Region:      env.Ecfg().Region(),
   188  		Constraints: constraints.MustParse(cons),
   189  	})
   190  	return
   191  }
   192  
   193  func ControlBucketName(e environs.Environ) string {
   194  	env := e.(*joyentEnviron)
   195  	return env.Storage().(*JoyentStorage).GetContainerName()
   196  }
   197  
   198  func CreateContainer(s *JoyentStorage) error {
   199  	return s.createContainer()
   200  }
   201  
   202  // MakeConfig creates a functional environConfig for a test.
   203  func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig {
   204  	cfg, err := config.New(config.NoDefaults, attrs)
   205  	c.Assert(err, jc.ErrorIsNil)
   206  	env, err := environs.Prepare(cfg, envtesting.BootstrapContext(c), configstore.NewMem())
   207  	c.Assert(err, jc.ErrorIsNil)
   208  	return env.(*joyentEnviron).Ecfg()
   209  }
   210  
   211  // MakeCredentials creates credentials for a test.
   212  func MakeCredentials(c *gc.C, attrs testing.Attrs) *auth.Credentials {
   213  	creds, err := credentials(MakeConfig(c, attrs))
   214  	c.Assert(err, jc.ErrorIsNil)
   215  	return creds
   216  }
   217  
   218  // MakeStorage creates an env storage for a test.
   219  func MakeStorage(c *gc.C, attrs testing.Attrs) storage.Storage {
   220  	stor, err := newStorage(MakeConfig(c, attrs), "")
   221  	c.Assert(err, jc.ErrorIsNil)
   222  	return stor
   223  }
   224  
   225  var GetPorts = getPorts
   226  
   227  var CreateFirewallRuleAll = createFirewallRuleAll
   228  
   229  var CreateFirewallRuleVm = createFirewallRuleVm