github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/builtin/providers/azurerm/resource_arm_dns_ns_record.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/jen20/riviera/dns" 9 ) 10 11 func resourceArmDnsNsRecord() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceArmDnsNsRecordCreate, 14 Read: resourceArmDnsNsRecordRead, 15 Update: resourceArmDnsNsRecordCreate, 16 Delete: resourceArmDnsNsRecordDelete, 17 Importer: &schema.ResourceImporter{ 18 State: schema.ImportStatePassthrough, 19 }, 20 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "resource_group_name": &schema.Schema{ 29 Type: schema.TypeString, 30 Required: true, 31 ForceNew: true, 32 }, 33 34 "zone_name": &schema.Schema{ 35 Type: schema.TypeString, 36 Required: true, 37 }, 38 39 "record": &schema.Schema{ 40 Type: schema.TypeSet, 41 Required: true, 42 Elem: &schema.Resource{ 43 Schema: map[string]*schema.Schema{ 44 "nsdname": &schema.Schema{ 45 Type: schema.TypeString, 46 Required: true, 47 }, 48 }, 49 }, 50 }, 51 52 "ttl": &schema.Schema{ 53 Type: schema.TypeInt, 54 Required: true, 55 }, 56 57 "tags": tagsSchema(), 58 }, 59 } 60 } 61 62 func resourceArmDnsNsRecordCreate(d *schema.ResourceData, meta interface{}) error { 63 client := meta.(*ArmClient) 64 rivieraClient := client.rivieraClient 65 66 tags := d.Get("tags").(map[string]interface{}) 67 expandedTags := expandTags(tags) 68 69 createCommand := &dns.CreateNSRecordSet{ 70 Name: d.Get("name").(string), 71 Location: "global", 72 ResourceGroupName: d.Get("resource_group_name").(string), 73 ZoneName: d.Get("zone_name").(string), 74 TTL: d.Get("ttl").(int), 75 Tags: *expandedTags, 76 } 77 78 nsRecords, recordErr := expandAzureRmDnsNsRecords(d) 79 if recordErr != nil { 80 return fmt.Errorf("Error Building list of Azure RM NS Records: %s", recordErr) 81 } 82 createCommand.NSRecords = nsRecords 83 84 createRequest := rivieraClient.NewRequest() 85 createRequest.Command = createCommand 86 87 createResponse, err := createRequest.Execute() 88 if err != nil { 89 return fmt.Errorf("Error creating DNS NS Record: %s", err) 90 } 91 if !createResponse.IsSuccessful() { 92 return fmt.Errorf("Error creating DNS NS Record: %s", createResponse.Error) 93 } 94 95 readRequest := rivieraClient.NewRequest() 96 readRequest.Command = &dns.GetNSRecordSet{ 97 Name: d.Get("name").(string), 98 ResourceGroupName: d.Get("resource_group_name").(string), 99 ZoneName: d.Get("zone_name").(string), 100 } 101 102 readResponse, err := readRequest.Execute() 103 if err != nil { 104 return fmt.Errorf("Error reading DNS NS Record: %s", err) 105 } 106 if !readResponse.IsSuccessful() { 107 return fmt.Errorf("Error reading DNS NS Record: %s", readResponse.Error) 108 } 109 110 resp := readResponse.Parsed.(*dns.GetNSRecordSetResponse) 111 d.SetId(resp.ID) 112 113 return resourceArmDnsNsRecordRead(d, meta) 114 } 115 116 func resourceArmDnsNsRecordRead(d *schema.ResourceData, meta interface{}) error { 117 client := meta.(*ArmClient) 118 rivieraClient := client.rivieraClient 119 120 id, err := parseAzureResourceID(d.Id()) 121 if err != nil { 122 return err 123 } 124 125 readRequest := rivieraClient.NewRequestForURI(d.Id()) 126 readRequest.Command = &dns.GetNSRecordSet{} 127 128 readResponse, err := readRequest.Execute() 129 if err != nil { 130 return fmt.Errorf("Error reading DNS Ns Record: %s", err) 131 } 132 if !readResponse.IsSuccessful() { 133 log.Printf("[INFO] Error reading DNS NS Record %q - removing from state", d.Id()) 134 d.SetId("") 135 return fmt.Errorf("Error reading DNS NS Record: %s", readResponse.Error) 136 } 137 138 resp := readResponse.Parsed.(*dns.GetNSRecordSetResponse) 139 140 d.Set("name", resp.Name) 141 d.Set("resource_group_name", id.ResourceGroup) 142 d.Set("zone_name", id.Path["dnszones"]) 143 d.Set("ttl", resp.TTL) 144 145 if resp.NSRecords != nil { 146 if err := d.Set("record", flattenAzureRmDnsNsRecords(resp.NSRecords)); err != nil { 147 log.Printf("[INFO] Error setting the Azure RM NS Record State: %s", err) 148 return err 149 } 150 } 151 152 flattenAndSetTags(d, &resp.Tags) 153 154 return nil 155 } 156 157 func resourceArmDnsNsRecordDelete(d *schema.ResourceData, meta interface{}) error { 158 client := meta.(*ArmClient) 159 rivieraClient := client.rivieraClient 160 161 deleteRequest := rivieraClient.NewRequestForURI(d.Id()) 162 deleteRequest.Command = &dns.DeleteRecordSet{ 163 RecordSetType: "NS", 164 } 165 166 deleteResponse, err := deleteRequest.Execute() 167 if err != nil { 168 return fmt.Errorf("Error deleting DNS TXT Record: %s", err) 169 } 170 if !deleteResponse.IsSuccessful() { 171 return fmt.Errorf("Error deleting DNS TXT Record: %s", deleteResponse.Error) 172 } 173 174 return nil 175 } 176 177 func expandAzureRmDnsNsRecords(d *schema.ResourceData) ([]dns.NSRecord, error) { 178 configs := d.Get("record").(*schema.Set).List() 179 nsRecords := make([]dns.NSRecord, 0, len(configs)) 180 181 for _, configRaw := range configs { 182 data := configRaw.(map[string]interface{}) 183 184 nsRecord := dns.NSRecord{ 185 NSDName: data["nsdname"].(string), 186 } 187 188 nsRecords = append(nsRecords, nsRecord) 189 190 } 191 192 return nsRecords, nil 193 194 } 195 196 func flattenAzureRmDnsNsRecords(records []dns.NSRecord) []map[string]interface{} { 197 result := make([]map[string]interface{}, 0, len(records)) 198 for _, record := range records { 199 nsRecord := make(map[string]interface{}) 200 nsRecord["nsdname"] = record.NSDName 201 202 result = append(result, nsRecord) 203 } 204 return result 205 }