github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/imagemetadata/updatefrompublished_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/cmd/envcmd"
    11  	"github.com/juju/juju/environs"
    12  	"github.com/juju/juju/environs/config"
    13  	"github.com/juju/juju/environs/configstore"
    14  	"github.com/juju/juju/environs/imagemetadata"
    15  	"github.com/juju/juju/environs/jujutest"
    16  	"github.com/juju/juju/provider/dummy"
    17  	"github.com/juju/juju/state/cloudimagemetadata"
    18  	"github.com/juju/juju/testing"
    19  )
    20  
    21  var (
    22  	testRoundTripper = &jujutest.ProxyRoundTripper{}
    23  )
    24  
    25  func init() {
    26  	// Prepare mock http transport for overriding metadata and images output in tests.
    27  	testRoundTripper.RegisterForScheme("test")
    28  }
    29  
    30  // useTestImageData causes the given content to be served when published metadata is requested.
    31  func useTestImageData(files map[string]string) {
    32  	if files != nil {
    33  		testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil)
    34  		imagemetadata.DefaultBaseURL = "test:"
    35  	} else {
    36  		testRoundTripper.Sub = nil
    37  		imagemetadata.DefaultBaseURL = ""
    38  	}
    39  }
    40  
    41  // TODO (anastasiamac 2015-09-04) This metadata is so verbose.
    42  // Need to generate the text by creating a struct and marshalling it.
    43  var testImagesData = map[string]string{
    44  	"/streams/v1/index.json": `
    45  		{
    46  		 "index": {
    47  		  "com.ubuntu.cloud:released:precise": {
    48  		   "updated": "Wed, 01 May 2013 13:31:26 +0000",
    49  		   "clouds": [
    50  			{
    51  			 "region": "us-east-1",
    52  			 "endpoint": "https://ec2.us-east-1.amazonaws.com"
    53  			}
    54  		   ],
    55  		   "cloudname": "aws",
    56  		   "datatype": "image-ids",
    57  		   "format": "products:1.0",
    58  		   "products": [
    59  			"com.ubuntu.cloud:server:12.04:amd64",
    60  			"com.ubuntu.cloud:server:14.04:amd64"
    61  		   ],
    62  		   "path": "streams/v1/image_metadata.json"
    63  		   }
    64  		  },
    65  		 "updated": "Wed, 01 May 2013 13:31:26 +0000",
    66  		 "format": "index:1.0"
    67  		}
    68  `,
    69  	"/streams/v1/image_metadata.json": `
    70  {
    71   "updated": "Wed, 01 May 2013 13:31:26 +0000",
    72   "content_id": "com.ubuntu.cloud:released:aws",
    73   "region": "nz-east-1",
    74   "endpoint": "https://anywhere",
    75   "products": {
    76    "com.ubuntu.cloud:server:14.04:amd64": {
    77     "release": "trusty",
    78     "version": "14.04",
    79     "arch": "amd64",
    80     "versions": {
    81      "20140118": {
    82       "items": {
    83        "nzww1pe": {
    84         "root_store": "ebs",
    85         "virt": "pv",
    86         "id": "ami-36745463"
    87        }
    88       },
    89       "pubname": "ubuntu-trusty-14.04-amd64-server-20140118",
    90       "label": "release"
    91      }
    92     }
    93    },
    94    "com.ubuntu.cloud:server:12.04:amd64": {
    95     "release": "precise",
    96     "version": "12.04",
    97     "arch": "amd64",
    98     "region": "au-east-1",
    99     "endpoint": "https://somewhere",
   100     "versions": {
   101      "20121218": {
   102       "region": "au-east-2",
   103       "endpoint": "https://somewhere-else",
   104       "items": {
   105        "usww1pe": {
   106         "root_store": "ebs",
   107         "virt": "pv",
   108         "id": "ami-26745463"
   109        }
   110       },
   111       "pubname": "ubuntu-precise-12.04-amd64-server-20121218",
   112       "label": "release"
   113      }
   114     }
   115    }
   116   },
   117   "_aliases": {
   118    "crsn": {
   119     "uswest3": {
   120      "region": "us-west-3",
   121      "endpoint": "https://ec2.us-west-3.amazonaws.com"
   122     }
   123    }
   124   },
   125   "format": "products:1.0"
   126  }
   127  `,
   128  }
   129  
   130  var _ = gc.Suite(&imageMetadataUpdateSuite{})
   131  
   132  type imageMetadataUpdateSuite struct {
   133  	baseImageMetadataSuite
   134  }
   135  
   136  func (s *imageMetadataUpdateSuite) SetUpSuite(c *gc.C) {
   137  	s.BaseSuite.SetUpSuite(c)
   138  	useTestImageData(testImagesData)
   139  }
   140  
   141  func (s *imageMetadataUpdateSuite) TearDownSuite(c *gc.C) {
   142  	useTestImageData(nil)
   143  	s.BaseSuite.TearDownSuite(c)
   144  }
   145  
   146  func (s *imageMetadataUpdateSuite) SetUpTest(c *gc.C) {
   147  	s.baseImageMetadataSuite.SetUpTest(c)
   148  }
   149  
   150  func (s *imageMetadataUpdateSuite) TestUpdateFromPublishedImages(c *gc.C) {
   151  	saved := []cloudimagemetadata.Metadata{}
   152  	expected := []cloudimagemetadata.Metadata{
   153  		cloudimagemetadata.Metadata{
   154  			cloudimagemetadata.MetadataAttributes{
   155  				RootStorageType: "ebs",
   156  				VirtType:        "pv",
   157  				Arch:            "amd64",
   158  				Series:          "trusty",
   159  				Region:          "nz-east-1",
   160  				Source:          "public",
   161  				Stream:          "released"},
   162  			"ami-36745463",
   163  		},
   164  		cloudimagemetadata.Metadata{
   165  			cloudimagemetadata.MetadataAttributes{
   166  				RootStorageType: "ebs",
   167  				VirtType:        "pv",
   168  				Arch:            "amd64",
   169  				Series:          "precise",
   170  				Region:          "au-east-2",
   171  				Source:          "public",
   172  				Stream:          "released"},
   173  			"ami-26745463",
   174  		},
   175  	}
   176  
   177  	// testingEnvConfig prepares an environment configuration using
   178  	// the dummy provider.
   179  	s.state.environConfig = func() (*config.Config, error) {
   180  		s.calls = append(s.calls, environConfig)
   181  		cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
   182  		c.Assert(err, jc.ErrorIsNil)
   183  		env, err := environs.Prepare(cfg, envcmd.BootstrapContext(testing.Context(c)), configstore.NewMem())
   184  		c.Assert(err, jc.ErrorIsNil)
   185  		return env.Config(), err
   186  	}
   187  
   188  	s.state.saveMetadata = func(m cloudimagemetadata.Metadata) error {
   189  		s.calls = append(s.calls, saveMetadata)
   190  		saved = append(saved, m)
   191  		return nil
   192  	}
   193  
   194  	err := s.api.UpdateFromPublishedImages()
   195  	c.Assert(err, jc.ErrorIsNil)
   196  	s.assertCalls(c, []string{environConfig, saveMetadata, saveMetadata})
   197  
   198  	c.Assert(saved, jc.SameContents, expected)
   199  }