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)); }
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(); } }