github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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:16.04:amd64",
    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:16.04:amd64": {
    73        "release": "trusty",
    74        "version": "16.04",
    75        "arch": "amd64",
    76        "versions": {
    77          "20160216": {
    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-16.04-amd64-server-20160216",
    86            "label": "release"
    87          }
    88        }
    89      },
    90  	"com.ubuntu.cloud:server:14.04:amd64": {
    91        "release": "trusty",
    92        "version": "14.04",
    93        "arch": "amd64",
    94        "versions": {
    95          "20140214": {
    96            "items": {
    97              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
    98                "region": "some-region",
    99                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
   100                "virt": "kvm"
   101              }
   102            },
   103            "pubname": "ubuntu-trusty-14.04-amd64-server-20140214",
   104            "label": "release"
   105          }
   106        }
   107      },
   108      "com.ubuntu.cloud:server:12.10:amd64": {
   109        "release": "quantal",
   110        "version": "12.10",
   111        "arch": "amd64",
   112        "versions": {
   113          "20140214": {
   114            "items": {
   115              "11223344-0a0a-ee88-22ab-00aa11bb22cc": {
   116                "region": "some-region",
   117                "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc",
   118                "virt": "kvm"
   119              }
   120            },
   121            "pubname": "ubuntu-quantal-12.10-amd64-server-20140214",
   122            "label": "release"
   123          }
   124        }
   125      },
   126      "com.ubuntu.cloud:server:13.04:amd64": {
   127        "release": "raring",
   128        "version": "13.04",
   129        "arch": "amd64",
   130        "versions": {
   131          "20140214": {
   132            "items": {
   133              "11223344-0a0a-dd77-33cd-abcd1234e5f6": {
   134                "region": "some-region",
   135                "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6",
   136                "virt": "kvm"
   137              }
   138            },
   139            "pubname": "ubuntu-raring-13.04-amd64-server-20140214",
   140            "label": "release"
   141          }
   142        }
   143      }
   144    }
   145  }
   146  `
   147  
   148  func parseIndexData(creds *auth.Credentials) bytes.Buffer {
   149  	var metadata bytes.Buffer
   150  
   151  	t := template.Must(template.New("").Parse(indexData))
   152  	if err := t.Execute(&metadata, creds); err != nil {
   153  		panic(fmt.Errorf("cannot generate index metdata: %v", err))
   154  	}
   155  
   156  	return metadata
   157  }
   158  
   159  // Set Metadata requests to be served by the filecontent supplied.
   160  func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) {
   161  	metadata := parseIndexData(creds)
   162  	files := map[string]string{
   163  		"/streams/v1/index.json":                            metadata.String(),
   164  		"/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData,
   165  	}
   166  	sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil)
   167  }
   168  
   169  func UnregisterExternalTestImageMetadata() {
   170  	sstesting.SetRoundTripperFiles(nil, nil)
   171  }
   172  
   173  // RegisterMachinesEndpoint creates a fake endpoint so that
   174  // machines api calls succeed.
   175  func RegisterMachinesEndpoint() {
   176  	files := map[string]string{
   177  		"/test/machines": "",
   178  	}
   179  	sstesting.SetRoundTripperFiles(files, nil)
   180  }
   181  
   182  // UnregisterMachinesEndpoint resets the machines endpoint.
   183  func UnregisterMachinesEndpoint() {
   184  	sstesting.SetRoundTripperFiles(nil, nil)
   185  }
   186  
   187  func FindInstanceSpec(
   188  	e environs.Environ, series, arch, cons string,
   189  	imageMetadata []*imagemetadata.ImageMetadata,
   190  ) (spec *instances.InstanceSpec, err error) {
   191  	env := e.(*joyentEnviron)
   192  	spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{
   193  		Series:      series,
   194  		Arches:      []string{arch},
   195  		Region:      env.Ecfg().Region(),
   196  		Constraints: constraints.MustParse(cons),
   197  	}, imageMetadata)
   198  	return
   199  }
   200  
   201  func CredentialsAttributes(attrs testing.Attrs) map[string]string {
   202  	credentialAttrs := make(map[string]string)
   203  	for _, attr := range []string{"sdc-user", "sdc-key-id", "private-key"} {
   204  		if v, ok := attrs[attr]; ok && v != "" {
   205  			credentialAttrs[attr] = fmt.Sprintf("%v", v)
   206  		}
   207  	}
   208  	return credentialAttrs
   209  }
   210  
   211  // MakeConfig creates a functional environConfig for a test.
   212  func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig {
   213  	env, err := environs.Prepare(
   214  		envtesting.BootstrapContext(c),
   215  		jujuclienttesting.NewMemStore(),
   216  		environs.PrepareParams{
   217  			BaseConfig:     attrs,
   218  			ControllerName: attrs["name"].(string),
   219  			CloudName:      "joyent",
   220  			Credential: cloud.NewCredential(
   221  				cloud.UserPassAuthType,
   222  				CredentialsAttributes(attrs),
   223  			),
   224  		},
   225  	)
   226  	c.Assert(err, jc.ErrorIsNil)
   227  	return env.(*joyentEnviron).Ecfg()
   228  }
   229  
   230  // MakeCredentials creates credentials for a test.
   231  func MakeCredentials(c *gc.C, attrs testing.Attrs) *auth.Credentials {
   232  	creds, err := credentials(MakeConfig(c, attrs))
   233  	c.Assert(err, jc.ErrorIsNil)
   234  	return creds
   235  }
   236  
   237  var GetPorts = getPorts
   238  
   239  var CreateFirewallRuleAll = createFirewallRuleAll
   240  
   241  var CreateFirewallRuleVm = createFirewallRuleVm