/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.microsoft.azure.management.dns.samples;
import com.microsoft.azure.PagedList;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.appservice.PricingTier;
import com.microsoft.azure.management.appservice.CustomHostNameDnsRecordType;
import com.microsoft.azure.management.appservice.WebApp;
import com.microsoft.azure.management.compute.KnownWindowsVirtualMachineImage;
import com.microsoft.azure.management.compute.VirtualMachine;
import com.microsoft.azure.management.compute.VirtualMachineSizeTypes;
import com.microsoft.azure.management.dns.ARecordSet;
import com.microsoft.azure.management.dns.CNameRecordSet;
import com.microsoft.azure.management.dns.DnsRecordSet;
import com.microsoft.azure.management.dns.DnsZone;
import com.microsoft.azure.management.network.PublicIPAddress;
import com.microsoft.azure.management.resources.ResourceGroup;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext;
import com.microsoft.azure.management.samples.Utils;
import com.microsoft.rest.LogLevel;
import java.io.File;
/**
* Azure DNS sample for managing DNS zones.
* - Create a root DNS zone (contoso.com)
* - Create a web application
* - Add a CNAME record (www) to root DNS zone and bind it to web application host name
* - Creates a virtual machine with public IP
* - Add a A record (employees) to root DNS zone that points to virtual machine public IPV4 address
* - Creates a child DNS zone (partners.contoso.com)
* - Creates a virtual machine with public IP
* - Add a A record (partners) to child DNS zone that points to virtual machine public IPV4 address
* - Delegate from root domain to child domain by adding NS records
* - Remove A record from the root DNS zone
* - Delete the child DNS zone
*/
public class ManageDns {
/**
* Main function which runs the actual sample.
* @param azure instance of the azure client
* @return true if sample runs successfully
*/
public static boolean runSample(Azure azure) {
final String customDomainName = "THE CUSTOM DOMAIN THAT YOU OWN (e.g. contoso.com)";
final String rgName = SdkContext.randomResourceName("rgNEMV_", 24);
final String appServicePlanName = SdkContext.randomResourceName("jplan1_", 15);
final String webAppName = SdkContext.randomResourceName("webapp1-", 20);
try {
ResourceGroup resourceGroup = azure.resourceGroups().define(rgName)
.withRegion(Region.US_EAST2)
.create();
//============================================================
// Creates root DNS Zone
System.out.println("Creating root DNS zone " + customDomainName + "...");
DnsZone rootDnsZone = azure.dnsZones().define(customDomainName)
.withExistingResourceGroup(resourceGroup)
.create();
System.out.println("Created root DNS zone " + rootDnsZone.name());
Utils.print(rootDnsZone);
//============================================================
// Sets NS records in the parent zone (hosting custom domain) to make Azure DNS the authoritative
// source for name resolution for the zone
System.out.println("Go to your registrar portal and configure your domain " + customDomainName
+ " with following name server addresses");
for (String nameServer : rootDnsZone.nameServers()) {
System.out.println(" " + nameServer);
}
System.out.println("Press a key after finishing above step");
System.in.read();
//============================================================
// Creates a web App
System.out.println("Creating Web App " + webAppName + "...");
WebApp webApp = azure.webApps().define(webAppName)
.withRegion(Region.US_EAST2)
.withExistingResourceGroup(rgName)
.withNewWindowsPlan(PricingTier.BASIC_B1)
.defineSourceControl()
.withPublicGitRepository("https://github.com/jianghaolu/azure-site-test")
.withBranch("master")
.attach()
.create();
System.out.println("Created web app " + webAppName);
Utils.print(webApp);
//============================================================
// Creates a CName record and bind it with the web app
// Step 1: Adds CName Dns record to root DNS zone that specify web app host domain as an
// alias for www.[customDomainName]
System.out.println("Updating DNS zone by adding a CName record...");
rootDnsZone = rootDnsZone.update()
.withCNameRecordSet("www", webApp.defaultHostName())
.apply();
System.out.println("DNS zone updated");
Utils.print(rootDnsZone);
// Waiting for a minute for DNS CName entry to propagate
System.out.println("Waiting a minute for CName record entry to propagate...");
Thread.sleep(60 * 1000);
// Step 2: Adds a web app host name binding for www.[customDomainName]
// This binding action will fail if the CName record propagation is not yet completed
System.out.println("Updating Web app with host name binding...");
webApp.update()
.defineHostnameBinding()
.withThirdPartyDomain(customDomainName)
.withSubDomain("www")
.withDnsRecordType(CustomHostNameDnsRecordType.CNAME)
.attach()
.apply();
System.out.println("Web app updated");
Utils.print(webApp);
//============================================================
// Creates a virtual machine with public IP
System.out.println("Creating a virtual machine with public IP...");
VirtualMachine virtualMachine1 = azure.virtualMachines()
.define(SdkContext.randomResourceName("employeesvm-", 20))
.withRegion(Region.US_EAST)
.withExistingResourceGroup(resourceGroup)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withNewPrimaryPublicIPAddress(SdkContext.randomResourceName("empip-", 20))
.withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER)
.withAdminUsername("testuser")
.withAdminPassword("12NewPA$$w0rd!")
.withSize(VirtualMachineSizeTypes.STANDARD_D1_V2)
.create();
System.out.println("Virtual machine created");
//============================================================
// Update DNS zone by adding a A record in root DNS zone pointing to virtual machine IPv4 address
PublicIPAddress vm1PublicIPAddress = virtualMachine1.getPrimaryPublicIPAddress();
System.out.println("Updating root DNS zone " + customDomainName + "...");
rootDnsZone = rootDnsZone.update()
.defineARecordSet("employees")
.withIPv4Address(vm1PublicIPAddress.ipAddress())
.attach()
.apply();
System.out.println("Updated root DNS zone " + rootDnsZone.name());
Utils.print(rootDnsZone);
// Prints the CName and A Records in the root DNS zone
//
System.out.println("Getting CName record set in the root DNS zone " + customDomainName + "...");
PagedList<CNameRecordSet> cnameRecordSets = rootDnsZone
.cNameRecordSets()
.list();
for (CNameRecordSet cnameRecordSet : cnameRecordSets) {
System.out.println("Name: " + cnameRecordSet.name() + " Canonical Name: " + cnameRecordSet.canonicalName());
}
System.out.println("Getting ARecord record set in the root DNS zone " + customDomainName + "...");
PagedList<ARecordSet> aRecordSets = rootDnsZone
.aRecordSets()
.list();
for (ARecordSet aRecordSet : aRecordSets) {
System.out.println("Name: " + aRecordSet.name());
for (String ipv4Address : aRecordSet.ipv4Addresses()) {
System.out.println(" " + ipv4Address);
}
}
//============================================================
// Creates a child DNS zone
String partnerSubDomainName = "partners." + customDomainName;
System.out.println("Creating child DNS zone " + partnerSubDomainName + "...");
DnsZone partnersDnsZone = azure.dnsZones().define(partnerSubDomainName)
.withExistingResourceGroup(resourceGroup)
.create();
System.out.println("Created child DNS zone " + partnersDnsZone.name());
Utils.print(partnersDnsZone);
//============================================================
// Adds NS records in the root dns zone to delegate partners.[customDomainName] to child dns zone
System.out.println("Updating root DNS zone " + rootDnsZone + "...");
DnsRecordSet.UpdateDefinitionStages.WithNSRecordNameServerOrAttachable<DnsZone.Update> nsRecordStage = rootDnsZone
.update()
.defineNSRecordSet("partners")
.withNameServer(partnersDnsZone.nameServers().get(0));
for (int i = 1; i < partnersDnsZone.nameServers().size(); i++) {
nsRecordStage = nsRecordStage.withNameServer(partnersDnsZone.nameServers().get(i));
}
nsRecordStage
.attach()
.apply();
System.out.println("Root DNS zone updated");
Utils.print(rootDnsZone);
//============================================================
// Creates a virtual machine with public IP
System.out.println("Creating a virtual machine with public IP...");
VirtualMachine virtualMachine2 = azure.virtualMachines()
.define(SdkContext.randomResourceName("partnersvm-", 20))
.withRegion(Region.US_EAST)
.withExistingResourceGroup(resourceGroup)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withNewPrimaryPublicIPAddress(SdkContext.randomResourceName("ptnerpip-", 20))
.withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER)
.withAdminUsername("testuser")
.withAdminPassword("12NewPA$$w0rd!")
.withSize(VirtualMachineSizeTypes.STANDARD_D1_V2)
.create();
System.out.println("Virtual machine created");
//============================================================
// Update child DNS zone by adding a A record pointing to virtual machine IPv4 address
PublicIPAddress vm2PublicIPAddress = virtualMachine2.getPrimaryPublicIPAddress();
System.out.println("Updating child DNS zone " + partnerSubDomainName + "...");
partnersDnsZone = partnersDnsZone.update()
.defineARecordSet("@")
.withIPv4Address(vm2PublicIPAddress.ipAddress())
.attach()
.apply();
System.out.println("Updated child DNS zone " + partnersDnsZone.name());
Utils.print(partnersDnsZone);
//============================================================
// Removes A record entry from the root DNS zone
System.out.println("Removing A Record from root DNS zone " + rootDnsZone.name() + "...");
rootDnsZone = rootDnsZone.update()
.withoutARecordSet("employees")
.apply();
System.out.println("Removed A Record from root DNS zone");
Utils.print(rootDnsZone);
//============================================================
// Deletes the DNS zone
System.out.println("Deleting child DNS zone " + partnersDnsZone.name() + "...");
azure.dnsZones().deleteById(partnersDnsZone.id());
System.out.println("Deleted child DNS zone " + partnersDnsZone.name());
return true;
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
System.out.println("Deleting Resource Group: " + rgName);
azure.resourceGroups().beginDeleteByName(rgName);
System.out.println("Deleted Resource Group: " + rgName);
} catch (NullPointerException npe) {
System.out.println("Did not create any resources in Azure. No clean up is necessary");
} catch (Exception g) {
g.printStackTrace();
}
}
return false;
}
/**
* Main entry point.
* @param args the parameters
*/
public static void main(String[] args) {
try {
//=============================================================
// Authenticate
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));
Azure azure = Azure.configure()
.withLogLevel(LogLevel.BASIC)
.authenticate(credFile)
.withDefaultSubscription();
// Print selected subscription
System.out.println("Selected subscription: " + azure.subscriptionId());
runSample(azure);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}