// This test put multiple zonal virtual machine's NIC into backend pool of a zone-redundant load balancer.
        // There is a bug in the service, where such an attempt will fail with error
        // "error": {
        //    "code": "NetworkInterfaceAndLoadBalancerAreInDifferentAvailabilitySets",
        //    "message": "Network interface /subscriptions/<sub-id>/resourceGroups/<rg-name>/providers/Microsoft.Network/networkInterfaces/<nic-name> uses load balancer /subscriptions/<sub-id>/resourceGroups/<rg-name>/providers/Microsoft.Compute/virtualMachines/<vm-name>).",
        //    "details": []
        // }
        // Enable this test once it is fixed.
        //
        public void CanCreateZonedVMsAndAssociateThemWithSingleBackendPoolOfZoneResilientLB()
        {
            using (var context = FluentMockContext.Start(GetType().FullName))
            {
                string rgName = TestUtilities.GenerateName("rgzoned");
                try
                {
                    var    region      = Region.USEast2;
                    string networkName = TestUtilities.GenerateName("net");

                    var azure   = TestHelper.CreateRollupClient();
                    var network = azure.Networks.Define(networkName)
                                  .WithRegion(region)
                                  .WithNewResourceGroup(rgName)
                                  .WithAddressSpace("10.0.0.0/28")
                                  .WithSubnet("subnet1", "10.0.0.0/29")
                                  .WithSubnet("subnet2", "10.0.0.8/29")
                                  .Create();

                    string pipDnsLabel = TestUtilities.GenerateName("pip");

                    var subnets = network.Subnets.Values.GetEnumerator();
                    // Define first regional virtual machine
                    //
                    subnets.MoveNext();
                    var creatableVM1 = azure.VirtualMachines
                                       .Define(TestUtilities.GenerateName("vm1"))
                                       .WithRegion(region)
                                       .WithExistingResourceGroup(rgName)
                                       .WithExistingPrimaryNetwork(network)
                                       .WithSubnet(subnets.Current.Name) // Put VM in first subnet
                                       .WithPrimaryPrivateIPAddressDynamic()
                                       .WithoutPrimaryPublicIPAddress()
                                       .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
                                       .WithRootUsername("Foo12")
                                       .WithRootPassword("abc!@#F0orL")
                                       // Optionals
                                       .WithAvailabilityZone(AvailabilityZoneId.Zone_1)
                                       .WithSize(VirtualMachineSizeTypes.StandardD3V2);

                    subnets.MoveNext();
                    var creatableVM2 = azure.VirtualMachines
                                       .Define(TestUtilities.GenerateName("vm2"))
                                       .WithRegion(region)
                                       .WithExistingResourceGroup(rgName)
                                       .WithExistingPrimaryNetwork(network)
                                       .WithSubnet(subnets.Current.Name) // Put VM in second subnet
                                       .WithPrimaryPrivateIPAddressDynamic()
                                       .WithoutPrimaryPublicIPAddress()
                                       .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
                                       .WithRootUsername("Foo12")
                                       .WithRootPassword("abc!@#F0orL")
                                       // Optionals
                                       .WithAvailabilityZone(AvailabilityZoneId.Zone_1)
                                       .WithSize(VirtualMachineSizeTypes.StandardD3V2);

                    ICreatedResources <IVirtualMachine> createdVMs = azure.VirtualMachines.Create(creatableVM1, creatableVM2);

                    var itr = createdVMs.GetEnumerator();
                    itr.MoveNext();
                    IVirtualMachine firstVirtualMachine = itr.Current;
                    itr.MoveNext();
                    IVirtualMachine secondVirtualMachine = itr.Current;

                    var publicIPAddress = azure.PublicIPAddresses
                                          .Define(pipDnsLabel)
                                          .WithRegion(region)
                                          .WithExistingResourceGroup(rgName)
                                          .WithStaticIP()
                                                                             // Optionals
                                          .WithSku(PublicIPSkuType.Standard) //  STANDARD LB requires STANDARD PIP
                                                                             // Create PIP
                                          .Create();

                    // Creates a Internet-Facing LoadBalancer with one front-end IP configuration and
                    // two backend pool associated with this IP Config
                    //
                    var           lbName = TestUtilities.GenerateName("lb");
                    ILoadBalancer lb     = azure.LoadBalancers
                                           .Define(lbName)
                                           .WithRegion(region)
                                           .WithExistingResourceGroup(rgName)
                                           .DefineLoadBalancingRule("rule-1")
                                           .WithProtocol(TransportProtocol.Tcp)
                                           .FromFrontend("front-end-1")
                                           .FromFrontendPort(80)
                                           .ToExistingVirtualMachines(firstVirtualMachine, secondVirtualMachine)
                                           .WithProbe("tcpProbe-1")
                                           .Attach()
                                           .DefinePublicFrontend("front-end-1") // Define the frontend IP configuration used by the LB rule
                                           .WithExistingPublicIPAddress(publicIPAddress)
                                           .Attach()
                                           .DefineTcpProbe("tcpProbe-1") // Define the Probe used by the LB rule
                                           .WithPort(25)
                                           .WithIntervalInSeconds(15)
                                           .WithNumberOfProbes(5)
                                           .Attach()
                                           .WithSku(LoadBalancerSkuType.Standard) // "zone-resilient LB" which don't have the constraint that all VMs needs to be in the same availability set
                                           .Create();

                    // Zone resilient LB does not care VMs are zoned or regional, in the above cases VMs are regional.
                    //
                    // rx.Completable.merge(firstVirtualMachine.startAsync(), secondVirtualMachine.startAsync()).await();

                    // Verify frontends
                    Assert.Equal(1, lb.Frontends.Count);
                    Assert.Equal(1, lb.PublicFrontends.Count);
                    Assert.Equal(0, lb.PrivateFrontends.Count);
                    ILoadBalancerFrontend frontend = lb.Frontends.Values.First();
                    Assert.True(frontend.IsPublic);
                    ILoadBalancerPublicFrontend publicFrontend = (ILoadBalancerPublicFrontend)frontend;
                    Assert.Equal(publicIPAddress.Id, publicFrontend.PublicIPAddressId, ignoreCase: true);

                    // Verify backends
                    Assert.Equal(1, lb.Backends.Count);

                    // Verify probes
                    Assert.Equal(1, lb.TcpProbes.Count);
                    Assert.True(lb.TcpProbes.ContainsKey("tcpProbe-1"));

                    // Verify rules
                    Assert.Equal(1, lb.LoadBalancingRules.Count);
                    Assert.True(lb.LoadBalancingRules.ContainsKey("rule-1"));
                    ILoadBalancingRule rule = lb.LoadBalancingRules["rule-1"];
                    Assert.NotNull(rule.Backend);
                    Assert.Equal("tcpProbe-1", rule.Probe.Name, ignoreCase: true);
                    // Zone resilient LB does not care VMs are zoned or regional, in the above cases VMs are zoned.
                    //

                    // Note that above configuration is not possible for BASIC LB, BASIC LB has following limitation
                    // It supports VMs only in a single availability Set in a backend pool, though multiple backend pool
                    // can be associated with VMs in the single availability set, you cannot create a set of VMs in another
                    // availability set and put it in a different backend pool.
                }
                finally
                {
                    try
                    {
                        var resourceManager = TestHelper.CreateResourceManager();
                        resourceManager.ResourceGroups.DeleteByName(rgName);
                    }
                    catch { }
                }
            }
        }
예제 #2
0
 private PrivateLinkServiceImpl WithFrontendIpConfiguration(ILoadBalancerFrontend loadBalancerFrontend)
 {
     frontendIpConfigurations[loadBalancerFrontend.Name] = loadBalancerFrontend.Inner;
     return(this);
 }
예제 #3
0
 PrivateLinkService.Update.IUpdate PrivateLinkService.Update.IWithFrontendIpConfiguration.WithFrontendIpConfiguration(ILoadBalancerFrontend loadBalancerFrontend)
 {
     return(WithFrontendIpConfiguration(loadBalancerFrontend));
 }
예제 #4
0
 PrivateLinkService.Definition.IWithCreate PrivateLinkService.Definition.IWithFrontendIpConfiguration.WithFrontendIpConfiguration(ILoadBalancerFrontend loadBalancerFrontend)
 {
     return(WithFrontendIpConfiguration(loadBalancerFrontend));
 }
예제 #5
0
        public void CanCreateUpdate()
        {
            using (var context = FluentMockContext.Start(GetType().FullName))
            {
                var rgName     = SdkContext.RandomResourceName("rg", 10);
                var vnetName   = SdkContext.RandomResourceName("vnet", 10);
                var subnetName = SdkContext.RandomResourceName("subnet", 10);
                var lbName     = SdkContext.RandomResourceName("lb", 10);
                var plsName    = SdkContext.RandomResourceName("pls", 10);

                var azure = TestHelper.CreateRollupClient();

                try
                {
                    var resourceGroup = azure.ResourceGroups.Define(rgName)
                                        .WithRegion(REGION)
                                        .Create();

                    var vnet = azure.Networks.Define(vnetName)
                               .WithRegion(REGION)
                               .WithExistingResourceGroup(resourceGroup)
                               .WithAddressSpace("10.0.0.0/16")
                               .WithSubnet(subnetName, "10.0.0.0/24")
                               .Create();

                    var loadBalancer = azure.LoadBalancers.Define(lbName)
                                       .WithRegion(REGION)
                                       .WithExistingResourceGroup(resourceGroup)
                                       .DefineLoadBalancingRule("myHttpRule")
                                       .WithProtocol(TransportProtocol.Tcp)
                                       .FromFrontend("myFrontEnd")
                                       .FromFrontendPort(80)
                                       .ToBackend("myBackEnd")
                                       .WithProbe("myProbe")
                                       .Attach()
                                       .DefinePrivateFrontend("myFrontEnd")
                                       .WithExistingSubnet(vnet, subnetName)
                                       .Attach()
                                       .DefineBackend("myBackEnd")
                                       .Attach()
                                       .DefineHttpProbe("myProbe")
                                       .WithRequestPath("/")
                                       .WithPort(80)
                                       .Attach()
                                       .WithSku(LoadBalancerSkuType.Standard)
                                       .Create();

                    vnet.Subnets[subnetName].Inner.PrivateLinkServiceNetworkPolicies = "Disabled";
                    vnet.Update()
                    .UpdateSubnet(subnetName)
                    .Parent()
                    .Apply();

                    ISubnet subnet = vnet.Subnets[subnetName];
                    ILoadBalancerFrontend lbFrontend = loadBalancer.Frontends["myFrontEnd"];

                    var privateLinkService = azure.PrivateLinkServices.Define(plsName)
                                             .WithExistingResourceGroup(resourceGroup)
                                             .WithRegion(REGION)
                                             .WithFrontendIpConfiguration(lbFrontend)
                                             .DefinePrivateLinkServiceIpConfiguration("myPrivateIPConfig")
                                             .SetAsPrimaryIpConfiguration()
                                             .WithSubnet(subnet.Inner.Id)
                                             .Attach()
                                             .Create();

                    Assert.NotNull(privateLinkService);
                    Assert.NotNull(privateLinkService.IpConfigurations);
                    Assert.True(privateLinkService.IpConfigurations.Count == 1);
                    Assert.False(privateLinkService.IsProxyProtocolEnabled);
                    Assert.True(privateLinkService.LoadBalancerFrontendIpConfigurations.Count == 1);

                    privateLinkService = azure.PrivateLinkServices.GetByResourceGroup(rgName, plsName);
                    Assert.Equal("myFrontEnd", privateLinkService.LoadBalancerFrontendIpConfigurations.First().Name);
                    Assert.Equal("myHttpRule", privateLinkService.LoadBalancerFrontendIpConfigurations.First().LoadBalancingRules["myHttpRule"].Name);

                    privateLinkService = azure.PrivateLinkServices.GetByResourceGroup(rgName, plsName);
                    privateLinkService.Update()
                    .EnableProxyProtocol()
                    .UpdatePrivateLinkServiceIpConfiguration("myPrivateIPConfig")
                    .WithStaticPrivateIpAllocation()
                    .WithPrivateIpAddress("10.0.0.5")
                    .Attach()
                    .Apply();

                    Assert.True(privateLinkService.IsProxyProtocolEnabled);
                    Assert.Equal(IPAllocationMethod.Static, privateLinkService.IpConfigurations[0].PrivateIPAllocationMethod);
                }
                finally
                {
                    try
                    {
                        azure.ResourceGroups.DeleteByName(rgName);
                    }
                    catch
                    {
                    }
                }
            }
        }