/*******************************************************************************
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and
* limitations under the License.
* *****************************************************************************
* __ _ _ ___
* ( )( \/\/ )/ __)
* /__\ \ / \__ \
* (_)(_) \/\/ (___/
*
* AWS SDK for .NET
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using Amazon.EC2.Model;
using Amazon.Runtime.Internal.Util;
using ThirdParty.Json.LitJson;
using Amazon.Runtime;
#pragma warning disable 1591
namespace Amazon.EC2.Util
{
///
/// This class has utility methods for finding common Amazon machine images.
///
public static partial class ImageUtilities
{
#region ImageKeys
public const string WINDOWS_2016_BASE_KEY = "WINDOWS_2016_BASE";
public const string WINDOWS_2016_NANO_KEY = "WINDOWS_2016_NANO";
public const string WINDOWS_2016_CORE_KEY = "WINDOWS_2016_CORE";
public const string WINDOWS_2016_CONTAINER_KEY = "WINDOWS_2016_CONTAINER";
public const string WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016_KEY = "WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016";
public const string WINDOWS_2016_SQL_SERVER_STANDARD_2016_KEY = "WINDOWS_2016_SQL_SERVER_STANDARD_2016";
public const string WINDOWS_2016_SQL_SERVER_WEB_2016_KEY = "WINDOWS_2016_SQL_SERVER_WEB_2016";
public const string WINDOWS_2016_SQL_SERVER_EXPRESS_2016_KEY = "WINDOWS_2016_SQL_SERVER_EXPRESS_2016";
public const string WINDOWS_2012R2_BASE_KEY = "WINDOWS_2012R2_BASE";
public const string WINDOWS_2012R2_CORE_KEY = "WINDOWS_2012R2_CORE";
public const string WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016_KEY = "WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016";
public const string WINDOWS_2012R2_SQL_SERVER_STANDARD_2016_KEY = "WINDOWS_2012R2_SQL_SERVER_STANDARD_2016";
public const string WINDOWS_2012R2_SQL_SERVER_WEB_2016_KEY = "WINDOWS_2012R2_SQL_SERVER_WEB_2016";
public const string WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014_KEY = "WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014";
public const string WINDOWS_2012R2_SQL_SERVER_STANDARD_2014_KEY = "WINDOWS_2012R2_SQL_SERVER_STANDARD_2014";
public const string WINDOWS_2012R2_SQL_SERVER_WEB_2014_KEY = "WINDOWS_2012R2_SQL_SERVER_WEB_2014";
public const string WINDOWS_2012_BASE_KEY = "WINDOWS_2012_BASE";
public const string WINDOWS_2012_SQL_SERVER_EXPRESS_2014_KEY = "WINDOWS_2012_SQL_SERVER_EXPRESS_2014";
public const string WINDOWS_2012_SQL_SERVER_STANDARD_2014_KEY = "WINDOWS_2012_SQL_SERVER_STANDARD_2014";
public const string WINDOWS_2012_SQL_SERVER_WEB_2014_KEY = "WINDOWS_2012_SQL_SERVER_WEB_2014";
public const string WINDOWS_2012_SQL_SERVER_EXPRESS_2012_KEY = "WINDOWS_2012_SQL_SERVER_EXPRESS_2012";
public const string WINDOWS_2012_SQL_SERVER_STANDARD_2012_KEY = "WINDOWS_2012_SQL_SERVER_STANDARD_2012";
public const string WINDOWS_2012_SQL_SERVER_WEB_2012_KEY = "WINDOWS_2012_SQL_SERVER_WEB_2012";
public const string WINDOWS_2012_SQL_SERVER_EXPRESS_2008_KEY = "WINDOWS_2012_SQL_SERVER_EXPRESS_2008";
public const string WINDOWS_2012_SQL_SERVER_STANDARD_2008_KEY = "WINDOWS_2012_SQL_SERVER_STANDARD_2008";
public const string WINDOWS_2012_SQL_SERVER_WEB_2008_KEY = "WINDOWS_2012_SQL_SERVER_WEB_2008";
public const string WINDOWS_2008R2_BASE_KEY = "WINDOWS_2008R2_BASE";
public const string WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012_KEY = "WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012";
public const string WINDOWS_2008R2_SQL_SERVER_STANDARD_2012_KEY = "WINDOWS_2008R2_SQL_SERVER_STANDARD_2012";
public const string WINDOWS_2008R2_SQL_SERVER_WEB_2012_KEY = "WINDOWS_2008R2_SQL_SERVER_WEB_2012";
public const string WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008_KEY = "WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008";
public const string WINDOWS_2008R2_SQL_SERVER_STANDARD_2008_KEY = "WINDOWS_2008R2_SQL_SERVER_STANDARD_2008";
public const string WINDOWS_2008R2_SQL_SERVER_WEB_2008_KEY = "WINDOWS_2008R2_SQL_SERVER_WEB_2008";
public const string WINDOWS_2008RTM_BASE_KEY = "WINDOWS_2008RTM_BASE";
public const string WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008_KEY = "WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008";
public const string WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008_KEY = "WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008";
public const string WINDOWS_2008_BEANSTALK_IIS75_KEY = "WINDOWS_2008_BEANSTALK_IIS75";
public const string WINDOWS_2012_BEANSTALK_IIS8_KEY = "WINDOWS_2012_BEANSTALK_IIS8";
public const string VPC_NAT_KEY = "VPC_NAT";
///
/// The collection of keys that can be used to address images.
///
public static readonly IEnumerable ImageKeys = new string[]
{
WINDOWS_2016_BASE_KEY,
WINDOWS_2016_NANO_KEY,
WINDOWS_2016_CORE_KEY,
WINDOWS_2016_CONTAINER_KEY,
WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016_KEY,
WINDOWS_2016_SQL_SERVER_STANDARD_2016_KEY,
WINDOWS_2016_SQL_SERVER_WEB_2016_KEY,
WINDOWS_2016_SQL_SERVER_EXPRESS_2016_KEY,
WINDOWS_2012R2_BASE_KEY,
WINDOWS_2012R2_CORE_KEY,
WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016_KEY,
WINDOWS_2012R2_SQL_SERVER_STANDARD_2016_KEY,
WINDOWS_2012R2_SQL_SERVER_WEB_2016_KEY,
WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014_KEY,
WINDOWS_2012R2_SQL_SERVER_STANDARD_2014_KEY,
WINDOWS_2012R2_SQL_SERVER_WEB_2014_KEY,
WINDOWS_2012_BASE_KEY,
WINDOWS_2012_SQL_SERVER_EXPRESS_2014_KEY,
WINDOWS_2012_SQL_SERVER_STANDARD_2014_KEY,
WINDOWS_2012_SQL_SERVER_WEB_2014_KEY,
WINDOWS_2012_SQL_SERVER_EXPRESS_2012_KEY,
WINDOWS_2012_SQL_SERVER_STANDARD_2012_KEY,
WINDOWS_2012_SQL_SERVER_WEB_2012_KEY,
WINDOWS_2012_SQL_SERVER_EXPRESS_2008_KEY,
WINDOWS_2012_SQL_SERVER_STANDARD_2008_KEY,
WINDOWS_2012_SQL_SERVER_WEB_2008_KEY,
WINDOWS_2008R2_BASE_KEY,
WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012_KEY,
WINDOWS_2008R2_SQL_SERVER_STANDARD_2012_KEY,
WINDOWS_2008R2_SQL_SERVER_WEB_2012_KEY,
WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008_KEY,
WINDOWS_2008R2_SQL_SERVER_STANDARD_2008_KEY,
WINDOWS_2008R2_SQL_SERVER_WEB_2008_KEY,
WINDOWS_2008RTM_BASE_KEY,
WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008_KEY,
WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008_KEY,
WINDOWS_2008_BEANSTALK_IIS75_KEY,
WINDOWS_2012_BEANSTALK_IIS8_KEY,
VPC_NAT_KEY
};
#endregion
#region Windows 2016 Images
public static readonly ImageDescriptor WINDOWS_2016_BASE = new ImageDescriptor(WINDOWS_2016_BASE_KEY);
public static readonly ImageDescriptor WINDOWS_2016_NANO = new ImageDescriptor(WINDOWS_2016_NANO_KEY);
public static readonly ImageDescriptor WINDOWS_2016_CORE = new ImageDescriptor(WINDOWS_2016_CORE_KEY);
public static readonly ImageDescriptor WINDOWS_2016_CONTAINER = new ImageDescriptor(WINDOWS_2016_CONTAINER_KEY);
public static readonly ImageDescriptor WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016 = new ImageDescriptor(WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2016_SQL_SERVER_STANDARD_2016 = new ImageDescriptor(WINDOWS_2016_SQL_SERVER_STANDARD_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2016_SQL_SERVER_WEB_2016 = new ImageDescriptor(WINDOWS_2016_SQL_SERVER_WEB_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2016_SQL_SERVER_EXPRESS_2016 = new ImageDescriptor(WINDOWS_2016_SQL_SERVER_EXPRESS_2016_KEY);
#endregion
#region Windows 2012 R2 Images
public static readonly ImageDescriptor WINDOWS_2012R2_BASE = new ImageDescriptor(WINDOWS_2012R2_BASE_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_CORE = new ImageDescriptor(WINDOWS_2012R2_CORE_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_STANDARD_2016 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_STANDARD_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_WEB_2016 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_WEB_2016_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_STANDARD_2014 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_STANDARD_2014_KEY);
public static readonly ImageDescriptor WINDOWS_2012R2_SQL_SERVER_WEB_2014 = new ImageDescriptor(WINDOWS_2012R2_SQL_SERVER_WEB_2014_KEY);
#endregion
#region Windows 2012 (Original RTM) Images
public static readonly ImageDescriptor WINDOWS_2012_BASE = new ImageDescriptor(WINDOWS_2012_BASE_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_EXPRESS_2014 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_EXPRESS_2014_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_STANDARD_2014 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_STANDARD_2014_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_WEB_2014 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_WEB_2014_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_EXPRESS_2012 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_EXPRESS_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_STANDARD_2012 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_STANDARD_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_WEB_2012 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_WEB_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_EXPRESS_2008 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_EXPRESS_2008_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_STANDARD_2008 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_STANDARD_2008_KEY);
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_WEB_2008 = new ImageDescriptor(WINDOWS_2012_SQL_SERVER_WEB_2008_KEY);
#endregion
#region Windows 2008 R2 Images
public static readonly ImageDescriptor WINDOWS_2008R2_BASE = new ImageDescriptor(WINDOWS_2008R2_BASE_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_STANDARD_2012 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_STANDARD_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_WEB_2012 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_WEB_2012_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_STANDARD_2008 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_STANDARD_2008_KEY);
public static readonly ImageDescriptor WINDOWS_2008R2_SQL_SERVER_WEB_2008 = new ImageDescriptor(WINDOWS_2008R2_SQL_SERVER_WEB_2008_KEY);
#endregion
#region Windows 2008 (Original RTM) Images
public static readonly ImageDescriptor WINDOWS_2008RTM_BASE = new ImageDescriptor(WINDOWS_2008RTM_BASE_KEY);
public static readonly ImageDescriptor WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008 = new ImageDescriptor(WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008_KEY);
public static readonly ImageDescriptor WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008 = new ImageDescriptor(WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008_KEY);
#endregion
#region Misc Images
public static readonly ImageDescriptor WINDOWS_2008_BEANSTALK_IIS75 = new ImageDescriptor(WINDOWS_2008_BEANSTALK_IIS75_KEY);
public static readonly ImageDescriptor WINDOWS_2012_BEANSTALK_IIS8 = new ImageDescriptor(WINDOWS_2012_BEANSTALK_IIS8_KEY);
public static readonly ImageDescriptor VPC_NAT = new ImageDescriptor(VPC_NAT_KEY);
#endregion
#region Obsolete Members
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_EXPRESS_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_EXPRESS_2008_R2 = WINDOWS_2012_SQL_SERVER_EXPRESS_2008;
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_STANDARD_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_STANDARD_2008_R2 = WINDOWS_2012_SQL_SERVER_STANDARD_2008;
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_WEB_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_WEB_2008_R2 = WINDOWS_2012_SQL_SERVER_WEB_2008;
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_EXPRESS_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_EXPRESS_2008_R2_SP2 = WINDOWS_2012_SQL_SERVER_EXPRESS_2008;
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_STANDARD_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_STANDARD_2008_R2_SP2 = WINDOWS_2012_SQL_SERVER_STANDARD_2008;
[Obsolete("Please use the WINDOWS_2012_SQL_SERVER_WEB_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2012_SQL_SERVER_WEB_2008_R2_SP2 = WINDOWS_2012_SQL_SERVER_WEB_2008;
[Obsolete("Please use the WINDOWS_2008R2_BASE member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_BASE = WINDOWS_2008R2_BASE;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_EXPRESS_2012 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_STANDARD_2012 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_WEB_2012 = WINDOWS_2008R2_SQL_SERVER_WEB_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_EXPRESS_2008_R2_SP2 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_STANDARD_2008_R2_SP2 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SP1_SQL_SERVER_WEB_2008_R2_SP2 = WINDOWS_2008R2_SQL_SERVER_WEB_2008;
[Obsolete("Please use the WINDOWS_2008R2_BASE member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_BASE = WINDOWS_2008R2_BASE;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_EXPRESS_2012 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_STANDARD_2012 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_WEB_2012 = WINDOWS_2008R2_SQL_SERVER_WEB_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_EXPRESS_2008_R2 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_STANDARD_2008_R2 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_R2_SQL_SERVER_WEB_2008_R2 = WINDOWS_2008R2_SQL_SERVER_WEB_2008;
// Legacy keys kept for backwards compatibility with user-code so the R2 ami gets served, now that we also have 2008RTM amis
// in the collection
[Obsolete("Please use the WINDOWS_2008R2_BASE member.")]
public static readonly ImageDescriptor WINDOWS_2008_BASE = WINDOWS_2008R2_BASE;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_EXPRESS_2012 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_STANDARD_2012 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2012 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_WEB_2012 = WINDOWS_2008R2_SQL_SERVER_WEB_2012;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_EXPRESS_2008 = WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_STANDARD_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_STANDARD_2008 = WINDOWS_2008R2_SQL_SERVER_STANDARD_2008;
[Obsolete("Please use the WINDOWS_2008R2_SQL_SERVER_WEB_2008 member.")]
public static readonly ImageDescriptor WINDOWS_2008_SQL_SERVER_WEB_2008 = WINDOWS_2008R2_SQL_SERVER_WEB_2008;
#endregion
#region Initialization and private members
static Logger Logger
{
get
{
return Logger.GetLogger(typeof(ImageUtilities));
}
}
private static readonly ImageDescriptor[] WindowsDescriptors =
{
WINDOWS_2016_BASE,
WINDOWS_2016_NANO,
WINDOWS_2016_CORE,
WINDOWS_2016_CONTAINER,
WINDOWS_2016_SQL_SERVER_ENTERPRISE_2016,
WINDOWS_2016_SQL_SERVER_STANDARD_2016,
WINDOWS_2016_SQL_SERVER_WEB_2016,
WINDOWS_2016_SQL_SERVER_EXPRESS_2016,
WINDOWS_2012R2_BASE,
WINDOWS_2012R2_CORE,
WINDOWS_2012R2_SQL_SERVER_EXPRESS_2016,
WINDOWS_2012R2_SQL_SERVER_STANDARD_2016,
WINDOWS_2012R2_SQL_SERVER_WEB_2016,
WINDOWS_2012R2_SQL_SERVER_EXPRESS_2014,
WINDOWS_2012R2_SQL_SERVER_STANDARD_2014,
WINDOWS_2012R2_SQL_SERVER_WEB_2014,
WINDOWS_2012_BASE,
WINDOWS_2012_SQL_SERVER_EXPRESS_2014,
WINDOWS_2012_SQL_SERVER_STANDARD_2014,
WINDOWS_2012_SQL_SERVER_WEB_2014,
WINDOWS_2012_SQL_SERVER_EXPRESS_2012,
WINDOWS_2012_SQL_SERVER_STANDARD_2012,
WINDOWS_2012_SQL_SERVER_WEB_2012,
WINDOWS_2012_SQL_SERVER_EXPRESS_2008,
WINDOWS_2012_SQL_SERVER_STANDARD_2008,
WINDOWS_2012_SQL_SERVER_WEB_2008,
WINDOWS_2008R2_BASE,
WINDOWS_2008R2_SQL_SERVER_EXPRESS_2012,
WINDOWS_2008R2_SQL_SERVER_STANDARD_2012,
WINDOWS_2008R2_SQL_SERVER_WEB_2012,
WINDOWS_2008R2_SQL_SERVER_EXPRESS_2008,
WINDOWS_2008R2_SQL_SERVER_STANDARD_2008,
WINDOWS_2008R2_SQL_SERVER_WEB_2008,
WINDOWS_2008RTM_BASE,
WINDOWS_2008RTM_SQL_SERVER_EXPRESS_2008,
WINDOWS_2008RTM_SQL_SERVER_STANDARD_2008,
WINDOWS_2008_BEANSTALK_IIS75,
WINDOWS_2012_BEANSTALK_IIS8
};
private static readonly ImageDescriptor[] LinuxDescriptors =
{
VPC_NAT
};
private const string CLOUDFRONT_LOCATION_OF_AMI_FILE = "https://aws-sdk-configurations.amazonwebservices.com/stockamis.json";
private const string S3_LOCATION_OF_AMI_FILE = "https://aws-sdk-configurations.s3.amazonaws.com/stockamis.json";
private static readonly string[] DownloadLocations =
{
CLOUDFRONT_LOCATION_OF_AMI_FILE,
S3_LOCATION_OF_AMI_FILE
};
private const string WindowsImagesTag = "WindowsImages";
private const string LinuxImagesTag = "LinuxImages";
private const string DefinitionKeyTag = "key";
private const string DefinitionPrefixTag = "prefix";
private const int MAX_DOWNLOAD_RETRIES = 3;
private static readonly object LOCK_OBJECT = new object();
private static bool ImageDefinitionsLoaded { get; set; }
private static ImageDescriptor FindDescriptorWithKey(string key)
{
foreach (var d in WindowsDescriptors)
{
if (d.DefinitionKey.Equals(key, StringComparison.OrdinalIgnoreCase))
return d;
}
foreach (var d in LinuxDescriptors)
{
if (d.DefinitionKey.Equals(key, StringComparison.OrdinalIgnoreCase))
return d;
}
return null;
}
private static DescribeImagesRequest CreateDescribeImagesRequest(ImageDescriptor descriptor)
{
return new DescribeImagesRequest()
{
Owners = new List() { "amazon" },
Filters = new List()
{
new Filter(){Name = "name", Values = new List(){descriptor.NamePrefix}}
}
};
}
///
/// Parses the ami definition content into the ImageDescriptor members.
///
/// A reader of the ami definitions
private static void ParseAMIDefinitions(StreamReader reader)
{
try
{
var jdata = JsonMapper.ToObject(reader);
var platformTags = new string[]
{
WindowsImagesTag,
LinuxImagesTag
};
var parsedDefinitionsMap = new Dictionary();
foreach (var platformTag in platformTags)
{
var imageDefinitions = jdata[platformTag];
if (imageDefinitions == null)
{
Logger.InfoFormat("Parsing AMI definitions - did not find any images for platform tag '{0}'", platformTag);
continue;
}
for (int d = 0; d < imageDefinitions.Count; d++)
{
var def = imageDefinitions[d];
var key = (string)def[DefinitionKeyTag];
var prefix = (string)def[DefinitionPrefixTag];
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(prefix))
parsedDefinitionsMap[key] = prefix;
else
Logger.InfoFormat("Parsing AMI definitions - found malformed descriptor entry for definition index {0} in platform group {1}, discarded", d, platformTag);
}
}
foreach (var d in WindowsDescriptors)
{
if (parsedDefinitionsMap.ContainsKey(d.DefinitionKey))
d.NamePrefix = parsedDefinitionsMap[d.DefinitionKey];
else
Logger.InfoFormat("Parsing AMI definitions - did not find entry for Windows image descriptor '{0}' after parsing", d.DefinitionKey);
}
foreach (var d in LinuxDescriptors)
{
if (parsedDefinitionsMap.ContainsKey(d.DefinitionKey))
d.NamePrefix = parsedDefinitionsMap[d.DefinitionKey];
else
Logger.InfoFormat("Parsing AMI definitions - did not find entry for Linux image descriptor '{0}' after parsing", d.DefinitionKey);
}
}
catch (Exception e)
{
Logger.Error(e, "Exception whilst parsing AMI definitions file.");
}
}
private static AmazonEC2Config ConfigFromClient(IAmazonEC2 ec2Client)
{
var client = ec2Client as AmazonEC2Client;
if (client != null)
return client.Config as AmazonEC2Config;
return new AmazonEC2Config();
}
private static AmazonEC2Config CreateConfigFromClient(IAmazonEC2 ec2Client, ImageDescriptor descriptor)
{
if (ec2Client == null)
throw new ArgumentNullException("ec2Client");
if (descriptor == null)
throw new ArgumentNullException("descriptor");
var config = ConfigFromClient(ec2Client);
return config;
}
#endregion
///
/// This class identifies an image that will be looked up using a logical
/// key independent of release (RTM) or service pack (SPx) designations,
/// always returning the latest version of an image.
///
public class ImageDescriptor
{
internal ImageDescriptor(string definitionKey)
{
this.DefinitionKey = definitionKey;
}
///
/// The logical name assigned to this image in the backing definitions file.
/// This key is independent of RTM/service pack number.
///
public string DefinitionKey
{
get;
private set;
}
///
/// The name prefix or pattern of the Amazon machine image that will be looked up.
///
public string NamePrefix
{
get;
internal set;
}
///
/// Override to return back the NamePrefix
///
///
public override string ToString()
{
return this.NamePrefix;
}
}
}
}