Exemple #1
0
        public DnsRecordSet CreateDnsRecordSet(string zoneName, string resourceGroupName, string relativeRecordSetName, uint ttl, RecordType recordType, Hashtable[] tags, bool overwrite)
        {
            RecordSetCreateOrUpdateResponse response = this.DnsManagementClient.RecordSets.CreateOrUpdate(
                resourceGroupName,
                zoneName,
                relativeRecordSetName,
                recordType,
                new RecordSetCreateOrUpdateParameters
            {
                IfNoneMatch = overwrite ? null : "*",
                RecordSet   = new RecordSet
                {
                    Name       = relativeRecordSetName,
                    Location   = DnsResourceLocation,
                    Tags       = TagsConversionHelper.CreateTagDictionary(tags, validate: true),
                    ETag       = null,
                    Properties = new RecordSetProperties
                    {
                        Ttl         = ttl,
                        AaaaRecords = recordType == RecordType.AAAA ? new List <Management.Dns.Models.AaaaRecord>() : null,
                        ARecords    = recordType == RecordType.A ? new List <Management.Dns.Models.ARecord>() : null,
                        CnameRecord = null,
                        MxRecords   = recordType == RecordType.MX ? new List <Management.Dns.Models.MxRecord>() : null,
                        NsRecords   = recordType == RecordType.NS ? new List <Management.Dns.Models.NsRecord>() : null,
                        PtrRecords  = recordType == RecordType.PTR ? new List <Management.Dns.Models.PtrRecord>() : null,
                        SoaRecord   = null,
                        SrvRecords  = recordType == RecordType.SRV ? new List <Management.Dns.Models.SrvRecord>() : null,
                        TxtRecords  = recordType == RecordType.TXT ? new List <Management.Dns.Models.TxtRecord>() : null,
                    },
                }
            });

            return(GetPowerShellRecordSet(zoneName, resourceGroupName, response.RecordSet));
        }
Exemple #2
0
        public DnsRecordSet UpdateDnsRecordSet(DnsRecordSet recordSet, bool overwrite)
        {
            RecordSetCreateOrUpdateResponse response = this.DnsManagementClient.RecordSets.CreateOrUpdate(
                recordSet.ResourceGroupName,
                recordSet.ZoneName,
                recordSet.Name,
                recordSet.RecordType,
                new RecordSetCreateOrUpdateParameters
            {
                IfNoneMatch = null,
                RecordSet   = new RecordSet
                {
                    Name       = recordSet.Name,
                    Location   = DnsResourceLocation,
                    Tags       = TagsConversionHelper.CreateTagDictionary(recordSet.Tags, validate: true),
                    ETag       = overwrite ? "*" : recordSet.Etag,
                    Properties = new RecordSetProperties
                    {
                        Ttl         = recordSet.Ttl,
                        AaaaRecords = recordSet.RecordType == RecordType.AAAA ? GetMamlRecords <AaaaRecord, Management.Dns.Models.AaaaRecord>(recordSet.Records) : null,
                        ARecords    = recordSet.RecordType == RecordType.A ? GetMamlRecords <ARecord, Management.Dns.Models.ARecord>(recordSet.Records) : null,
                        MxRecords   = recordSet.RecordType == RecordType.MX ? GetMamlRecords <MxRecord, Management.Dns.Models.MxRecord>(recordSet.Records) : null,
                        NsRecords   = recordSet.RecordType == RecordType.NS ? GetMamlRecords <NsRecord, Management.Dns.Models.NsRecord>(recordSet.Records) : null,
                        SrvRecords  = recordSet.RecordType == RecordType.SRV ? GetMamlRecords <SrvRecord, Management.Dns.Models.SrvRecord>(recordSet.Records) : null,
                        TxtRecords  = recordSet.RecordType == RecordType.TXT ? GetMamlRecords <TxtRecord, Management.Dns.Models.TxtRecord>(recordSet.Records) : null,
                        SoaRecord   = recordSet.RecordType == RecordType.SOA ? GetMamlRecords <SoaRecord, Management.Dns.Models.SoaRecord>(recordSet.Records).SingleOrDefault() : null,
                        CnameRecord = recordSet.RecordType == RecordType.CNAME ? GetMamlRecords <CnameRecord, Management.Dns.Models.CnameRecord>(recordSet.Records).SingleOrDefault() : null,
                    }
                }
            });

            return(GetPowerShellRecordSet(recordSet.ZoneName, recordSet.ResourceGroupName, response.RecordSet));
        }
        public void UpdateRecordSetPreconditionFailed()
        {
            using (UndoContext context = UndoContext.Current)
            {
                context.Start();
                SingleRecordSetTestContext        testContext      = SetupSingleRecordSetTest();
                RecordSetCreateOrUpdateParameters createParameters = testContext.TestRecordSkeleton;
                createParameters.RecordSet.Properties.CnameRecord = new CnameRecord {
                    Cname = "www.contoso.example.com"
                };

                RecordSetCreateOrUpdateResponse createResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.CNAME,
                    ifMatch: null,
                    ifNoneMatch: null,
                    parameters: createParameters);

                RecordSetCreateOrUpdateParameters updateParameters = new RecordSetCreateOrUpdateParameters {
                    RecordSet = createResponse.RecordSet
                };
                updateParameters.RecordSet.ETag = "somegibberish";

                // expect Precondition Failed 412
                TestHelpers.AssertThrows <CloudException>(
                    () => testContext.DnsClient.RecordSets.CreateOrUpdate(
                        testContext.ResourceGroup.Name,
                        testContext.ZoneName,
                        testContext.RecordSetName,
                        RecordType.CNAME,
                        ifMatch: null,
                        ifNoneMatch: null,
                        parameters: updateParameters),
                    exceptionAsserts: ex => ex.Error.Code == "PreconditionFailed");

                // expect Precondition Failed 412
                TestHelpers.AssertThrows <CloudException>(
                    () => testContext.DnsClient.RecordSets.Delete(
                        testContext.ResourceGroup.Name,
                        testContext.ZoneName,
                        testContext.RecordSetName,
                        RecordType.CNAME,
                        ifMatch: null,
                        ifNoneMatch: null),
                    exceptionAsserts: ex => ex.Error.Code == "PreconditionFailed");

                testContext.DnsClient.RecordSets.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.CNAME,
                    ifMatch: null,
                    ifNoneMatch: null);

                testContext.DnsClient.Zones.Delete(testContext.ResourceGroup.Name, testContext.ZoneName, ifMatch: null, ifNoneMatch: null);
            }
        }
        public void UpdateSoa()
        {
            using (UndoContext context = UndoContext.Current)
            {
                context.Start();
                SingleRecordSetTestContext testContext = SetupSingleRecordSetTest();

                // SOA for the zone should already exist
                RecordSetGetResponse getresponse = testContext.DnsClient.RecordSets.Get(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    "@",
                    RecordType.SOA);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                RecordSet soaResource = getresponse.RecordSet;
                Assert.NotNull(soaResource);
                Assert.NotNull(soaResource.Properties.SoaRecord);

                soaResource.Properties.SoaRecord.ExpireTime  = 123;
                soaResource.Properties.SoaRecord.MinimumTtl  = 1234;
                soaResource.Properties.SoaRecord.RefreshTime = 12345;
                soaResource.Properties.SoaRecord.RetryTime   = 123456;

                var updateParameters = new RecordSetCreateOrUpdateParameters {
                    RecordSet = soaResource
                };

                RecordSetCreateOrUpdateResponse updateResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    "@",
                    RecordType.SOA,
                    updateParameters);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(soaResource, updateResponse.RecordSet, ignoreEtag: true),
                    "Response body of Update does not match expectations");

                getresponse = testContext.DnsClient.RecordSets.Get(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    "@",
                    RecordType.SOA);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(updateResponse.RecordSet, getresponse.RecordSet),
                    "Response body of Get does not match expectations");

                // SOA will get deleted with the zone
                testContext.DnsClient.Zones.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    new ZoneDeleteParameters());
            }
        }
        private void RecordSetCreateGet(
            RecordType recordType,
            Action <RecordSetCreateOrUpdateParameters> setRecordsAction)
        {
            using (UndoContext context = UndoContext.Current)
            {
                context.Start(currentMethodStackDepth: 4);
                SingleRecordSetTestContext        testContext      = SetupSingleRecordSetTest();
                RecordSetCreateOrUpdateParameters createParameters = testContext.TestRecordSkeleton;
                setRecordsAction(createParameters);

                RecordSetCreateOrUpdateResponse createResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    recordType,
                    ifMatch: null,
                    ifNoneMatch: null,
                    parameters: createParameters);

                Assert.Equal(HttpStatusCode.Created, createResponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(createParameters.RecordSet, createResponse.RecordSet, ignoreEtag: true),
                    "Response body of Create does not match expectations");
                Assert.False(string.IsNullOrWhiteSpace(createResponse.RecordSet.ETag));

                var getresponse = testContext.DnsClient.RecordSets.Get(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    recordType);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(createResponse.RecordSet, getresponse.RecordSet, ignoreEtag: false),
                    "Response body of Get does not match expectations");

                // BUG 2364951: should work without specifying ETag
                AzureOperationResponse deleteResponse = testContext.DnsClient.RecordSets.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    recordType,
                    ifMatch: null,
                    ifNoneMatch: null);
                Assert.Equal(HttpStatusCode.OK, deleteResponse.StatusCode);

                deleteResponse = testContext.DnsClient.Zones.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    ifMatch: null,
                    ifNoneMatch: null);
            }
        }
        public void CrudRecordSetFullCycle()
        {
            using (UndoContext context = UndoContext.Current)
            {
                context.Start();
                SingleRecordSetTestContext        testContext      = SetupSingleRecordSetTest();
                RecordSetCreateOrUpdateParameters createParameters = testContext.TestRecordSkeleton;
                createParameters.RecordSet.Properties.ARecords = new List <ARecord> {
                    new ARecord {
                        Ipv4Address = "123.32.1.0"
                    }
                };
                createParameters.RecordSet.Properties.Ttl = 60;

                // Create the records clean, verify response
                RecordSetCreateOrUpdateResponse createResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A,
                    createParameters);

                Assert.Equal(HttpStatusCode.Created, createResponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(createParameters.RecordSet, createResponse.RecordSet, ignoreEtag: true),
                    "Response body of Create does not match expectations");
                Assert.False(string.IsNullOrWhiteSpace(createResponse.RecordSet.ETag));

                // Retrieve the zone after create, verify response
                var getresponse = testContext.DnsClient.RecordSets.Get(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(createResponse.RecordSet, getresponse.RecordSet, ignoreEtag: false),
                    "Response body of Get does not match expectations");

                // Call Update on the object returned by Create (important distinction from Get below)
                Models.RecordSet createdRecordSet = createResponse.RecordSet;
                createdRecordSet.Tags = new Dictionary <string, string> {
                    { "tag1", "value1" }, { "tag2", "value2" }
                };
                createdRecordSet.Properties.Ttl      = 120;
                createdRecordSet.Properties.ARecords = new List <ARecord>
                {
                    new ARecord {
                        Ipv4Address = "123.32.1.0"
                    },
                    new ARecord {
                        Ipv4Address = "101.10.0.1"
                    }
                };

                RecordSetCreateOrUpdateResponse updateResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A,
                    new RecordSetCreateOrUpdateParameters {
                    RecordSet = createdRecordSet
                });

                Assert.Equal(HttpStatusCode.OK, updateResponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(createdRecordSet, updateResponse.RecordSet, ignoreEtag: true),
                    "Response body of Update does not match expectations");
                Assert.False(string.IsNullOrWhiteSpace(updateResponse.RecordSet.ETag));

                // Retrieve the records after create, verify response
                getresponse = testContext.DnsClient.RecordSets.Get(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A);

                Assert.Equal(HttpStatusCode.OK, getresponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(updateResponse.RecordSet, getresponse.RecordSet),
                    "Response body of Get does not match expectations");

                // Call Update on the object returned by Get (important distinction from Create above)
                Models.RecordSet retrievedRecordSet = getresponse.RecordSet;
                retrievedRecordSet.Tags = new Dictionary <string, string> {
                    { "tag1", "value1" }, { "tag2", "value2" }, { "tag3", "value3" }
                };
                retrievedRecordSet.Properties.Ttl      = 180;
                retrievedRecordSet.Properties.ARecords = new List <ARecord>
                {
                    new ARecord {
                        Ipv4Address = "123.32.1.0"
                    },
                    new ARecord {
                        Ipv4Address = "101.10.0.1"
                    },
                    new ARecord {
                        Ipv4Address = "22.33.44.55"
                    },
                };

                updateResponse = testContext.DnsClient.RecordSets.CreateOrUpdate(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A,
                    new RecordSetCreateOrUpdateParameters {
                    RecordSet = retrievedRecordSet
                });

                Assert.Equal(HttpStatusCode.OK, updateResponse.StatusCode);
                Assert.True(
                    TestHelpers.AreEqual(retrievedRecordSet, updateResponse.RecordSet, ignoreEtag: true),
                    "Response body of Update does not match expectations");
                Assert.False(string.IsNullOrWhiteSpace(updateResponse.RecordSet.ETag));

                // Delete the record set
                AzureOperationResponse deleteResponse = testContext.DnsClient.RecordSets.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    testContext.RecordSetName,
                    RecordType.A,
                    new RecordSetDeleteParameters());
                Assert.Equal(HttpStatusCode.OK, deleteResponse.StatusCode);

                // Delete the zone
                deleteResponse = testContext.DnsClient.Zones.Delete(
                    testContext.ResourceGroup.Name,
                    testContext.ZoneName,
                    new ZoneDeleteParameters());
            }
        }
        /*
         *   MAIN
         */
        static void Main(string[] args)
        {
            try
            {
                /*
                 *  validate args
                 */
                if (args.Length != 3)
                {
                    Console.WriteLine("Must provide the subscription ID, resource group and  zone name on the command line:");
                    Console.WriteLine(string.Format("e.g. {0} a11765aa-da85-55df-322c-f43434afcdb2 myRG mycontoso.com", System.AppDomain.CurrentDomain.FriendlyName));
                    PauseBeforeExit();
                    return;
                }
                string subID    = args[0];
                string rgName   = args[1];
                string zoneName = args[2];


                /*
                 *   Authorization
                 */

                //  get the JWT for the subscription, will be prompted for credentials
                Console.WriteLine(string.Format("Logging into subscription {0}...", subID));
                string jwt = JWTHelper.GetAuthToken(tenantId: JWTHelper.GetSubscriptionTenantId(subID), alwaysPrompt: true);

                //  make the credentials for your subscription ID
                TokenCloudCredentials tcCreds = new TokenCloudCredentials(subID, jwt);


                /*
                 *   Make sure we have a resource group as all ARM resources are in a resouce group
                 */

                //  get the resource management client
                ResourceManagementClient resourceClient = new ResourceManagementClient(tcCreds);

                //  check if the resource group already exists
                ResourceGroupExistsResult rgExists = resourceClient.ResourceGroups.CheckExistence(rgName);
                if (rgExists.Exists)
                {
                    Console.WriteLine(string.Format("ResourceGroup {0} already exists, but that's ok we'll reuse it...", rgName));
                }
                else
                {
                    Console.WriteLine(string.Format("Creating resouce group {0}...", rgName));
                    resourceClient.ResourceGroups.CreateOrUpdate(rgName, new ResourceGroup("northeurope"));
                }


                /*
                 *  Create a zone and some record sets
                 *  for Private Preview, zone name must be globally unique so it may already exist!
                 */

                //  get the DNS management client
                DnsManagementClient dnsClient = new DnsManagementClient(tcCreds);

                // check we're registered for Microsoft.Network namespace
                if (!IsProviderRegistered(resourceClient.Providers.List(null).Providers, "Microsoft.Network"))
                {
                    Console.WriteLine("Registering with Microsoft.Network namespace...");
                    resourceClient.Providers.Register("Microsoft.Network");
                }
                else
                {
                    Console.WriteLine("Already registered with Microsoft.Network namespace.");
                }

                //  create a DNS zone
                Console.WriteLine(string.Format("Creating zone and records for {0}...", zoneName));
                Zone z = new Zone("global");
                z.Properties = new ZoneProperties();
                z.Tags.Add("dept", "shopping");
                z.Tags.Add("env", "production");
                ZoneCreateOrUpdateResponse responseCreateZone = dnsClient.Zones.CreateOrUpdate(rgName, zoneName, new ZoneCreateOrUpdateParameters(z));

                // make some records (dnsClient.RecordSets will become dnsClient.RecordSetsets in future)
                RecordSet rsWwwA = new RecordSet("global");
                rsWwwA.Properties          = new RecordSetProperties(3600);
                rsWwwA.Properties.ARecords = new List <ARecord>();
                rsWwwA.Properties.ARecords.Add(new ARecord("1.2.3.4"));
                rsWwwA.Properties.ARecords.Add(new ARecord("1.2.3.5"));
                RecordSetCreateOrUpdateResponse responseCreateA = dnsClient.RecordSets.CreateOrUpdate(rgName, zoneName, "www", RecordType.A, new RecordSetCreateOrUpdateParameters(rsWwwA));

                RecordSet rsWwwAaaa = new RecordSet("global");
                rsWwwAaaa.Properties             = new RecordSetProperties(3600);
                rsWwwAaaa.Properties.AaaaRecords = new List <AaaaRecord>();
                rsWwwAaaa.Properties.AaaaRecords.Add(new AaaaRecord("1:1:1:1::1"));
                rsWwwAaaa.Properties.AaaaRecords.Add(new AaaaRecord("1:1:1:1::2"));
                RecordSetCreateOrUpdateResponse responseCreateAAAA = dnsClient.RecordSets.CreateOrUpdate(rgName, zoneName, "www", RecordType.AAAA, new RecordSetCreateOrUpdateParameters(rsWwwAaaa));

                // list the zones & record sets in the resource group
                ZoneListResponse zoneListResponse = dnsClient.Zones.List(rgName, new ZoneListParameters());
                foreach (Zone zone in zoneListResponse.Zones)
                {
                    RecordSetListResponse recordSets = dnsClient.RecordSets.ListAll(rgName, zone.Name, new RecordSetListParameters());
                    WriteRecordSetsToConsole(zone.Name, recordSets.RecordSets);
                }


                /*
                 *  ETAGs - set to a value to check record hasn't changed, set to * to make sure it exists
                 *
                 *  Also in RecordSetCreateOrUpdateParameters:
                 *      IfNoneMatch = *, only succesed if resource does not exist
                 */

                //  get the RecordSet for {Name=www, Type=A}
                RecordSetGetResponse getWwwA = dnsClient.RecordSets.Get(rgName, zoneName, "www", RecordType.A);
                string previousETag          = getWwwA.RecordSet.ETag;
                Console.WriteLine(string.Format("ETag for www.{0} is {1}", zoneName, previousETag));

                //  make a new record set, setting the ETag
                RecordSet newWwwA = new RecordSet("global");
                newWwwA.Properties          = new RecordSetProperties(3600);
                newWwwA.Properties.ARecords = new List <ARecord>();
                newWwwA.Properties.ARecords.Add(new ARecord("4.3.2.1"));
                newWwwA.Properties.ARecords.Add(new ARecord("5.3.2.1"));
                newWwwA.ETag = previousETag;

                // do two creates, second one will fail
                try
                {
                    Console.WriteLine("Doing first update - should succeed");
                    RecordSetCreateOrUpdateResponse responseETagUpdate1 = dnsClient.RecordSets.CreateOrUpdate(rgName, zoneName, "www", RecordType.A, new RecordSetCreateOrUpdateParameters(newWwwA));
                    Console.WriteLine(string.Format("Update set Etag to {0}", responseETagUpdate1.RecordSet.ETag));

                    Console.WriteLine("Doing second update - should fail because ETag changed!");
                    RecordSetCreateOrUpdateResponse responseETagUpdate2 = dnsClient.RecordSets.CreateOrUpdate(rgName, zoneName, "www", RecordType.A, new RecordSetCreateOrUpdateParameters(newWwwA));
                    Console.WriteLine(string.Format("Update set Etag to {0}", responseETagUpdate2.RecordSet.ETag));
                }
                catch (Hyak.Common.CloudException e)
                {
                    //  check if the precondition failed
                    if (e.Response.StatusCode == System.Net.HttpStatusCode.PreconditionFailed)
                    {
                        Console.WriteLine("The ETag precondition failed");
                    }
                    else
                    {
                        throw e;
                    }
                }

                // show records now
                WriteRecordSetsToConsole(zoneName, dnsClient.RecordSets.ListAll(rgName, zoneName, new RecordSetListParameters()).RecordSets);


                /*
                 *  End
                 */

                //  get one of the NS records
                RecordSetGetResponse getNS = dnsClient.RecordSets.Get(rgName, zoneName, "@", RecordType.NS);
                string firstNS             = getNS.RecordSet.Properties.NsRecords[0].Nsdname;

                //  show how to resolve record
                string url = string.Format("http://www.digwebinterface.com/?hostnames=www.{0}&type=&ns=self&nameservers={1}", zoneName, firstNS);
                Console.WriteLine(string.Format("To see the record resolve, goto: {0}", url));

                //  done
                PauseBeforeExit();

                // if we dare to delete the resource group :)
                // resourceClient.ResourceGroups.DeleteAsync(rgName);
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Exception Caught: {0}", e.Message));
                PauseBeforeExit();
            }
        }