public static async Task <ImageAndOsType> UpdateImageAndOsTypeAsync( this IClient client, string imageName, string location) { if (imageName.Contains(':')) { var imageArray = imageName.Split(':'); if (imageArray.Length != 4) { throw new InvalidOperationException( string.Format(Resources.InvalidImageName, imageName)); } var image = new ImageReference { Publisher = imageArray[0], Offer = imageArray[1], Sku = imageArray[2], Version = imageArray[3], }; var compute = client.GetClient <ComputeManagementClient>(); if (image.Version.ToLower() == "latest") { var images = await compute.VirtualMachineImages.ListAsync( location, image.Publisher, image.Offer, image.Sku); // According to Compute API: // "The allowed formats are Major.Minor.Build or 'latest'. // Major, Minor, and Build are decimal numbers." image.Version = images .Select(i => ImageVersion.Parse(i.Name)) .Aggregate((a, b) => a.CompareTo(b) < 0 ? b : a) .ToString(); } var imageModel = await compute.VirtualMachineImages.GetAsync( location, image.Publisher, image.Offer, image.Sku, image.Version); return(new ImageAndOsType(imageModel.OsDiskImage.OperatingSystem, image)); } else { // get image return(Images .Instance .SelectMany(osAndMap => osAndMap .Value .Where(nameAndImage => nameAndImage.Key.ToLower() == imageName.ToLower()) .Select(nameAndImage => new ImageAndOsType( osAndMap.Key == "Windows" ? OperatingSystemTypes.Windows : OperatingSystemTypes.Linux, nameAndImage.Value))) .FirstOrDefault()); } }
public void CompareToTest() { var a = ImageVersion.Parse("1.23.456"); var b = ImageVersion.Parse("1.23"); var c = ImageVersion.Parse("01.023"); var d = ImageVersion.Parse("1.23.457"); Assert.Equal(1, a.CompareTo(b)); Assert.Equal(-1, b.CompareTo(a)); Assert.Equal(0, b.CompareTo(c)); Assert.Equal(-1, a.CompareTo(d)); Assert.Equal(1, d.CompareTo(a)); }
public static async Task <ImageAndOsType> UpdateImageAndOsTypeAsync( this IClient client, ImageAndOsType imageAndOsType, string resourceGroupName, string imageName, string location) { if (imageAndOsType != null) { return(imageAndOsType); } var compute = client.GetClient <ComputeManagementClient>(); if (imageName.Contains(':')) { if (location == null) { return(null); } var imageArray = imageName.Split(':'); if (imageArray.Length != 4) { throw new InvalidOperationException( string.Format(Resources.InvalidImageName, imageName)); } var image = new ImageReference { Publisher = imageArray[0], Offer = imageArray[1], Sku = imageArray[2], Version = imageArray[3], }; if (image.Version.ToLower() == "latest") { var images = await compute.VirtualMachineImages.ListAsync( location, image.Publisher, image.Offer, image.Sku); // According to Compute API: // "The allowed formats are Major.Minor.Build or 'latest'. // Major, Minor, and Build are decimal numbers." image.Version = images .Select(i => ImageVersion.Parse(i.Name)) .Aggregate((a, b) => a.CompareTo(b) < 0 ? b : a) .ToString(); } var imageModel = await compute.VirtualMachineImages.GetAsync( location, image.Publisher, image.Offer, image.Sku, image.Version); return(new ImageAndOsType( imageModel.OsDiskImage.OperatingSystem, image, imageModel.DataDiskImages.GetLuns())); } else if (imageName.Contains("/")) { var resourceId = ResourceId.TryParse(imageName); if (resourceId == null || resourceId.ResourceType.Namespace != ComputeStrategy.Namespace || (resourceId.ResourceType.Provider != "images") && resourceId.ResourceType.Provider != "galleries") { throw new ArgumentException(string.Format(Resources.ComputeInvalidImageName, imageName)); } if (resourceId.ResourceType.Provider == "galleries") { var compute2 = client.GetClient <ComputeManagementClient>(); compute2.SubscriptionId = resourceId.SubscriptionId; return(await compute2.GetGalleryImageAndOsTypeAsync(resourceId.ResourceGroupName, imageName)); } else { return(await compute.GetImageAndOsTypeAsync(resourceId.ResourceGroupName, resourceId.Name)); } } else { try { return(await compute.GetImageAndOsTypeAsync(resourceGroupName, imageName)); } catch { } // get generic image var result = Images .Instance .SelectMany(osAndMap => osAndMap .Value .Where(nameAndImage => nameAndImage.Key.ToLower() == imageName.ToLower()) .Select(nameAndImage => new ImageAndOsType( osAndMap.Key == "Windows" ? OperatingSystemTypes.Windows : OperatingSystemTypes.Linux, nameAndImage.Value, null))) .FirstOrDefault(); if (result == null) { throw new ArgumentException(string.Format(Resources.ComputeNoImageFound, imageName)); } return(result); } }