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