github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/joyent/series_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package joyent
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"html/template"
    10  
    11  	"github.com/joyent/gosign/auth"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/cloud"
    15  	"github.com/juju/juju/core/constraints"
    16  	"github.com/juju/juju/environs"
    17  	"github.com/juju/juju/environs/imagemetadata"
    18  	"github.com/juju/juju/environs/instances"
    19  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    20  	jc "github.com/juju/testing/checkers"
    21  )
    22  
    23  var indexData = `
    24  		{
    25  		 "index": {
    26  		  "com.ubuntu.cloud:released:joyent": {
    27  		   "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    28  		   "clouds": [
    29  			{
    30  			 "region": "{{.Region}}",
    31  			 "endpoint": "{{.SdcEndpoint.URL}}"
    32  			}
    33  		   ],
    34  		   "cloudname": "joyent",
    35  		   "datatype": "image-ids",
    36  		   "format": "products:1.0",
    37  		   "products": [
    38        "com.ubuntu.cloud:server:18.04:amd64",
    39  			"com.ubuntu.cloud:server:16.04:amd64",
    40  			"com.ubuntu.cloud:server:14.04:amd64",
    41  			"com.ubuntu.cloud:server:12.10:amd64",
    42  			"com.ubuntu.cloud:server:13.04:amd64"
    43  		   ],
    44  		   "path": "streams/v1/com.ubuntu.cloud:released:joyent.json"
    45  		  }
    46  		 },
    47  		 "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    48  		 "format": "index:1.0"
    49  		}
    50  `
    51  
    52  var imagesData = `
    53  {
    54    "content_id": "com.ubuntu.cloud:released:joyent",
    55    "format": "products:1.0",
    56    "updated": "Fri, 14 Feb 2014 13:39:35 +0000",
    57    "datatype": "image-ids",
    58    "products": {
    59      "com.ubuntu.cloud:server:18.04:amd64": {
    60        "release": "trusty",
    61        "version": "18.04",
    62        "arch": "amd64",
    63        "versions": {
    64          "20160216": {
    65            "items": {
    66              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
    67                "region": "some-region",
    68                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
    69                "virt": "kvm"
    70              }
    71            },
    72            "pubname": "ubuntu-trusty-16.04-amd64-server-20160216",
    73            "label": "release"
    74          }
    75        }
    76      },
    77      "com.ubuntu.cloud:server:16.04:amd64": {
    78        "release": "trusty",
    79        "version": "16.04",
    80        "arch": "amd64",
    81        "versions": {
    82          "20160216": {
    83            "items": {
    84              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
    85                "region": "some-region",
    86                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
    87                "virt": "kvm"
    88              }
    89            },
    90            "pubname": "ubuntu-trusty-16.04-amd64-server-20160216",
    91            "label": "release"
    92          }
    93        }
    94      },
    95  	"com.ubuntu.cloud:server:14.04:amd64": {
    96        "release": "trusty",
    97        "version": "14.04",
    98        "arch": "amd64",
    99        "versions": {
   100          "20140214": {
   101            "items": {
   102              "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": {
   103                "region": "some-region",
   104                "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f",
   105                "virt": "kvm"
   106              }
   107            },
   108            "pubname": "ubuntu-trusty-14.04-amd64-server-20140214",
   109            "label": "release"
   110          }
   111        }
   112      },
   113      "com.ubuntu.cloud:server:12.10:amd64": {
   114        "release": "quantal",
   115        "version": "12.10",
   116        "arch": "amd64",
   117        "versions": {
   118          "20140214": {
   119            "items": {
   120              "11223344-0a0a-ee88-22ab-00aa11bb22cc": {
   121                "region": "some-region",
   122                "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc",
   123                "virt": "kvm"
   124              }
   125            },
   126            "pubname": "ubuntu-quantal-12.10-amd64-server-20140214",
   127            "label": "release"
   128          }
   129        }
   130      },
   131      "com.ubuntu.cloud:server:13.04:amd64": {
   132        "release": "raring",
   133        "version": "13.04",
   134        "arch": "amd64",
   135        "versions": {
   136          "20140214": {
   137            "items": {
   138              "11223344-0a0a-dd77-33cd-abcd1234e5f6": {
   139                "region": "some-region",
   140                "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6",
   141                "virt": "kvm"
   142              }
   143            },
   144            "pubname": "ubuntu-raring-13.04-amd64-server-20140214",
   145            "label": "release"
   146          }
   147        }
   148      }
   149    }
   150  }
   151  `
   152  
   153  func parseIndexData(creds *auth.Credentials) bytes.Buffer {
   154  	var metadata bytes.Buffer
   155  
   156  	t := template.Must(template.New("").Parse(indexData))
   157  	if err := t.Execute(&metadata, creds); err != nil {
   158  		panic(fmt.Errorf("cannot generate index metdata: %v", err))
   159  	}
   160  
   161  	return metadata
   162  }
   163  
   164  // Set Metadata requests to be served by the filecontent supplied.
   165  func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) {
   166  	metadata := parseIndexData(creds)
   167  	files := map[string]string{
   168  		"/streams/v1/index.json":                            metadata.String(),
   169  		"/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData,
   170  	}
   171  	sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil)
   172  }
   173  
   174  func UnregisterExternalTestImageMetadata() {
   175  	sstesting.SetRoundTripperFiles(nil, nil)
   176  }
   177  
   178  // RegisterMachinesEndpoint creates a fake endpoint so that
   179  // machines api calls succeed.
   180  func RegisterMachinesEndpoint() {
   181  	files := map[string]string{
   182  		"/test/machines": "",
   183  	}
   184  	sstesting.SetRoundTripperFiles(files, nil)
   185  }
   186  
   187  // UnregisterMachinesEndpoint resets the machines endpoint.
   188  func UnregisterMachinesEndpoint() {
   189  	sstesting.SetRoundTripperFiles(nil, nil)
   190  }
   191  
   192  func FindInstanceSpec(
   193  	e environs.Environ, series, arch, cons string,
   194  	imageMetadata []*imagemetadata.ImageMetadata,
   195  ) (spec *instances.InstanceSpec, err error) {
   196  	env := e.(*joyentEnviron)
   197  	spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{
   198  		Series:      series,
   199  		Arches:      []string{arch},
   200  		Region:      env.cloud.Region,
   201  		Constraints: constraints.MustParse(cons),
   202  	}, imageMetadata)
   203  	return
   204  }
   205  
   206  // MakeCredentials creates credentials for a test.
   207  func MakeCredentials(c *gc.C, endpoint string, cloudCredential cloud.Credential) *auth.Credentials {
   208  	creds, err := credentials(environs.CloudSpec{
   209  		Endpoint:   endpoint,
   210  		Credential: &cloudCredential,
   211  	})
   212  	c.Assert(err, jc.ErrorIsNil)
   213  	return creds
   214  }