github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/cloud"
    18  	"github.com/juju/juju/constraints"
    19  	"github.com/juju/juju/environs"
    20  	"github.com/juju/juju/environs/imagemetadata"
    21  	"github.com/juju/juju/environs/instances"
    22  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    23  	envtesting "github.com/juju/juju/environs/testing"
    24  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    25  	"github.com/juju/juju/testing"
    26  )
    27  
    28  // Use ShortAttempt to poll for short-term events.
    29  var ShortAttempt = utils.AttemptStrategy{
    30  	Total: 5 * time.Second,
    31  	Delay: 200 * time.Millisecond,
    32  }
    33  
    34  var Provider environs.EnvironProvider = GetProviderInstance()
    35  var EnvironmentVariables = environmentVariables
    36  
    37  var indexData = `
    38  		{
    39  		 "index": {
    40  		  "com.ubuntu.cloud:released:joyent": {
    41  		   "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    42  		   "clouds": [
    43  			{
    44  			 "region": "{{.Region}}",
    45  			 "endpoint": "{{.SdcEndpoint.URL}}"
    46  			}
    47  		   ],
    48  		   "cloudname": "joyent",
    49  		   "datatype": "image-ids",
    50  		   "format": "products:1.0",
    51  		   "products": [
    52  			"com.ubuntu.cloud:server:14.04:amd64",
    53  			"com.ubuntu.cloud:server:12.10:amd64",
    54  			"com.ubuntu.cloud:server:13.04:amd64"
    55  		   ],
    56  		   "path": "streams/v1/com.ubuntu.cloud:released:joyent.json"
    57  		  }
    58  		 },
    59  		 "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    60  		 "format": "index:1.0"
    61  		}
    62  `
    63  
    64  var imagesData = `
    65  {
    66    "content_id": "com.ubuntu.cloud:released:joyent",
    67    "format": "products:1.0",
    68    "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    69    "datatype": "image-ids",
    70    "products": {
    71      "com.ubuntu.cloud:server:14.04:amd64": {
    72        "release": "trusty",
    73        "version": "14.04",
    74        "arch": "amd64",
    75        "versions": {
    76          "20140214": {
    77            "items": {
    78              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
    79                "region": "some-region",
    80                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
    81                "virt": "kvm"
    82              }
    83            },
    84            "pubname": "ubuntu-trusty-14.04-amd64-server-20140214",
    85            "label": "release"
    86          }
    87        }
    88      },
    89      "com.ubuntu.cloud:server:12.10:amd64": {
    90        "release": "quantal",
    91        "version": "12.10",
    92        "arch": "amd64",
    93        "versions": {
    94          "20140214": {
    95            "items": {
    96              "11223344-0a0a-ee88-22ab-00aa11bb22cc": {
    97                "region": "some-region",
    98                "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc",
    99                "virt": "kvm"
   100              }
   101            },
   102            "pubname": "ubuntu-quantal-12.10-amd64-server-20140214",
   103            "label": "release"
   104          }
   105        }
   106      },
   107      "com.ubuntu.cloud:server:13.04:amd64": {
   108        "release": "raring",
   109        "version": "13.04",
   110        "arch": "amd64",
   111        "versions": {
   112          "20140214": {
   113            "items": {
   114              "11223344-0a0a-dd77-33cd-abcd1234e5f6": {
   115                "region": "some-region",
   116                "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6",
   117                "virt": "kvm"
   118              }
   119            },
   120            "pubname": "ubuntu-raring-13.04-amd64-server-20140214",
   121            "label": "release"
   122          }
   123        }
   124      }
   125    }
   126  }
   127  `
   128  
   129  func parseIndexData(creds *auth.Credentials) bytes.Buffer {
   130  	var metadata bytes.Buffer
   131  
   132  	t := template.Must(template.New("").Parse(indexData))
   133  	if err := t.Execute(&metadata, creds); err != nil {
   134  		panic(fmt.Errorf("cannot generate index metdata: %v", err))
   135  	}
   136  
   137  	return metadata
   138  }
   139  
   140  // Set Metadata requests to be served by the filecontent supplied.
   141  func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) {
   142  	metadata := parseIndexData(creds)
   143  	files := map[string]string{
   144  		"/streams/v1/index.json":                            metadata.String(),
   145  		"/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData,
   146  	}
   147  	sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil)
   148  }
   149  
   150  func UnregisterExternalTestImageMetadata() {
   151  	sstesting.SetRoundTripperFiles(nil, nil)
   152  }
   153  
   154  // RegisterMachinesEndpoint creates a fake endpoint so that
   155  // machines api calls succeed.
   156  func RegisterMachinesEndpoint() {
   157  	files := map[string]string{
   158  		"/test/machines": "",
   159  	}
   160  	sstesting.SetRoundTripperFiles(files, nil)
   161  }
   162  
   163  // UnregisterMachinesEndpoint resets the machines endpoint.
   164  func UnregisterMachinesEndpoint() {
   165  	sstesting.SetRoundTripperFiles(nil, nil)
   166  }
   167  
   168  func FindInstanceSpec(
   169  	e environs.Environ, series, arch, cons string,
   170  	imageMetadata []*imagemetadata.ImageMetadata,
   171  ) (spec *instances.InstanceSpec, err error) {
   172  	env := e.(*joyentEnviron)
   173  	spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{
   174  		Series:      series,
   175  		Arches:      []string{arch},
   176  		Region:      env.Ecfg().Region(),
   177  		Constraints: constraints.MustParse(cons),
   178  	}, imageMetadata)
   179  	return
   180  }
   181  
   182  func CredentialsAttributes(attrs testing.Attrs) map[string]string {
   183  	credentialAttrs := make(map[string]string)
   184  	for _, attr := range []string{"sdc-user", "sdc-key-id", "private-key"} {
   185  		if v, ok := attrs[attr]; ok && v != "" {
   186  			credentialAttrs[attr] = fmt.Sprintf("%v", v)
   187  		}
   188  	}
   189  	return credentialAttrs
   190  }
   191  
   192  // MakeConfig creates a functional environConfig for a test.
   193  func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig {
   194  	env, err := environs.Prepare(
   195  		envtesting.BootstrapContext(c),
   196  		jujuclienttesting.NewMemStore(),
   197  		environs.PrepareParams{
   198  			BaseConfig:     attrs,
   199  			ControllerName: attrs["name"].(string),
   200  			CloudName:      "joyent",
   201  			Credential: cloud.NewCredential(
   202  				cloud.UserPassAuthType,
   203  				CredentialsAttributes(attrs),
   204  			),
   205  		},
   206  	)
   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  var GetPorts = getPorts
   219  
   220  var CreateFirewallRuleAll = createFirewallRuleAll
   221  
   222  var CreateFirewallRuleVm = createFirewallRuleVm