github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/provider/ec2/instancetype.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package ec2
     5  
     6  import (
     7  	"launchpad.net/goamz/aws"
     8  
     9  	"github.com/juju/juju/environs/instances"
    10  	"github.com/juju/juju/juju/arch"
    11  )
    12  
    13  // Type of virtualisation used.
    14  var (
    15  	paravirtual = "pv"
    16  	hvm         = "hvm"
    17  )
    18  
    19  // all instance types can run amd64 images, and some can also run i386 ones.
    20  var (
    21  	amd64 = []string{arch.AMD64}
    22  	both  = []string{arch.AMD64, arch.I386}
    23  )
    24  
    25  // allRegions is defined here to allow tests to override the content.
    26  var allRegions = aws.Regions
    27  
    28  // allInstanceTypes holds the relevant attributes of every known
    29  // instance type.
    30  // Note that while the EC2 root disk default is 8G, constraints on disk
    31  // for amazon will simply cause the root disk to grow to match the constraint
    32  var allInstanceTypes = []instances.InstanceType{
    33  	{ // General purpose, 1st generation.
    34  		Name:     "m1.small",
    35  		Arches:   both,
    36  		CpuCores: 1,
    37  		CpuPower: instances.CpuPower(100),
    38  		Mem:      1740,
    39  		VirtType: &paravirtual,
    40  	}, {
    41  		Name:     "m1.medium",
    42  		Arches:   both,
    43  		CpuCores: 1,
    44  		CpuPower: instances.CpuPower(200),
    45  		Mem:      3840,
    46  		VirtType: &paravirtual,
    47  	}, {
    48  		Name:     "m1.large",
    49  		Arches:   amd64,
    50  		CpuCores: 2,
    51  		CpuPower: instances.CpuPower(400),
    52  		Mem:      7680,
    53  		VirtType: &paravirtual,
    54  	}, {
    55  		Name:     "m1.xlarge",
    56  		Arches:   amd64,
    57  		CpuCores: 4,
    58  		CpuPower: instances.CpuPower(800),
    59  		Mem:      15360,
    60  		VirtType: &paravirtual,
    61  	},
    62  
    63  	{ // General purpose, 2nd generation.
    64  		Name:     "m3.medium",
    65  		Arches:   amd64,
    66  		CpuCores: 1,
    67  		CpuPower: instances.CpuPower(300),
    68  		Mem:      3840,
    69  		VirtType: &paravirtual,
    70  	}, {
    71  		Name:     "m3.large",
    72  		Arches:   amd64,
    73  		CpuCores: 2,
    74  		CpuPower: instances.CpuPower(650),
    75  		Mem:      7680,
    76  		VirtType: &paravirtual,
    77  	}, {
    78  		Name:     "m3.xlarge",
    79  		Arches:   amd64,
    80  		CpuCores: 4,
    81  		CpuPower: instances.CpuPower(1300),
    82  		Mem:      15360,
    83  		VirtType: &paravirtual,
    84  	}, {
    85  		Name:     "m3.2xlarge",
    86  		Arches:   amd64,
    87  		CpuCores: 8,
    88  		CpuPower: instances.CpuPower(2600),
    89  		Mem:      30720,
    90  		VirtType: &paravirtual,
    91  	},
    92  
    93  	{ // Compute-optimized, 1st generation.
    94  		Name:     "c1.medium",
    95  		Arches:   both,
    96  		CpuCores: 2,
    97  		CpuPower: instances.CpuPower(500),
    98  		Mem:      1740,
    99  		VirtType: &paravirtual,
   100  	}, {
   101  		Name:     "c1.xlarge",
   102  		Arches:   amd64,
   103  		CpuCores: 8,
   104  		CpuPower: instances.CpuPower(2000),
   105  		Mem:      7168,
   106  		VirtType: &paravirtual,
   107  	}, {
   108  		Name:     "cc2.8xlarge",
   109  		Arches:   amd64,
   110  		CpuCores: 16,
   111  		CpuPower: instances.CpuPower(8800),
   112  		Mem:      61952,
   113  		VirtType: &hvm,
   114  	},
   115  
   116  	{ // Compute-optimized, 2nd generation.
   117  		Name:     "c3.large",
   118  		Arches:   amd64,
   119  		CpuCores: 2,
   120  		CpuPower: instances.CpuPower(700),
   121  		Mem:      3840,
   122  		VirtType: &paravirtual,
   123  	}, {
   124  		Name:     "c3.xlarge",
   125  		Arches:   amd64,
   126  		CpuCores: 4,
   127  		CpuPower: instances.CpuPower(1400),
   128  		Mem:      7680,
   129  		VirtType: &paravirtual,
   130  	}, {
   131  		Name:     "c3.2xlarge",
   132  		Arches:   amd64,
   133  		CpuCores: 8,
   134  		CpuPower: instances.CpuPower(2800),
   135  		Mem:      15360,
   136  		VirtType: &paravirtual,
   137  	}, {
   138  		Name:     "c3.4xlarge",
   139  		Arches:   amd64,
   140  		CpuCores: 16,
   141  		CpuPower: instances.CpuPower(5500),
   142  		Mem:      30720,
   143  		VirtType: &paravirtual,
   144  	}, {
   145  		Name:     "c3.8xlarge",
   146  		Arches:   amd64,
   147  		CpuCores: 32,
   148  		CpuPower: instances.CpuPower(10800),
   149  		Mem:      61440,
   150  		VirtType: &paravirtual,
   151  	},
   152  
   153  	{ // GPU instances, 1st generation.
   154  		Name:     "cg1.4xlarge",
   155  		Arches:   amd64,
   156  		CpuCores: 8,
   157  		CpuPower: instances.CpuPower(3350),
   158  		Mem:      22528,
   159  		VirtType: &hvm,
   160  	},
   161  
   162  	{ // GPU instances, 2nd generation.
   163  		Name:     "g2.2xlarge",
   164  		Arches:   amd64,
   165  		CpuCores: 8,
   166  		CpuPower: instances.CpuPower(2600),
   167  		Mem:      15360,
   168  		VirtType: &hvm,
   169  	},
   170  
   171  	{ // Memory-optimized, 1st generation.
   172  		Name:     "m2.xlarge",
   173  		Arches:   amd64,
   174  		CpuCores: 2,
   175  		CpuPower: instances.CpuPower(650),
   176  		Mem:      17408,
   177  		VirtType: &paravirtual,
   178  	}, {
   179  		Name:     "m2.2xlarge",
   180  		Arches:   amd64,
   181  		CpuCores: 4,
   182  		CpuPower: instances.CpuPower(1300),
   183  		Mem:      34816,
   184  		VirtType: &paravirtual,
   185  	}, {
   186  		Name:     "m2.4xlarge",
   187  		Arches:   amd64,
   188  		CpuCores: 8,
   189  		CpuPower: instances.CpuPower(2600),
   190  		Mem:      69632,
   191  		VirtType: &paravirtual,
   192  	}, {
   193  		Name:     "cr1.8xlarge",
   194  		Arches:   amd64,
   195  		CpuCores: 16,
   196  		CpuPower: instances.CpuPower(8800),
   197  		Mem:      249856,
   198  		VirtType: &hvm,
   199  	},
   200  
   201  	{ // Memory-optimized, 2nd generation.
   202  		Name:     "r3.large",
   203  		Arches:   amd64,
   204  		CpuCores: 2,
   205  		CpuPower: instances.CpuPower(650),
   206  		Mem:      15360,
   207  		VirtType: &hvm,
   208  	}, {
   209  		Name:     "r3.xlarge",
   210  		Arches:   amd64,
   211  		CpuCores: 4,
   212  		CpuPower: instances.CpuPower(1300),
   213  		Mem:      31232,
   214  		VirtType: &hvm,
   215  	}, {
   216  		Name:     "r3.2xlarge",
   217  		Arches:   amd64,
   218  		CpuCores: 8,
   219  		CpuPower: instances.CpuPower(2600),
   220  		Mem:      62464,
   221  		VirtType: &hvm,
   222  	}, {
   223  		Name:     "r3.4xlarge",
   224  		Arches:   amd64,
   225  		CpuCores: 16,
   226  		CpuPower: instances.CpuPower(5200),
   227  		Mem:      124928,
   228  		VirtType: &hvm,
   229  	}, {
   230  		Name:     "r3.8xlarge",
   231  		Arches:   amd64,
   232  		CpuCores: 32,
   233  		CpuPower: instances.CpuPower(10400),
   234  		Mem:      249856,
   235  		VirtType: &hvm,
   236  	},
   237  
   238  	{ // Storage-optimized, 1st generation.
   239  		Name:     "hi1.4xlarge",
   240  		Arches:   amd64,
   241  		CpuCores: 16,
   242  		CpuPower: instances.CpuPower(3500),
   243  		Mem:      61952,
   244  		VirtType: &paravirtual,
   245  	},
   246  
   247  	{ // Storage-optimized, 2nd generation.
   248  		Name:     "i2.xlarge",
   249  		Arches:   amd64,
   250  		CpuCores: 4,
   251  		CpuPower: instances.CpuPower(1400),
   252  		Mem:      31232,
   253  		VirtType: &hvm,
   254  	}, {
   255  		Name:     "i2.2xlarge",
   256  		Arches:   amd64,
   257  		CpuCores: 8,
   258  		CpuPower: instances.CpuPower(2700),
   259  		Mem:      62464,
   260  		VirtType: &hvm,
   261  	}, {
   262  		Name:     "i2.4xlarge",
   263  		Arches:   amd64,
   264  		CpuCores: 16,
   265  		CpuPower: instances.CpuPower(5300),
   266  		Mem:      124928,
   267  		VirtType: &hvm,
   268  	}, {
   269  		Name:     "i2.8xlarge",
   270  		Arches:   amd64,
   271  		CpuCores: 32,
   272  		CpuPower: instances.CpuPower(10400),
   273  		Mem:      249856,
   274  		VirtType: &hvm,
   275  	}, {
   276  		Name:     "hs1.8xlarge",
   277  		Arches:   amd64,
   278  		CpuCores: 16,
   279  		CpuPower: instances.CpuPower(3500),
   280  		Mem:      119808,
   281  		VirtType: &paravirtual,
   282  	},
   283  
   284  	{ // Tiny-weeny.
   285  		Name:     "t1.micro",
   286  		Arches:   both,
   287  		CpuCores: 1,
   288  		CpuPower: instances.CpuPower(20),
   289  		Mem:      613,
   290  		VirtType: &paravirtual,
   291  	},
   292  }
   293  
   294  type instanceTypeCost map[string]uint64
   295  type regionCosts map[string]instanceTypeCost
   296  
   297  // allRegionCosts holds the cost in USDe-3/hour for each available instance
   298  // type in each region.
   299  var allRegionCosts = regionCosts{
   300  	"ap-northeast-1": { // Tokyo.
   301  		"m1.small":   61,
   302  		"m1.medium":  122,
   303  		"m1.large":   243,
   304  		"m1.xlarge":  486,
   305  		"m3.medium":  101,
   306  		"m3.large":   203,
   307  		"m3.xlarge":  405,
   308  		"m3.2xlarge": 810,
   309  
   310  		"c1.medium":   158,
   311  		"c1.xlarge":   632,
   312  		"cc2.8xlarge": 2349,
   313  		"c3.large":    128,
   314  		"c3.xlarge":   255,
   315  		"c3.2xlarge":  511,
   316  		"c3.4xlarge":  1021,
   317  		"c3.8xlarge":  2043,
   318  
   319  		"g2.2xlarge": 898,
   320  
   321  		"m2.xlarge":   287,
   322  		"m2.2xlarge":  575,
   323  		"m2.4xlarge":  1150,
   324  		"cr1.8xlarge": 4105,
   325  		"r3.large":    210,
   326  		"r3.xlarge":   420,
   327  		"r3.2xlarge":  840,
   328  		"r3.4xlarge":  1680,
   329  		"r3.8xlarge":  3360,
   330  
   331  		"hi1.4xlarge": 3276,
   332  		"i2.xlarge":   1001,
   333  		"i2.2xlarge":  2001,
   334  		"i2.4xlarge":  4002,
   335  		"i2.8xlarge":  8004,
   336  		"hs1.8xlarge": 5400,
   337  
   338  		"t1.micro": 26,
   339  	},
   340  	"ap-southeast-1": { // Singapore.
   341  		"m1.small":   58,
   342  		"m1.medium":  117,
   343  		"m1.large":   233,
   344  		"m1.xlarge":  467,
   345  		"m3.medium":  98,
   346  		"m3.large":   196,
   347  		"m3.xlarge":  392,
   348  		"m3.2xlarge": 784,
   349  
   350  		"c1.medium":  164,
   351  		"c1.xlarge":  655,
   352  		"c3.large":   132,
   353  		"c3.xlarge":  265,
   354  		"c3.2xlarge": 529,
   355  		"c3.4xlarge": 1058,
   356  		"c3.8xlarge": 2117,
   357  
   358  		"m2.xlarge":  296,
   359  		"m2.2xlarge": 592,
   360  		"m2.4xlarge": 1183,
   361  		"r3.large":   210,
   362  		"r3.xlarge":  420,
   363  		"r3.2xlarge": 840,
   364  		"r3.4xlarge": 1680,
   365  		"r3.8xlarge": 3360,
   366  
   367  		"i2.xlarge":   1018,
   368  		"i2.2xlarge":  2035,
   369  		"i2.4xlarge":  4070,
   370  		"i2.8xlarge":  8140,
   371  		"hs1.8xlarge": 5570,
   372  
   373  		"t1.micro": 20,
   374  	},
   375  	"ap-southeast-2": { // Sydney.
   376  		"m1.small":   58,
   377  		"m1.medium":  117,
   378  		"m1.large":   233,
   379  		"m1.xlarge":  467,
   380  		"m3.medium":  98,
   381  		"m3.large":   196,
   382  		"m3.xlarge":  392,
   383  		"m3.2xlarge": 784,
   384  
   385  		"c1.medium":  164,
   386  		"c1.xlarge":  655,
   387  		"c3.large":   132,
   388  		"c3.xlarge":  265,
   389  		"c3.2xlarge": 529,
   390  		"c3.4xlarge": 1058,
   391  		"c3.8xlarge": 2117,
   392  
   393  		"m2.xlarge":  296,
   394  		"m2.2xlarge": 592,
   395  		"m2.4xlarge": 1183,
   396  		"r3.large":   210,
   397  		"r3.xlarge":  420,
   398  		"r3.2xlarge": 840,
   399  		"r3.4xlarge": 1680,
   400  		"r3.8xlarge": 3360,
   401  
   402  		"i2.xlarge":   1018,
   403  		"i2.2xlarge":  2035,
   404  		"i2.4xlarge":  4070,
   405  		"i2.8xlarge":  8140,
   406  		"hs1.8xlarge": 5570,
   407  
   408  		"t1.micro": 20,
   409  	},
   410  	"eu-west-1": { // Ireland.
   411  		"m1.small":   47,
   412  		"m1.medium":  95,
   413  		"m1.large":   190,
   414  		"m1.xlarge":  379,
   415  		"m3.medium":  77,
   416  		"m3.large":   154,
   417  		"m3.xlarge":  308,
   418  		"m3.2xlarge": 616,
   419  
   420  		"c1.medium":   148,
   421  		"c1.xlarge":   592,
   422  		"cc2.8xlarge": 2250,
   423  		"c3.large":    120,
   424  		"c3.xlarge":   239,
   425  		"c3.2xlarge":  478,
   426  		"c3.4xlarge":  956,
   427  		"c3.8xlarge":  1912,
   428  
   429  		"cg1.4xlarge": 2360,
   430  		"g2.2xlarge":  702,
   431  
   432  		"m2.xlarge":   275,
   433  		"m2.2xlarge":  550,
   434  		"m2.4xlarge":  1100,
   435  		"cr1.8xlarge": 3750,
   436  		"r3.large":    195,
   437  		"r3.xlarge":   390,
   438  		"r3.2xlarge":  780,
   439  		"r3.4xlarge":  1560,
   440  		"r3.8xlarge":  3120,
   441  
   442  		"hi1.4xlarge": 3100,
   443  		"i2.xlarge":   938,
   444  		"i2.2xlarge":  1876,
   445  		"i2.4xlarge":  3751,
   446  		"i2.8xlarge":  7502,
   447  		"hs1.8xlarge": 4900,
   448  
   449  		"t1.micro": 20,
   450  	},
   451  	"sa-east-1": { // Sao Paulo.
   452  		"m1.small":   58,
   453  		"m1.medium":  117,
   454  		"m1.large":   233,
   455  		"m1.xlarge":  467,
   456  		"m3.medium":  95,
   457  		"m3.large":   190,
   458  		"m3.xlarge":  381,
   459  		"m3.2xlarge": 761,
   460  
   461  		"c1.medium": 179,
   462  		"c1.xlarge": 718,
   463  
   464  		"m2.xlarge":  323,
   465  		"m2.2xlarge": 645,
   466  		"m2.4xlarge": 1291,
   467  
   468  		"t1.micro": 27,
   469  	},
   470  	"us-east-1": { // Northern Virginia.
   471  		"m1.small":   44,
   472  		"m1.medium":  87,
   473  		"m1.large":   175,
   474  		"m1.xlarge":  350,
   475  		"m3.medium":  70,
   476  		"m3.large":   140,
   477  		"m3.xlarge":  280,
   478  		"m3.2xlarge": 560,
   479  
   480  		"c1.medium":   130,
   481  		"c1.xlarge":   520,
   482  		"cc2.8xlarge": 2000,
   483  		"c3.large":    105,
   484  		"c3.xlarge":   210,
   485  		"c3.2xlarge":  420,
   486  		"c3.4xlarge":  840,
   487  		"c3.8xlarge":  1680,
   488  
   489  		"cg1.4xlarge": 2100,
   490  		"g2.2xlarge":  650,
   491  
   492  		"m2.xlarge":   245,
   493  		"m2.2xlarge":  490,
   494  		"m2.4xlarge":  980,
   495  		"cr1.8xlarge": 3500,
   496  		"r3.large":    175,
   497  		"r3.xlarge":   350,
   498  		"r3.2xlarge":  700,
   499  		"r3.4xlarge":  1400,
   500  		"r3.8xlarge":  2800,
   501  
   502  		"hi1.4xlarge": 3100,
   503  		"i2.xlarge":   853,
   504  		"i2.2xlarge":  1705,
   505  		"i2.4xlarge":  3410,
   506  		"i2.8xlarge":  6820,
   507  		"hs1.8xlarge": 4600,
   508  
   509  		"t1.micro": 20,
   510  	},
   511  	"us-west-1": { // Northern California.
   512  		"m1.small":   47,
   513  		"m1.medium":  95,
   514  		"m1.large":   190,
   515  		"m1.xlarge":  379,
   516  		"m3.medium":  77,
   517  		"m3.large":   154,
   518  		"m3.xlarge":  308,
   519  		"m3.2xlarge": 616,
   520  
   521  		"c1.medium":  148,
   522  		"c1.xlarge":  592,
   523  		"c3.large":   120,
   524  		"c3.xlarge":  239,
   525  		"c3.2xlarge": 478,
   526  		"c3.4xlarge": 956,
   527  		"c3.8xlarge": 1912,
   528  
   529  		"g2.2xlarge": 702,
   530  
   531  		"m2.xlarge":  275,
   532  		"m2.2xlarge": 550,
   533  		"m2.4xlarge": 1100,
   534  		"r3.large":   195,
   535  		"r3.xlarge":  390,
   536  		"r3.2xlarge": 780,
   537  		"r3.4xlarge": 1560,
   538  		"r3.8xlarge": 3120,
   539  
   540  		"i2.xlarge":  938,
   541  		"i2.2xlarge": 1876,
   542  		"i2.4xlarge": 3751,
   543  		"i2.8xlarge": 7502,
   544  
   545  		"t1.micro": 25,
   546  	},
   547  	"us-west-2": { // Oregon.
   548  		"m1.small":   44,
   549  		"m1.medium":  87,
   550  		"m1.large":   175,
   551  		"m1.xlarge":  350,
   552  		"m3.medium":  70,
   553  		"m3.large":   140,
   554  		"m3.xlarge":  280,
   555  		"m3.2xlarge": 560,
   556  
   557  		"c1.medium":   130,
   558  		"c1.xlarge":   520,
   559  		"cc2.8xlarge": 2000,
   560  		"c3.large":    105,
   561  		"c3.xlarge":   210,
   562  		"c3.2xlarge":  420,
   563  		"c3.4xlarge":  840,
   564  		"c3.8xlarge":  1680,
   565  
   566  		"g2.2xlarge": 650,
   567  
   568  		"m2.xlarge":   245,
   569  		"m2.2xlarge":  490,
   570  		"m2.4xlarge":  980,
   571  		"cr1.8xlarge": 3500,
   572  		"r3.large":    175,
   573  		"r3.xlarge":   350,
   574  		"r3.2xlarge":  700,
   575  		"r3.4xlarge":  1400,
   576  		"r3.8xlarge":  2800,
   577  
   578  		"hi1.4xlarge": 3100,
   579  		"i2.xlarge":   853,
   580  		"i2.2xlarge":  1705,
   581  		"i2.4xlarge":  3410,
   582  		"i2.8xlarge":  6820,
   583  		"hs1.8xlarge": 4600,
   584  
   585  		"t1.micro": 20,
   586  	},
   587  }