Esempio n. 1
0
        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());
            }
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
            }
        }