From 8699a93b78dbb7ec9f4e039824bcf8f0d025c173 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 14 Nov 2018 17:42:07 -0800 Subject: [PATCH 001/175] Adapt to Azure package structure and CRUD skeleton --- README.md | 4 + .../resource_azurerm_resource_group.go | 180 ++++++++++++++++++ products/azresourcegroup/api.yaml | 22 +++ products/azresourcegroup/terraform.yaml | 12 ++ provider/terraform.rb | 3 +- templates/terraform/resource.erb | 117 +++++------- 6 files changed, 265 insertions(+), 73 deletions(-) create mode 100644 build/azterraform/azurerm/resource_azurerm_resource_group.go create mode 100644 products/azresourcegroup/api.yaml create mode 100644 products/azresourcegroup/terraform.yaml diff --git a/README.md b/README.md index dffce9fea9df..65df1318b661 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,10 @@ For example, to compile Google Compute Engine for Puppet, you invoke: And the generated code should be written to `build/puppet/compute` +In Windows, run + + bundle exec ruby ./compiler.rb -p products/azresourcegroup -e terraform -o build/azterraform + ### Compiling all modules The Rakefile can be used to compile all of the modules at once. The following diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_azurerm_resource_group.go new file mode 100644 index 000000000000..c9cdbab95188 --- /dev/null +++ b/build/azterraform/azurerm/resource_azurerm_resource_group.go @@ -0,0 +1,180 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceAzureRmResourceGroup() *schema.Resource { + return &schema.Resource{ + Create: resourceAzureRmResourceGroupCreate, + Read: resourceAzureRmResourceGroupRead, + Update: resourceAzureRmResourceGroupUpdate, + Delete: resourceAzureRmResourceGroupDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ +"name": { + Type: schema.TypeString, + Optional: true, +}, + "project": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + }, + }, + } +} + +func resourceAzureRmResourceGroupCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext + + obj := make(map[string]interface{}) + nameProp, err := expandAzureRmResourceGroupName(d.Get("name"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { + obj["name"] = nameProp + } + + + + if _, err := client/*.TODOCreateOrUpdate*/(/* TODO */); err != nil { + return fmt.Errorf("Error creating ResourceGroup: %+v", err) + } + + + log.Printf("[DEBUG] Finished creating ResourceGroup %q: %#v", d.Id(), res) + + + resp, err := client.Get(ctx, /* TODO */) + if err != nil { + return err + } + d.SetId(*resp.ID) + + return resourceAzureRmResourceGroupRead(d, meta) +} + +func resourceAzureRmResourceGroupRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + } + /* TODO */ + + resp, err := client.Get(ctx, /* TODO */) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] ResourceGroup %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading ResourceGroup: %+v", err) + } + + /* TODO */ + + + + + if err := d.Set("name", flattenAzureRmResourceGroupName(res["name"])); err != nil { + return fmt.Errorf("Error reading ResourceGroup: %s", err) + } + project, err := getProject(d, config) + if err != nil { + return err + } + if err := d.Set("project", project); err != nil { + return fmt.Errorf("Error reading ResourceGroup: %s", err) + } + + return nil +} + +func resourceAzureRmResourceGroupUpdate(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + obj := make(map[string]interface{}) + nameProp, err := expandAzureRmResourceGroupName(d.Get("name"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, nameProp)) { + obj["name"] = nameProp + } + + + + url, err := replaceVars(d, config, "https://pubsub.googleapis.com/v1/projects/{{project}}/topics/{{name}}") + if err != nil { + return err + } + + log.Printf("[DEBUG] Updating ResourceGroup %q: %#v", d.Id(), obj) + _, err = sendRequest(config, "PUT", url, obj) + + if err != nil { + return fmt.Errorf("Error updating ResourceGroup %q: %s", d.Id(), err) + } + + + return resourceAzureRmResourceGroupRead(d, meta) +} + +func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + } + /* TODO */ + + future, err := client.Delete(ctx, /* TODO */) + if err != nil { + if response.WasNotFound(deleteFuture.Response()) { + return nil + } + return fmt.Errorf("Error deleting ResourceGroup %q: %+v", name, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(deleteFuture.Response()) { + return fmt.Errorf("Error waiting for deleting ResourceGroup %q: %+v", name, err) + } + } + + var obj map[string]interface{} + log.Printf("[DEBUG] Deleting ResourceGroup %q", d.Id()) + res, err := sendRequest(config, "DELETE", url, obj) + if err != nil { + return handleNotFoundError(err, d, "ResourceGroup") + } + + + log.Printf("[DEBUG] Finished deleting ResourceGroup %q: %#v", d.Id(), res) + return nil +} diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml new file mode 100644 index 000000000000..a0d05280595f --- /dev/null +++ b/products/azresourcegroup/api.yaml @@ -0,0 +1,22 @@ +--- !ruby/object:Api::Product +name: Azure Resource Group +prefix: gazurerm +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: https://pubsub.googleapis.com/v1/ +scopes: + - https://www.googleapis.com/auth/pubsub +objects: + - !ruby/object:Api::Resource + name: 'ResourceGroup' + base_url: projects/{{project}}/topics + create_verb: :PUT + description: | + A named resource to which messages are sent by publishers. + exports: + - name + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'Name of the topic.' diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml new file mode 100644 index 000000000000..c8417623dcb3 --- /dev/null +++ b/products/azresourcegroup/terraform.yaml @@ -0,0 +1,12 @@ +--- !ruby/object:Provider::Terraform::Config +name: AzureRm +overrides: !ruby/object:Provider::ResourceOverrides + ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride + import_format: ["projects/{{project}}/notes/{{name}}"] + example: + - !ruby/object:Provider::Terraform::Examples + name: "container_analysis_note_basic" + primary_resource_id: "note" + version: <%= _version_name %> + vars: + note_name: "test-attestor-note" diff --git a/provider/terraform.rb b/provider/terraform.rb index 55484383eabc..f9c47f010492 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -116,7 +116,8 @@ def nested_properties(property) # per resource. The resource.erb template forms the basis of a single # GCP Resource on Terraform. def generate_resource(data) - dir = data[:version] == 'beta' ? 'google-beta' : 'google' + # dir = data[:version] == 'beta' ? 'google-beta' : 'google' + dir = "azurerm" target_folder = File.join(data[:output_folder], dir) FileUtils.mkpath target_folder name = data[:object].name.underscore diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 326c8422ef75..98a2d2e2bc5b 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -14,7 +14,7 @@ -%> <%= lines(autogen_notice :go) -%> -package google +package azurerm <%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> @@ -54,7 +54,7 @@ func resource<%= resource_name -%>() *schema.Resource { <% end -%> Importer: &schema.ResourceImporter{ - State: resource<%= resource_name -%>Import, + State: schema.ImportStatePassthrough, }, <% unless object.async.nil? -%> @@ -101,7 +101,8 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff <% end -%> func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext obj := make(map[string]interface{}) <% settable_properties.each do |prop| -%> @@ -133,23 +134,9 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> - url, err := replaceVars(d, config, "<%= build_url(object.full_create_url) -%>") - if err != nil { - return err - } - - log.Printf("[DEBUG] Creating new <%= object.name -%>: %#v", obj) - res, err := sendRequest(config, "<%= object.create_verb.to_s.upcase -%>", url, obj) - if err != nil { - return fmt.Errorf("Error creating <%= object.name -%>: %s", err) - } - - // Store the ID now - id, err := replaceVars(d, config, "<%= object.id_format -%>") - if err != nil { - return fmt.Errorf("Error constructing id: %s", err) + if _, err := client/*.TODOCreateOrUpdate*/(/* TODO */); err != nil { + return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } - d.SetId(id) <% unless object.async.nil? -%> <% if has_project -%> @@ -179,22 +166,37 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{ <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> + resp, err := client.Get(ctx, /* TODO */) + if err != nil { + return err + } + d.SetId(*resp.ID) + return resource<%= resource_name -%>Read(d, meta) } func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext - url, err := replaceVars(d, config, "<%= build_url(object.self_link_url) -%>") + id, err := parseAzureResourceID(d.Id()) if err != nil { - return err + return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) } + /* TODO */ - res, err := sendRequest(config, "GET", url, nil) + resp, err := client.Get(ctx, /* TODO */) if err != nil { - return handleNotFoundError(err, d, fmt.Sprintf("<%= resource_name -%> %q", d.Id())) + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading <%= object.name -%>: %+v", err) } + /* TODO */ + <% unless object.self_link_query.nil? -%> <%# This part of the template extracts the one resource we're interested in from the list that gets returned. self_link_query is a field which @@ -416,7 +418,8 @@ func resource<%= resource_name -%>Update(d *schema.ResourceData, meta interface{ <% end # if updatable? -%> func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) + client := meta.(*ArmClient)/*.TODO*/ + ctx := meta.(*ArmClient).StopContext <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -427,9 +430,24 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> - url, err := replaceVars(d, config, "<%= build_url(object.full_delete_url) -%>") + id, err := parseAzureResourceID(d.Id()) if err != nil { - return err + return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) + } + /* TODO */ + + future, err := client.Delete(ctx, /* TODO */) + if err != nil { + if response.WasNotFound(deleteFuture.Response()) { + return nil + } + return fmt.Errorf("Error deleting <%= object.name -%> %q: %+v", name, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(deleteFuture.Response()) { + return fmt.Errorf("Error waiting for deleting <%= object.name -%> %q: %+v", name, err) + } } <%# If the deletion of the object requires sending a request body, the custom code will set 'obj' -%> @@ -466,48 +484,3 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Finished deleting <%= object.name -%> %q: %#v", d.Id(), res) return nil } - -func resource<%= resource_name -%>Import(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { -<% if object.custom_code.custom_import -%> -<%= lines(compile(object.custom_code.custom_import)) -%> -<% else -%> - config := meta.(*Config) - parseImportId([]string{"<%= import_id_formats(object).map{|s| format2regex s}.join('","') -%>"}, d, config) - - // Replace import id for the resource id - id, err := replaceVars(d, config, "<%= object.id_format -%>") - if err != nil { - return nil, fmt.Errorf("Error constructing id: %s", err) - } - d.SetId(id) -<%= lines(compile(object.custom_code.post_import)) if object.custom_code.post_import -%> - - return []*schema.ResourceData{d}, nil -<% end -%> -} - -<% properties.reject(&:ignore_read).each do |prop| -%> -<%= lines(build_flatten_method(resource_name, prop), 1) -%> -<% end -%> - -<% settable_properties.each do |prop| -%> -<%= lines(build_expand_method(resource_name, prop), 1) -%> -<% end -%> - -<% if object.custom_code.encoder -%> -func resource<%= resource_name -%>Encoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.encoder)) -%> -} -<% end -%> - -<% if object.custom_code.update_encoder-%> -func resource<%= resource_name -%>UpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.update_encoder)) -%> -} -<% end -%> - -<% if object.custom_code.decoder -%> -func resource<%= resource_name -%>Decoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.decoder)) -%> -} -<% end -%> From 3e2a586fa4d0d8bd582b9eca930ce4ba652a7f0d Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 14 Nov 2018 19:16:12 -0800 Subject: [PATCH 002/175] Add ansible configuration --- .../google/gcp_azurerm_resource_group.py | 223 ++++++++++++++++++ products/azresourcegroup/ansible.yaml | 19 ++ 2 files changed, 242 insertions(+) create mode 100644 build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py create mode 100644 products/azresourcegroup/ansible.yaml diff --git a/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py b/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py new file mode 100644 index 000000000000..809790af501c --- /dev/null +++ b/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py @@ -0,0 +1,223 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Google +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +################################################################################ +# Documentation +################################################################################ + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ["preview"], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: gcp_azurerm_resource_group +description: +- A named resource to which messages are sent by publishers. +short_description: Creates a GCP ResourceGroup +version_added: 2.6 +author: Google Inc. (@googlecloudplatform) +requirements: +- python >= 2.6 +- requests >= 2.18.4 +- google-auth >= 1.3.0 +options: + state: + description: + - Whether the given object should exist in GCP + choices: + - present + - absent + default: present + name: + description: + - Name of the topic. + required: false +extends_documentation_fragment: gcp +''' + + +RETURN = ''' +name: + description: + - Name of the topic. + returned: success + type: str +''' + +################################################################################ +# Imports +################################################################################ + +from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, replace_resource_dict +import json + +################################################################################ +# Main +################################################################################ + + +def main(): + """Main function""" + + module = GcpModule( + argument_spec=dict( + state=dict(default='present', choices=['present', 'absent'], type='str'), + name=dict(type='str') + ) + ) + + if not module.params['scopes']: + module.params['scopes'] = ['https://www.googleapis.com/auth/pubsub'] + + state = module.params['state'] + + fetch = fetch_resource(module, self_link(module)) + changed = False + + if fetch: + if state == 'present': + if is_different(module, fetch): + update(module, self_link(module)) + fetch = fetch_resource(module, self_link(module)) + changed = True + else: + delete(module, self_link(module)) + fetch = {} + changed = True + else: + if state == 'present': + fetch = create(module, self_link(module)) + changed = True + else: + fetch = {} + + fetch.update({'changed': changed}) + + module.exit_json(**fetch) + + +def create(module, link): + auth = GcpSession(module, 'azurerm') + return return_if_object(module, auth.put(link, resource_to_request(module))) + + +def update(module, link): + auth = GcpSession(module, 'azurerm') + return return_if_object(module, auth.put(link, resource_to_request(module))) + + +def delete(module, link): + auth = GcpSession(module, 'azurerm') + return return_if_object(module, auth.delete(link)) + + +def resource_to_request(module): + request = { + u'name': module.params.get('name') + } + request = encode_request(request, module) + return_vals = {} + for k, v in request.items(): + if v: + return_vals[k] = v + + return return_vals + + +def fetch_resource(module, link, allow_not_found=True): + auth = GcpSession(module, 'azurerm') + return return_if_object(module, auth.get(link), allow_not_found) + + +def self_link(module): + return "https://pubsub.googleapis.com/v1/projects/{project}/topics/{name}".format(**module.params) + + +def collection(module): + return "https://pubsub.googleapis.com/v1/projects/{project}/topics".format(**module.params) + + +def return_if_object(module, response, allow_not_found=False): + # If not found, return nothing. + if allow_not_found and response.status_code == 404: + return None + + # If no content, return nothing. + if response.status_code == 204: + return None + + try: + module.raise_for_status(response) + result = response.json() + except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: + module.fail_json(msg="Invalid JSON response with error: %s" % inst) + + result = decode_request(result, module) + + if navigate_hash(result, ['error', 'errors']): + module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) + + return result + + +def is_different(module, response): + request = resource_to_request(module) + response = response_to_hash(module, response) + request = decode_request(request, module) + + # Remove all output-only from response. + response_vals = {} + for k, v in response.items(): + if k in request: + response_vals[k] = v + + request_vals = {} + for k, v in request.items(): + if k in response: + request_vals[k] = v + + return GcpRequest(request_vals) != GcpRequest(response_vals) + + +# Remove unnecessary properties from the response. +# This is for doing comparisons with Ansible's current parameters. +def response_to_hash(module, response): + return { + u'name': response.get(u'name') + } + + +def decode_request(response, module): + if 'name' in response: + response['name'] = response['name'].split('/')[-1] + return response + + +def encode_request(request, module): + request['name'] = '/'.join(['projects', module.params['project'], + 'topics', module.params['name']]) + return request + + +if __name__ == '__main__': + main() diff --git a/products/azresourcegroup/ansible.yaml b/products/azresourcegroup/ansible.yaml new file mode 100644 index 000000000000..603c422cf553 --- /dev/null +++ b/products/azresourcegroup/ansible.yaml @@ -0,0 +1,19 @@ +--- !ruby/object:Provider::Ansible::Config +manifest: !ruby/object:Provider::Ansible::Manifest + metadata_version: '1.1' + status: + - preview + supported_by: 'community' + requirements: + - python >= 2.6 + - requests >= 2.18.4 + - google-auth >= 1.3.0 + version_added: '2.6' + author: Google Inc. (@googlecloudplatform) +overrides: !ruby/object:Provider::ResourceOverrides + ResourceGroup: !ruby/object:Provider::Ansible::ResourceOverride + transport: !ruby/object:Api::Resource::Transport + encoder: encode_request + decoder: decode_request + provider_helpers: + - 'products/pubsub/helpers/python/provider_topic.py' From 5cd90a93533c07ee5fe028d34ec42815cbce1c1f Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 14 Nov 2018 19:42:37 -0800 Subject: [PATCH 003/175] Include the whole prefix as generated TF file name --- .../resource_azurerm_resource_group.go | 9 +++++++ products/azresourcegroup/api.yaml | 2 +- provider/core.rb | 2 +- templates/terraform/resource.erb | 26 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_azurerm_resource_group.go index c9cdbab95188..245b20f5f32e 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group.go +++ b/build/azterraform/azurerm/resource_azurerm_resource_group.go @@ -178,3 +178,12 @@ func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{} log.Printf("[DEBUG] Finished deleting ResourceGroup %q: %#v", d.Id(), res) return nil } + +func flattenAzureRmResourceGroupName(v interface{}) interface{} { + return v +} + + +func expandAzureRmResourceGroupName(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { + return v, nil +} diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index a0d05280595f..945cfda5b809 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Resource Group -prefix: gazurerm +prefix: azurerm versions: - !ruby/object:Api::Product::Version name: ga diff --git a/provider/core.rb b/provider/core.rb index 47134e7abec6..b98f53bf0d4e 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -211,7 +211,7 @@ def build_object_data(object, output_folder, version) tests: (@config.tests || {}).select { |o, _v| o == object.name } .fetch(object.name, {}), output_folder: output_folder, - product_name: object.__product.prefix[1..-1], + product_name: object.__product.prefix, version: version } end diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 98a2d2e2bc5b..84f8c5535536 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -484,3 +484,29 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Finished deleting <%= object.name -%> %q: %#v", d.Id(), res) return nil } + +<% properties.reject(&:ignore_read).each do |prop| -%> +<%= lines(build_flatten_method(resource_name, prop), 1) -%> +<% end -%> + +<% settable_properties.each do |prop| -%> +<%= lines(build_expand_method(resource_name, prop), 1) -%> +<% end -%> + +<% if object.custom_code.encoder -%> +func resource<%= resource_name -%>Encoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { +<%= lines(compile(object.custom_code.encoder)) -%> +} +<% end -%> + +<% if object.custom_code.update_encoder-%> +func resource<%= resource_name -%>UpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { +<%= lines(compile(object.custom_code.update_encoder)) -%> +} +<% end -%> + +<% if object.custom_code.decoder -%> +func resource<%= resource_name -%>Decoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { +<%= lines(compile(object.custom_code.decoder)) -%> +} +<% end -%> From 40dd06276a28405840c072620852539edce47dae Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 20 Nov 2018 01:20:27 -0500 Subject: [PATCH 004/175] Add test file and documentation file to Terraform --- ...e_azurerm_resource_group_generated_test.go | 81 +++++++++++++++++++ .../r/azurerm_resource_group.html.markdown | 73 +++++++++++++++++ compiler.rb | 4 +- provider/terraform.rb | 7 +- .../examples/base_configs/test_file.go.erb | 2 +- 5 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go create mode 100644 build/azterraform/website/docs/r/azurerm_resource_group.html.markdown diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go new file mode 100644 index 000000000000..0113ee633aa6 --- /dev/null +++ b/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" +) + + +func TestAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAzureRmResourceGroupDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(acctest.RandString(10)), + }, + { + ResourceName: "google_azure_rm_resource_group.note", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(val string) string { + return fmt.Sprintf(` +resource "google_container_analysis_note" "note" { + name = "test-attestor-note-%s" + attestation_authority { + hint { + human_readable_name = "Attestor Note" + } + } +} +`, val, + ) +} + + +func testAccCheckAzureRmResourceGroupDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "google_azure_rm_resource_group" { + continue + } + + config := testAccProvider.Meta().(*Config) + + url, err := replaceVarsForTest(rs, "https://pubsub.googleapis.com/v1/projects/{{project}}/topics/{{name}}") + if err != nil { + return err + } + + _, err = sendRequest(config, "GET", url, nil) + if err == nil { + return fmt.Errorf("AzureRmResourceGroup still exists at %s", url) + } + } + + return nil +} diff --git a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown new file mode 100644 index 000000000000..fc5f550ef1c6 --- /dev/null +++ b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown @@ -0,0 +1,73 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "google" +page_title: "Google: google_azure_rm_resource_group" +sidebar_current: "docs-google-azure-rm-resource-group" +description: |- + A named resource to which messages are sent by publishers. +--- + +# google\_azure\_rm\_resource\_group + +A named resource to which messages are sent by publishers. + + + + +## Example Usage - Container Analysis Note Basic + + +```hcl +resource "google_container_analysis_note" "note" { + name = "test-attestor-note" + attestation_authority { + hint { + human_readable_name = "Attestor Note" + } + } +} +``` + +## Argument Reference + +The following arguments are supported: + + + +- - - + + +* `name` - + (Optional) + Name of the topic. +* `project` - (Optional) The ID of the project in which the resource belongs. + If it is not provided, the provider project is used. + + + + +## Import + +ResourceGroup can be imported using any of these accepted formats: + +``` +$ terraform import google_azure_rm_resource_group.default projects/{{project}}/notes/{{name}} +$ terraform import google_azure_rm_resource_group.default {{project}}/{{name}} +$ terraform import google_azure_rm_resource_group.default {{name}} +``` diff --git a/compiler.rb b/compiler.rb index 3d78d57d54e0..2499eb9e04be 100755 --- a/compiler.rb +++ b/compiler.rb @@ -146,7 +146,7 @@ # In order to only copy/compile files once per provider this must be called outside # of the products loop. This will get called with the provider from the final iteration # of the loop -provider&.copy_common_files(output_path, version) -provider&.compile_common_files(output_path, version) +# provider&.copy_common_files(output_path, version) +# provider&.compile_common_files(output_path, version) # rubocop:enable Metrics/BlockLength diff --git a/provider/terraform.rb b/provider/terraform.rb index f9c47f010492..373a00994743 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -128,7 +128,7 @@ def generate_resource(data) out_file: filepath ) # TODO: error check goimports - %x(goimports -w #{filepath}) + # %x(goimports -w #{filepath}) generate_documentation(data) end @@ -150,7 +150,8 @@ def generate_documentation(data) def generate_resource_tests(data) return if data[:object].example.reject(&:skip_test).empty? - dir = data[:version] == 'beta' ? 'google-beta' : 'google' + # dir = data[:version] == 'beta' ? 'google-beta' : 'google' + dir = 'azurerm' target_folder = File.join(data[:output_folder], dir) FileUtils.mkpath target_folder name = data[:object].name.underscore @@ -168,7 +169,7 @@ def generate_resource_tests(data) ) # TODO: error check goimports - %x(goimports -w #{filepath}) + # %x(goimports -w #{filepath}) end end end diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index d383f4402108..6b6b3cd24595 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -1,6 +1,6 @@ <%= lines(autogen_notice :go) -%> -package google +package azurerm import ( "fmt" From b989a28f3e46910fd588784ef927154eb544a544 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 20 Nov 2018 02:30:43 -0500 Subject: [PATCH 005/175] Implement D operations, update CRU operations --- api/resource.rb | 7 + .../resource_azurerm_resource_group.go | 86 ++--- ...e_azurerm_resource_group_generated_test.go | 2 +- .../r/azurerm_resource_group.html.markdown | 2 - products/azresourcegroup/api.yaml | 8 +- templates/terraform/resource.erb | 295 +++--------------- 6 files changed, 80 insertions(+), 320 deletions(-) diff --git a/api/resource.rb b/api/resource.rb index 2f9bee9a8874..1ab186de0c69 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -62,6 +62,10 @@ module Properties attr_reader :update_verb attr_reader :input # If true, resource is not updatable as a whole unit attr_reader :min_version # Minimum API version this resource is in + + # Azure Specific Attributes + attr_reader :azure_create_async + attr_reader :azure_delete_async end include Properties @@ -254,6 +258,9 @@ def validate check_optional_property :input, :boolean check_optional_property :min_version, String + check_optional_property :azure_create_async, :boolean + check_optional_property :azure_delete_async, :boolean + set_variables(@parameters, :__resource) set_variables(@properties, :__resource) diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_azurerm_resource_group.go index 245b20f5f32e..f8b0eecdb90c 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group.go +++ b/build/azterraform/azurerm/resource_azurerm_resource_group.go @@ -16,11 +16,12 @@ package azurerm + func resourceAzureRmResourceGroup() *schema.Resource { return &schema.Resource{ - Create: resourceAzureRmResourceGroupCreate, + Create: resourceAzureRmResourceGroupCreateOrUpdate, Read: resourceAzureRmResourceGroupRead, - Update: resourceAzureRmResourceGroupUpdate, + Update: resourceAzureRmResourceGroupCreateOrUpdate, Delete: resourceAzureRmResourceGroupDelete, Importer: &schema.ResourceImporter{ @@ -33,18 +34,14 @@ func resourceAzureRmResourceGroup() *schema.Resource { Type: schema.TypeString, Optional: true, }, - "project": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - }, + "location": locationSchema(), + "tags": tagsSchema(), }, } } -func resourceAzureRmResourceGroupCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ +func resourceAzureRmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext obj := make(map[string]interface{}) @@ -57,12 +54,13 @@ func resourceAzureRmResourceGroupCreate(d *schema.ResourceData, meta interface{} - if _, err := client/*.TODOCreateOrUpdate*/(/* TODO */); err != nil { - return fmt.Errorf("Error creating ResourceGroup: %+v", err) - } + name := d.Get("name").(string) + // TODO parameters - log.Printf("[DEBUG] Finished creating ResourceGroup %q: %#v", d.Id(), res) + if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { + return fmt.Errorf("Error creating ResourceGroup: %+v", err) + } resp, err := client.Get(ctx, /* TODO */) @@ -75,16 +73,16 @@ func resourceAzureRmResourceGroupCreate(d *schema.ResourceData, meta interface{} } func resourceAzureRmResourceGroupRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ + client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) } - /* TODO */ + name := id.ResourceGroup - resp, err := client.Get(ctx, /* TODO */) + resp, err := client.Get(ctx, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] ResourceGroup %q does not exist - removing from state", d.Id()) @@ -94,56 +92,19 @@ func resourceAzureRmResourceGroupRead(d *schema.ResourceData, meta interface{}) return fmt.Errorf("Error reading ResourceGroup: %+v", err) } - /* TODO */ - + d.Set("name", resp.Name) if err := d.Set("name", flattenAzureRmResourceGroupName(res["name"])); err != nil { return fmt.Errorf("Error reading ResourceGroup: %s", err) } - project, err := getProject(d, config) - if err != nil { - return err - } - if err := d.Set("project", project); err != nil { - return fmt.Errorf("Error reading ResourceGroup: %s", err) - } return nil } -func resourceAzureRmResourceGroupUpdate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - - obj := make(map[string]interface{}) - nameProp, err := expandAzureRmResourceGroupName(d.Get("name"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, nameProp)) { - obj["name"] = nameProp - } - - - - url, err := replaceVars(d, config, "https://pubsub.googleapis.com/v1/projects/{{project}}/topics/{{name}}") - if err != nil { - return err - } - - log.Printf("[DEBUG] Updating ResourceGroup %q: %#v", d.Id(), obj) - _, err = sendRequest(config, "PUT", url, obj) - - if err != nil { - return fmt.Errorf("Error updating ResourceGroup %q: %s", d.Id(), err) - } - - - return resourceAzureRmResourceGroupRead(d, meta) -} - func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ + client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext @@ -151,9 +112,9 @@ func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{} if err != nil { return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) } - /* TODO */ + name := id.ResourceGroup - future, err := client.Delete(ctx, /* TODO */) + future, err := client.Delete(ctx, name) if err != nil { if response.WasNotFound(deleteFuture.Response()) { return nil @@ -167,15 +128,6 @@ func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{} } } - var obj map[string]interface{} - log.Printf("[DEBUG] Deleting ResourceGroup %q", d.Id()) - res, err := sendRequest(config, "DELETE", url, obj) - if err != nil { - return handleNotFoundError(err, d, "ResourceGroup") - } - - - log.Printf("[DEBUG] Finished deleting ResourceGroup %q: %#v", d.Id(), res) return nil } diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go index 0113ee633aa6..7ecee8b38745 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go +++ b/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go @@ -66,7 +66,7 @@ func testAccCheckAzureRmResourceGroupDestroy(s *terraform.State) error { config := testAccProvider.Meta().(*Config) - url, err := replaceVarsForTest(rs, "https://pubsub.googleapis.com/v1/projects/{{project}}/topics/{{name}}") + url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") if err != nil { return err } diff --git a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown index fc5f550ef1c6..e743c299cd71 100644 --- a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown +++ b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown @@ -56,8 +56,6 @@ The following arguments are supported: * `name` - (Optional) Name of the topic. -* `project` - (Optional) The ID of the project in which the resource belongs. - If it is not provided, the provider project is used. diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 945cfda5b809..5c45ccc55672 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -4,14 +4,14 @@ prefix: azurerm versions: - !ruby/object:Api::Product::Version name: ga - base_url: https://pubsub.googleapis.com/v1/ + base_url: NotUsedInAzure scopes: - - https://www.googleapis.com/auth/pubsub + - NotUsedInAzure objects: - !ruby/object:Api::Resource name: 'ResourceGroup' - base_url: projects/{{project}}/topics - create_verb: :PUT + base_url: NotUsedInAzure + azure_delete_async: true description: | A named resource to which messages are sent by publishers. exports: diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 84f8c5535536..071c8d48374a 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -35,12 +35,19 @@ package azurerm has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> +<% + azure_is_resource_group = object.name == "ResourceGroup" + azure_has_location = true + azure_has_tags = true + azure_client_name = "#{object.name}sClient".camelcase(:lower) +-%> + func resource<%= resource_name -%>() *schema.Resource { return &schema.Resource{ - Create: resource<%= resource_name -%>Create, + Create: resource<%= resource_name -%>CreateOrUpdate, Read: resource<%= resource_name -%>Read, <% if updatable?(object, properties) -%> - Update: resource<%= resource_name -%>Update, + Update: resource<%= resource_name -%>CreateOrUpdate, <% end -%> Delete: resource<%= resource_name -%>Delete, <% if settable_properties.any? {|p| p.unordered_list} && !object.custom_code.resource_definition -%> @@ -73,6 +80,12 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(build_schema_property(prop, object)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> +<% if azure_has_location -%> + "location": locationSchema(), +<% end -%> +<% if azure_has_tags -%> + "tags": tagsSchema(), +<% end -%> <% if has_project -%> "project": { Type: schema.TypeString, @@ -100,8 +113,9 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff } <% end -%> -func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ +func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).<%= azure_client_name -%> + ctx := meta.(*ArmClient).StopContext obj := make(map[string]interface{}) @@ -134,36 +148,21 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> - if _, err := client/*.TODOCreateOrUpdate*/(/* TODO */); err != nil { - return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) - } - -<% unless object.async.nil? -%> -<% if has_project -%> - project, err := getProject(d, config) - if err != nil { - return err - } + name := d.Get("name").(string) +<% unless azure_is_resource_group -%> + resourceGroup := d.Get("resource_group_name").(string) <% end -%> - op := &<%= api_client_name -%>.Operation{} - err = Convert(res, op) - if err != nil { - return err - } - waitErr := <%= api_name_lower -%>OperationWaitTime( - config.client<%= product_ns -%>, op,<% if has_project -%> project, <% end -%> "Creating <%= object.name -%>", - int(d.Timeout(schema.TimeoutCreate).Minutes())) + // TODO parameters - if waitErr != nil { - // The resource didn't actually create - d.SetId("") - return fmt.Errorf("Error waiting to create <%= object.name -%>: %s", waitErr) +<% unless object.azure_create_async -%> + if _, err := client.CreateOrUpdate(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { + return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } +<% else -%> + // TODO: Async CreateOrUpdate Operation <% end -%> - log.Printf("[DEBUG] Finished creating <%= object.name -%> %q: %#v", d.Id(), res) - <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> resp, err := client.Get(ctx, /* TODO */) @@ -176,16 +175,22 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{ } func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ + client := meta.(*ArmClient).<%= azure_client_name -%> + ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) } - /* TODO */ +<% if azure_is_resource_group -%> + name := id.ResourceGroup +<% else -%> + resourceGroup := id.ResourceGroup + // TODO: Get name out +<% end -%> - resp, err := client.Get(ctx, /* TODO */) + resp, err := client.Get(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) @@ -195,8 +200,6 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) return fmt.Errorf("Error reading <%= object.name -%>: %+v", err) } - /* TODO */ - <% unless object.self_link_query.nil? -%> <%# This part of the template extracts the one resource we're interested in from the list that gets returned. self_link_query is a field which @@ -215,6 +218,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% end -%> + d.Set("name", resp.Name) <% properties.reject(&:ignore_read).each do |prop| -%> if err := d.Set("<%= prop.name.underscore -%>", flatten<%= resource_name -%><%= titlelize_property(prop) -%>(res["<%= prop.api_name -%>"])); err != nil { return fmt.Errorf("Error reading <%= object.name -%>: %s", err) @@ -238,187 +242,9 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) return nil } -<% if updatable?(object, properties) -%> -func resource<%= resource_name -%>Update(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - -<% if object.input -%> - d.Partial(true) - -<% properties_by_custom_update(properties).each do |key, props| -%> - if <%= props.map { |prop| "d.HasChange(\"#{prop.name.underscore}\")" }.join ' || ' -%> { - obj := make(map[string]interface{}) -<% props.each do |prop| -%> -<% if update_body_properties.include? prop -%> - <%= prop.api_name -%>Prop, err := expand<%= resource_name -%><%= titlelize_property(prop) -%>(d.Get("<%= prop.name.underscore -%>"), d, config) - if err != nil { - return err -<%# There is some nuance in when we choose to send a value to an update function. - This is unfortunate, but it's because of the way that GCP works, so there's - no easy way out. Some APIs require you to send `enable_foo: false`, while - others will crash if you send `attribute: ''`. We require this nuance to - be annotated in api.yaml, since it is not discoverable automatically. - - The behavior here, which we believe to be correct, is to send a value if - * It is non-empty OR - * It is marked send_empty_value in api.yaml. - AND - * It has been set by the user OR - * It has been modified by the expander in any way - - This subsumes both `ForceSendFields` and `NullFields` in the go API client - - `NullFields` is a special case of `send_empty_value` where the empty value - in question is go's literal nil. --%> -<% unless prop.send_empty_value -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop)) { -<% else -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop) { -<% end -%> -<% if prop.update_statement -%> - obj["<%= prop.api_name -%>"] = <%= compile_template(prop.update_statement, - prefix: resource_name, - property: prop) -%> -<% else -%> - obj["<%= prop.api_name -%>"] = <%= prop.api_name -%>Prop -<% end -%> - } -<% else # if update_body_properties.include? prop -%> - <%= prop.api_name -%>Prop := d.Get("<%= prop.name.underscore -%>") - obj["<%= prop.api_name -%>"] = <%= prop.api_name -%>Prop -<% end # if update_body_properties.include? prop -%> -<% end # props.each -%> - -<% if object.mutex -%> - lockName, err := replaceVars(d, config, "<%= object.mutex -%>") - if err != nil { - return err - } - mutexKV.Lock(lockName) - defer mutexKV.Unlock(lockName) -<% end -%> - - url, err := replaceVars(d, config, "<%= update_url(object, key[:update_url]) -%>") - if err != nil { - return err - } -<% if object.async.nil? -%> - _, err = sendRequest(config, "<%= key[:update_verb] -%>", url, obj) -<% else -%> - res, err := sendRequest(config, "<%= key[:update_verb] -%>", url, obj) -<% end -%> - if err != nil { - return fmt.Errorf("Error updating <%= object.name -%> %q: %s", d.Id(), err) - } - -<% unless object.async.nil? -%> -<% if has_project -%> - project, err := getProject(d, config) - if err != nil { - return err - } -<% end -%> - op := &<%= api_client_name -%>.Operation{} - err = Convert(res, op) - if err != nil { - return err - } - - err = <%= api_name_lower -%>OperationWaitTime( - config.client<%= product_ns -%>, op, <% if has_project -%> project, <% end -%> "Updating <%= object.name -%>", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - - if err != nil { - return err - } - -<% end -%> - -<% props.each do |prop| -%> - d.SetPartial("<%= prop.name.underscore -%>") -<% end -%> - } -<% end -%> - - d.Partial(false) -<% else # if object.input -%> - obj := make(map[string]interface{}) -<% update_body_properties.each do |prop| -%> - <%= prop.api_name -%>Prop, err := expand<%= resource_name -%><%= titlelize_property(prop) -%>(d.Get("<%= prop.name.underscore -%>"), d, config) - if err != nil { - return err -<% unless prop.send_empty_value -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop)) { -<% else -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop) { -<% end -%> - obj["<%= prop.api_name -%>"] = <%= prop.api_name -%>Prop - } -<% end -%> - -<%# We need to decide what encoder to use here - if there's an update encoder, use that! -%> -<% if object.custom_code.update_encoder -%> - obj, err = resource<%= resource_name -%>UpdateEncoder(d, meta, obj) -<% elsif object.custom_code.encoder -%> - obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) -<% end -%> - -<% if object.mutex -%> - lockName, err := replaceVars(d, config, "<%= object.mutex -%>") - if err != nil { - return err - } - mutexKV.Lock(lockName) - defer mutexKV.Unlock(lockName) -<% end -%> - - url, err := replaceVars(d, config, "<%= update_url(object, object.update_url) -%>") - if err != nil { - return err - } - - log.Printf("[DEBUG] Updating <%= object.name -%> %q: %#v", d.Id(), obj) -<%= lines(compile(object.custom_code.pre_update)) if object.custom_code.pre_update -%> -<% if object.async.nil? -%> - _, err = sendRequest(config, "<%= object.update_verb -%>", url, obj) -<% else -%> - res, err := sendRequest(config, "<%= object.update_verb -%>", url, obj) -<% end -%> - - if err != nil { - return fmt.Errorf("Error updating <%= object.name -%> %q: %s", d.Id(), err) - } - -<% unless object.async.nil? -%> -<% if has_project -%> - project, err := getProject(d, config) - if err != nil { - return err - } -<% end -%> - op := &<%= api_client_name -%>.Operation{} - err = Convert(res, op) - if err != nil { - return err - } - - err = <%= api_name_lower -%>OperationWaitTime( - config.client<%= product_ns -%>, op, <% if has_project -%> project, <% end -%> "Updating <%= object.name -%>", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - - if err != nil { - return err - } -<% end -%> -<% end # if object.input -%> - -<%= lines(compile(object.custom_code.post_update)) if object.custom_code.post_update -%> - return resource<%= resource_name -%>Read(d, meta) -} -<% end # if updatable? -%> - func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient)/*.TODO*/ + client := meta.(*ArmClient).<%= azure_client_name -%> + ctx := meta.(*ArmClient).StopContext <% if object.mutex -%> @@ -434,9 +260,17 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ if err != nil { return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) } - /* TODO */ +<% if azure_is_resource_group -%> + name := id.ResourceGroup +<% else -%> + resourceGroup := id.ResourceGroup + // TODO: Get name out +<% end -%> - future, err := client.Delete(ctx, /* TODO */) +<% unless object.azure_delete_async -%> + // TODO: Synced Delete Operation +<% else -%> + future, err := client.Delete(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if response.WasNotFound(deleteFuture.Response()) { return nil @@ -449,39 +283,8 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ return fmt.Errorf("Error waiting for deleting <%= object.name -%> %q: %+v", name, err) } } - -<%# If the deletion of the object requires sending a request body, the custom code will set 'obj' -%> - var obj map[string]interface{} -<%= lines(compile(object.custom_code.pre_delete)) if object.custom_code.pre_delete -%> - log.Printf("[DEBUG] Deleting <%= object.name -%> %q", d.Id()) - res, err := sendRequest(config, "<%= object.delete_verb.to_s.upcase -%>", url, obj) - if err != nil { - return handleNotFoundError(err, d, "<%= object.name -%>") - } - -<% unless object.async.nil? -%> -<% if has_project -%> - project, err := getProject(d, config) - if err != nil { - return err - } -<% end -%> - op := &<%= api_client_name -%>.Operation{} - err = Convert(res, op) - if err != nil { - return err - } - - err = <%= api_name_lower -%>OperationWaitTime( - config.client<%= product_ns -%>, op, <% if has_project -%> project, <% end -%> "Deleting <%= object.name -%>", - int(d.Timeout(schema.TimeoutDelete).Minutes())) - - if err != nil { - return err - } <% end -%> - log.Printf("[DEBUG] Finished deleting <%= object.name -%> %q: %#v", d.Id(), res) return nil } From 4cf845f85bfacd0deb596263dfd91a7ecc3c481a Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 21 Nov 2018 01:21:59 -0500 Subject: [PATCH 006/175] Add location and tags to resource group --- .../resource_azurerm_resource_group.go | 52 ++++++++++++++++--- .../r/azurerm_resource_group.html.markdown | 16 ++++-- products/azresourcegroup/api.yaml | 16 ++++-- products/azresourcegroup/terraform.yaml | 8 +++ provider/terraform/property_override.rb | 5 ++ .../terraform/custom_schema/location.erb | 1 + .../custom_schema/resource_group_name.erb | 1 + templates/terraform/custom_schema/tags.erb | 1 + templates/terraform/resource.erb | 10 +--- templates/terraform/schema_property.erb | 4 ++ 10 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 templates/terraform/custom_schema/location.erb create mode 100644 templates/terraform/custom_schema/resource_group_name.erb create mode 100644 templates/terraform/custom_schema/tags.erb diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_azurerm_resource_group.go index f8b0eecdb90c..603ebfd041b0 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group.go +++ b/build/azterraform/azurerm/resource_azurerm_resource_group.go @@ -30,12 +30,9 @@ func resourceAzureRmResourceGroup() *schema.Resource { Schema: map[string]*schema.Schema{ -"name": { - Type: schema.TypeString, - Optional: true, -}, - "location": locationSchema(), - "tags": tagsSchema(), +"location": locationSchema(), +"name": resourceGroupNameSchema(), +"tags": tagsSchema(), }, } } @@ -51,6 +48,18 @@ func resourceAzureRmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta int } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { obj["name"] = nameProp } + locationProp, err := expandAzureRmResourceGroupLocation(d.Get("location"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("location"); !isEmptyValue(reflect.ValueOf(locationProp)) && (ok || !reflect.DeepEqual(v, locationProp)) { + obj["location"] = locationProp + } + tagsProp, err := expandAzureRmResourceGroupTags(d.Get("tags"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("tags"); !isEmptyValue(reflect.ValueOf(tagsProp)) && (ok || !reflect.DeepEqual(v, tagsProp)) { + obj["tags"] = tagsProp + } @@ -63,7 +72,7 @@ func resourceAzureRmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta int } - resp, err := client.Get(ctx, /* TODO */) + resp, err := client.Get(ctx, name) if err != nil { return err } @@ -99,6 +108,12 @@ func resourceAzureRmResourceGroupRead(d *schema.ResourceData, meta interface{}) if err := d.Set("name", flattenAzureRmResourceGroupName(res["name"])); err != nil { return fmt.Errorf("Error reading ResourceGroup: %s", err) } + if err := d.Set("location", flattenAzureRmResourceGroupLocation(res["location"])); err != nil { + return fmt.Errorf("Error reading ResourceGroup: %s", err) + } + if err := d.Set("tags", flattenAzureRmResourceGroupTags(res["tags"])); err != nil { + return fmt.Errorf("Error reading ResourceGroup: %s", err) + } return nil } @@ -135,7 +150,30 @@ func flattenAzureRmResourceGroupName(v interface{}) interface{} { return v } +func flattenAzureRmResourceGroupLocation(v interface{}) interface{} { + return v +} + +func flattenAzureRmResourceGroupTags(v interface{}) interface{} { + return v +} + func expandAzureRmResourceGroupName(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { return v, nil } + +func expandAzureRmResourceGroupLocation(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandAzureRmResourceGroupTags(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { + if v == nil { + return map[string]string{}, nil + } + m := make(map[string]string) + for k, val := range v.(map[string]interface{}) { + m[k] = val.(string) + } + return m, nil +} diff --git a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown index e743c299cd71..f0902048ca5d 100644 --- a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown +++ b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown @@ -16,12 +16,12 @@ layout: "google" page_title: "Google: google_azure_rm_resource_group" sidebar_current: "docs-google-azure-rm-resource-group" description: |- - A named resource to which messages are sent by publishers. + Manages a resource group on Azure. --- # google\_azure\_rm\_resource\_group -A named resource to which messages are sent by publishers. +Manages a resource group on Azure. @@ -49,13 +49,21 @@ resource "google_container_analysis_note" "note" { The following arguments are supported: +* `name` - + (Required) + The name of the resource group. + +* `location` - + (Required) + The location where the resource group should be created. + - - - -* `name` - +* `tags` - (Optional) - Name of the topic. + A mapping of tags to assign to the resource group. diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 5c45ccc55672..05c411b899ae 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -13,10 +13,18 @@ objects: base_url: NotUsedInAzure azure_delete_async: true description: | - A named resource to which messages are sent by publishers. - exports: - - name + Manages a resource group on Azure. properties: - !ruby/object:Api::Type::String name: 'name' - description: 'Name of the topic.' + description: 'The name of the resource group.' + required: true + input: true + - !ruby/object:Api::Type::String + name: 'location' + description: 'The location where the resource group should be created.' + required: true + input: true + - !ruby/object:Api::Type::KeyValuePairs + name: 'tags' + description: 'A mapping of tags to assign to the resource group.' diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index c8417623dcb3..e846e6644240 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -3,6 +3,14 @@ name: AzureRm overrides: !ruby/object:Provider::ResourceOverrides ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride import_format: ["projects/{{project}}/notes/{{name}}"] + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + custom_schema: 'templates/terraform/custom_schema/resource_group_name.erb' + location: !ruby/object:Provider::Terraform::PropertyOverride + custom_schema: 'templates/terraform/custom_schema/location.erb' + tags: !ruby/object:Provider::Terraform::PropertyOverride + default_from_api: true + custom_schema: 'templates/terraform/custom_schema/tags.erb' example: - !ruby/object:Provider::Terraform::Examples name: "container_analysis_note_basic" diff --git a/provider/terraform/property_override.rb b/provider/terraform/property_override.rb index 881257ad51e1..a75d95448847 100644 --- a/provider/terraform/property_override.rb +++ b/provider/terraform/property_override.rb @@ -75,6 +75,9 @@ module OverrideFields # so the function header *is* part of the custom code template. # As with flatten, `property` and `prefix` are available. attr_reader :custom_expand + + # Azure Experiment, specify custom schema to replace the standard one + attr_reader :custom_schema end # Support for schema ValidateFunc functionality. @@ -118,6 +121,8 @@ def validate check_optional_property :custom_flatten, String check_optional_property :custom_expand, String + check_optional_property :custom_schema, String + raise "'default_value' and 'default_from_api' cannot be both set" \ if default_from_api && !default_value.nil? end diff --git a/templates/terraform/custom_schema/location.erb b/templates/terraform/custom_schema/location.erb new file mode 100644 index 000000000000..1ac55d92b40e --- /dev/null +++ b/templates/terraform/custom_schema/location.erb @@ -0,0 +1 @@ +locationSchema() \ No newline at end of file diff --git a/templates/terraform/custom_schema/resource_group_name.erb b/templates/terraform/custom_schema/resource_group_name.erb new file mode 100644 index 000000000000..db0ac867580d --- /dev/null +++ b/templates/terraform/custom_schema/resource_group_name.erb @@ -0,0 +1 @@ +resourceGroupNameSchema() \ No newline at end of file diff --git a/templates/terraform/custom_schema/tags.erb b/templates/terraform/custom_schema/tags.erb new file mode 100644 index 000000000000..a06d8e3ceecd --- /dev/null +++ b/templates/terraform/custom_schema/tags.erb @@ -0,0 +1 @@ +tagsSchema() \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 071c8d48374a..d246bbe87f91 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -37,8 +37,6 @@ package azurerm <% azure_is_resource_group = object.name == "ResourceGroup" - azure_has_location = true - azure_has_tags = true azure_client_name = "#{object.name}sClient".camelcase(:lower) -%> @@ -80,12 +78,6 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(build_schema_property(prop, object)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> -<% if azure_has_location -%> - "location": locationSchema(), -<% end -%> -<% if azure_has_tags -%> - "tags": tagsSchema(), -<% end -%> <% if has_project -%> "project": { Type: schema.TypeString, @@ -165,7 +157,7 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := client.Get(ctx, /* TODO */) + resp, err := client.Get(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { return err } diff --git a/templates/terraform/schema_property.erb b/templates/terraform/schema_property.erb index d3d0401030bb..2c96068e0244 100644 --- a/templates/terraform/schema_property.erb +++ b/templates/terraform/schema_property.erb @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> +<% if property.custom_schema -%> +"<%= property.name.underscore -%>": <%= compile_template(property.custom_schema, property: property) -%>, +<% else -%> <% if tf_types.include?(property.class) -%> "<%= property.name.underscore -%>": { <% if property.is_set -%> @@ -136,3 +139,4 @@ <% else -%> // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> +<% end # property.custom_schema -%> From 5c991645e2e0141f757afbe67f5588b7e146fa9c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 21 Nov 2018 03:07:24 -0500 Subject: [PATCH 007/175] Add some Azure rest spec support --- api/product.rb | 7 +++ api/resource.rb | 8 +++ api/type.rb | 4 ++ .../resource_azurerm_resource_group.go | 49 +++---------------- .../r/azurerm_resource_group.html.markdown | 3 +- products/azresourcegroup/api.yaml | 9 ++++ products/azresourcegroup/terraform.yaml | 2 +- provider/terraform.rb | 31 ++++++++++++ provider/terraform/property_override.rb | 2 +- provider/terraform/resource_override.rb | 6 +++ templates/terraform/resource.erb | 41 ++++++---------- 11 files changed, 91 insertions(+), 71 deletions(-) diff --git a/api/product.rb b/api/product.rb index baf1ed75587b..e00bd5abefea 100644 --- a/api/product.rb +++ b/api/product.rb @@ -24,6 +24,10 @@ class Product < Api::Object::Named attr_reader :versions attr_reader :base_url + # Azure Specific Properties + attr_reader :azure_namespace + attr_reader :azure_version + include Compile::Core def validate @@ -35,6 +39,9 @@ def validate check_property :scopes, ::Array check_property_list :scopes, String + check_property :azure_namespace, String + check_property :azure_version, String + check_versions end diff --git a/api/resource.rb b/api/resource.rb index 1ab186de0c69..392f8cc9baa4 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -66,6 +66,10 @@ module Properties # Azure Specific Attributes attr_reader :azure_create_async attr_reader :azure_delete_async + attr_reader :azure_create_or_update_verb + attr_reader :azure_get_verb + attr_reader :azure_delete_verb + attr_reader :azure_parameters_type end include Properties @@ -260,6 +264,10 @@ def validate check_optional_property :azure_create_async, :boolean check_optional_property :azure_delete_async, :boolean + check_optional_property :azure_create_or_update_verb, String + check_optional_property :azure_get_verb, String + check_optional_property :azure_delete_verb, String + check_optional_property :azure_parameters_type, String set_variables(@parameters, :__resource) set_variables(@properties, :__resource) diff --git a/api/type.rb b/api/type.rb index 008ebcc2394b..96876ca27924 100644 --- a/api/type.rb +++ b/api/type.rb @@ -41,6 +41,8 @@ module Fields # Can only be overriden - we should never set this ourselves. attr_reader :new_type + + attr_reader :azure_api_path end include Fields @@ -69,6 +71,8 @@ def validate :update_verb, %i[POST PUT PATCH NONE], @__resource&.update_verb, Symbol check_optional_property :update_url, ::String + check_optional_property :azure_api_path, ::String + check_default_value_property end diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_azurerm_resource_group.go index 603ebfd041b0..c00b5993f19a 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group.go +++ b/build/azterraform/azurerm/resource_azurerm_resource_group.go @@ -41,31 +41,16 @@ func resourceAzureRmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta int client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext - obj := make(map[string]interface{}) - nameProp, err := expandAzureRmResourceGroupName(d.Get("name"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { - obj["name"] = nameProp - } - locationProp, err := expandAzureRmResourceGroupLocation(d.Get("location"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("location"); !isEmptyValue(reflect.ValueOf(locationProp)) && (ok || !reflect.DeepEqual(v, locationProp)) { - obj["location"] = locationProp - } - tagsProp, err := expandAzureRmResourceGroupTags(d.Get("tags"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("tags"); !isEmptyValue(reflect.ValueOf(tagsProp)) && (ok || !reflect.DeepEqual(v, tagsProp)) { - obj["tags"] = tagsProp - } - + name := d.Get("name").(string) + location := d.Get("location").(string) + tags := d.Get("tags").(map[string]interface{}) + parameters := resources.Group{ + Location: utils.String(location), + Tags: expandAzureRmResourceGroupTags(tags), + } - name := d.Get("name").(string) - // TODO parameters if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { return fmt.Errorf("Error creating ResourceGroup: %+v", err) @@ -157,23 +142,3 @@ func flattenAzureRmResourceGroupLocation(v interface{}) interface{} { func flattenAzureRmResourceGroupTags(v interface{}) interface{} { return v } - - -func expandAzureRmResourceGroupName(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { - return v, nil -} - -func expandAzureRmResourceGroupLocation(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { - return v, nil -} - -func expandAzureRmResourceGroupTags(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { - if v == nil { - return map[string]string{}, nil - } - m := make(map[string]string) - for k, val := range v.(map[string]interface{}) { - m[k] = val.(string) - } - return m, nil -} diff --git a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown index f0902048ca5d..adc23c45f4f2 100644 --- a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown +++ b/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown @@ -73,7 +73,6 @@ The following arguments are supported: ResourceGroup can be imported using any of these accepted formats: ``` -$ terraform import google_azure_rm_resource_group.default projects/{{project}}/notes/{{name}} -$ terraform import google_azure_rm_resource_group.default {{project}}/{{name}} +$ terraform import google_azure_rm_resource_group.default NotUsedInAzure/{{name}} $ terraform import google_azure_rm_resource_group.default {{name}} ``` diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 05c411b899ae..bbcdee23beb3 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -7,11 +7,18 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure +azure_namespace: 'Microsoft.Resources' +azure_version: 'stable/2018-05-01' objects: - !ruby/object:Api::Resource name: 'ResourceGroup' + api_name: ResourceGroups base_url: NotUsedInAzure + azure_create_or_update_verb: CreateOrUpdate + azure_get_verb: Get + azure_delete_verb: Delete azure_delete_async: true + azure_parameters_type: ResourceGroup description: | Manages a resource group on Azure. properties: @@ -25,6 +32,8 @@ objects: description: 'The location where the resource group should be created.' required: true input: true + azure_api_path: 'location' - !ruby/object:Api::Type::KeyValuePairs name: 'tags' description: 'A mapping of tags to assign to the resource group.' + azure_api_path: 'tags' diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index e846e6644240..4dc880850e14 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -2,7 +2,7 @@ name: AzureRm overrides: !ruby/object:Provider::ResourceOverrides ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride - import_format: ["projects/{{project}}/notes/{{name}}"] + azure_parameters_type: Group properties: name: !ruby/object:Provider::Terraform::PropertyOverride custom_schema: 'templates/terraform/custom_schema/resource_group_name.erb' diff --git a/provider/terraform.rb b/provider/terraform.rb index 373a00994743..c2109abf6029 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -61,6 +61,37 @@ def tf_types } end + # BEGIN Azure Specific Methods + + def go_type(property) + go_types[property.class] + end + + def go_types + { + Api::Type::Boolean => 'bool', + Api::Type::String => 'string', + Api::Type::KeyValuePairs => 'map[string]interface{}', + } + end + + def azure_address_of_func(property) + azure_address_of_funcs[property.class] + end + + def azure_address_of_funcs + { + Api::Type::Boolean => 'utils.Bool', + Api::Type::String => 'utils.String', + } + end + + def azure_resource_go_package(product) + product.azure_namespace.split('.').last.camelcase(:lower) + end + + # END Azure Specific Methods + def updatable?(resource, properties) !resource.input || !properties.reject { |p| p.update_url.nil? }.empty? end diff --git a/provider/terraform/property_override.rb b/provider/terraform/property_override.rb index a75d95448847..4a00125d2e73 100644 --- a/provider/terraform/property_override.rb +++ b/provider/terraform/property_override.rb @@ -76,7 +76,7 @@ module OverrideFields # As with flatten, `property` and `prefix` are available. attr_reader :custom_expand - # Azure Experiment, specify custom schema to replace the standard one + # Azure Specific Properties attr_reader :custom_schema end diff --git a/provider/terraform/resource_override.rb b/provider/terraform/resource_override.rb index ce17d4e0295c..7b478d3a64e4 100644 --- a/provider/terraform/resource_override.rb +++ b/provider/terraform/resource_override.rb @@ -38,6 +38,9 @@ module OverrideProperties # New examples in documentation - will take the "examples" name when # old-style examples are gone. attr_reader :example + + # Azure Specific Properties + attr_reader :azure_parameters_type end # A class to control overridden properties on terraform.yaml in lieu of @@ -61,6 +64,9 @@ def validate check_optional_property :custom_code, Provider::Terraform::CustomCode check_optional_property :docs, Provider::Terraform::Docs + + check_optional_property :azure_parameters_type, String + check_property :import_format, Array check_property_list :import_format, String end diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index d246bbe87f91..9dfe2cb22647 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -37,7 +37,7 @@ package azurerm <% azure_is_resource_group = object.name == "ResourceGroup" - azure_client_name = "#{object.name}sClient".camelcase(:lower) + azure_client_name = "#{object.api_name}Client".camelcase(:lower) -%> func resource<%= resource_name -%>() *schema.Resource { @@ -110,19 +110,21 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in ctx := meta.(*ArmClient).StopContext - obj := make(map[string]interface{}) <% settable_properties.each do |prop| -%> - <%= prop.api_name -%>Prop, err := expand<%= resource_name -%><%= titlelize_property(prop) -%>(d.Get("<%= prop.name.underscore -%>"), d, config) - if err != nil { - return err -<% unless prop.send_empty_value -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); !isEmptyValue(reflect.ValueOf(<%= prop.api_name -%>Prop)) && (ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop)) { + <%= prop.name.camelcase(:lower) -%> := d.Get("<%= prop.name.underscore -%>").(<%= go_type(prop) -%>) +<% end -%> + + parameters := <%= azure_resource_go_package(object.__product) -%>.<%= object.azure_parameters_type -%>{ +<% settable_properties.each do |prop| -%> +<% unless prop.name == "name" || prop.name == "resourceGroupName" -%> +<% unless azure_address_of_func(prop).nil? -%> + <%= prop.azure_api_path.camelcase(:upper) -%>: <%= azure_address_of_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), <% else -%> - } else if v, ok := d.GetOkExists("<%= prop.name.underscore -%>"); ok || !reflect.DeepEqual(v, <%= prop.api_name -%>Prop) { + <%= prop.azure_api_path.camelcase(:upper) -%>: expand<%= resource_name -%><%= titlelize_property(prop) -%>(<%= prop.name.camelcase(:lower) -%>), <% end -%> - obj["<%= prop.api_name -%>"] = <%= prop.api_name -%>Prop - } +<% end -%> <% end -%> + } <% if object.custom_code.encoder -%> obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) @@ -140,15 +142,8 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in defer mutexKV.Unlock(lockName) <% end -%> - name := d.Get("name").(string) -<% unless azure_is_resource_group -%> - resourceGroup := d.Get("resource_group_name").(string) -<% end -%> - - // TODO parameters - <% unless object.azure_create_async -%> - if _, err := client.CreateOrUpdate(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { + if _, err := client.<%= object.azure_create_or_update_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } <% else -%> @@ -157,7 +152,7 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := client.Get(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_get_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { return err } @@ -182,7 +177,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) // TODO: Get name out <% end -%> - resp, err := client.Get(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_get_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) @@ -262,7 +257,7 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% unless object.azure_delete_async -%> // TODO: Synced Delete Operation <% else -%> - future, err := client.Delete(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + future, err := client.<%= object.azure_delete_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if response.WasNotFound(deleteFuture.Response()) { return nil @@ -284,10 +279,6 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <%= lines(build_flatten_method(resource_name, prop), 1) -%> <% end -%> -<% settable_properties.each do |prop| -%> -<%= lines(build_expand_method(resource_name, prop), 1) -%> -<% end -%> - <% if object.custom_code.encoder -%> func resource<%= resource_name -%>Encoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { <%= lines(compile(object.custom_code.encoder)) -%> From 52466d3f8d128d77f8e304fc9e389d22411f8d8e Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 21 Nov 2018 03:20:37 -0500 Subject: [PATCH 008/175] Update Ansible script according to the latest configuration --- .../google/gcp_azurerm_resource_group.py | 56 +++++++++++++------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py b/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py index 809790af501c..d966b3e1457f 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py +++ b/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py @@ -30,9 +30,9 @@ DOCUMENTATION = ''' --- -module: gcp_azurerm_resource_group +module: gcp_zurerm_resource_group description: -- A named resource to which messages are sent by publishers. +- Manages a resource group on Azure. short_description: Creates a GCP ResourceGroup version_added: 2.6 author: Google Inc. (@googlecloudplatform) @@ -50,7 +50,15 @@ default: present name: description: - - Name of the topic. + - The name of the resource group. + required: true + location: + description: + - The location where the resource group should be created. + required: true + tags: + description: + - A mapping of tags to assign to the resource group. required: false extends_documentation_fragment: gcp ''' @@ -59,9 +67,19 @@ RETURN = ''' name: description: - - Name of the topic. + - The name of the resource group. + returned: success + type: str +location: + description: + - The location where the resource group should be created. returned: success type: str +tags: + description: + - A mapping of tags to assign to the resource group. + returned: success + type: dict ''' ################################################################################ @@ -82,12 +100,14 @@ def main(): module = GcpModule( argument_spec=dict( state=dict(default='present', choices=['present', 'absent'], type='str'), - name=dict(type='str') + name=dict(required=True, type='str'), + location=dict(required=True, type='str'), + tags=dict(type='dict') ) ) if not module.params['scopes']: - module.params['scopes'] = ['https://www.googleapis.com/auth/pubsub'] + module.params['scopes'] = ['NotUsedInAzure'] state = module.params['state'] @@ -106,7 +126,7 @@ def main(): changed = True else: if state == 'present': - fetch = create(module, self_link(module)) + fetch = create(module, collection(module)) changed = True else: fetch = {} @@ -117,23 +137,25 @@ def main(): def create(module, link): - auth = GcpSession(module, 'azurerm') - return return_if_object(module, auth.put(link, resource_to_request(module))) + auth = GcpSession(module, 'zurerm') + return return_if_object(module, auth.post(link, resource_to_request(module))) def update(module, link): - auth = GcpSession(module, 'azurerm') + auth = GcpSession(module, 'zurerm') return return_if_object(module, auth.put(link, resource_to_request(module))) def delete(module, link): - auth = GcpSession(module, 'azurerm') + auth = GcpSession(module, 'zurerm') return return_if_object(module, auth.delete(link)) def resource_to_request(module): request = { - u'name': module.params.get('name') + u'name': module.params.get('name'), + u'location': module.params.get('location'), + u'tags': module.params.get('tags') } request = encode_request(request, module) return_vals = {} @@ -145,16 +167,16 @@ def resource_to_request(module): def fetch_resource(module, link, allow_not_found=True): - auth = GcpSession(module, 'azurerm') + auth = GcpSession(module, 'zurerm') return return_if_object(module, auth.get(link), allow_not_found) def self_link(module): - return "https://pubsub.googleapis.com/v1/projects/{project}/topics/{name}".format(**module.params) + return "NotUsedInAzureNotUsedInAzure/{name}".format(**module.params) def collection(module): - return "https://pubsub.googleapis.com/v1/projects/{project}/topics".format(**module.params) + return "NotUsedInAzureNotUsedInAzure".format(**module.params) def return_if_object(module, response, allow_not_found=False): @@ -203,7 +225,9 @@ def is_different(module, response): # This is for doing comparisons with Ansible's current parameters. def response_to_hash(module, response): return { - u'name': response.get(u'name') + u'name': module.params.get('name'), + u'location': module.params.get('location'), + u'tags': response.get(u'tags') } From 355b58775c3f54a99367b2d8f66c386fe2a8c139 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 27 Nov 2018 01:48:09 -0500 Subject: [PATCH 009/175] Finish resource group CRUD --- api/type.rb | 6 + ...roup.go => resource_arm_resource_group.go} | 270 ++++++++---------- ...urce_arm_resource_group_generated_test.go} | 16 +- ...kdown => arm_resource_group.html.markdown} | 10 +- products/azresourcegroup/api.yaml | 3 +- products/azresourcegroup/terraform.yaml | 6 +- .../terraform/custom_schema/get_location.erb | 1 + .../terraform/custom_schema/set_location.erb | 3 + .../terraform/custom_schema/set_tags.erb | 1 + templates/terraform/resource.erb | 46 ++- 10 files changed, 174 insertions(+), 188 deletions(-) rename build/azterraform/azurerm/{resource_azurerm_resource_group.go => resource_arm_resource_group.go} (61%) rename build/azterraform/azurerm/{resource_azurerm_resource_group_generated_test.go => resource_arm_resource_group_generated_test.go} (71%) rename build/azterraform/website/docs/r/{azurerm_resource_group.html.markdown => arm_resource_group.html.markdown} (86%) create mode 100644 templates/terraform/custom_schema/get_location.erb create mode 100644 templates/terraform/custom_schema/set_location.erb create mode 100644 templates/terraform/custom_schema/set_tags.erb diff --git a/api/type.rb b/api/type.rb index 96876ca27924..79f37e1c6639 100644 --- a/api/type.rb +++ b/api/type.rb @@ -43,6 +43,9 @@ module Fields attr_reader :new_type attr_reader :azure_api_path + attr_reader :custom_schema_get + attr_reader :custom_schema_set + attr_reader :custom_expand_func end include Fields @@ -72,6 +75,9 @@ def validate check_optional_property :update_url, ::String check_optional_property :azure_api_path, ::String + check_optional_property :custom_schema_get, ::String + check_optional_property :custom_schema_set, ::String + check_optional_property :custom_expand_func, ::String check_default_value_property end diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go similarity index 61% rename from build/azterraform/azurerm/resource_azurerm_resource_group.go rename to build/azterraform/azurerm/resource_arm_resource_group.go index c00b5993f19a..3e20f8f2b2e6 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -1,144 +1,126 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - - -func resourceAzureRmResourceGroup() *schema.Resource { - return &schema.Resource{ - Create: resourceAzureRmResourceGroupCreateOrUpdate, - Read: resourceAzureRmResourceGroupRead, - Update: resourceAzureRmResourceGroupCreateOrUpdate, - Delete: resourceAzureRmResourceGroupDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ -"location": locationSchema(), -"name": resourceGroupNameSchema(), -"tags": tagsSchema(), - }, - } -} - -func resourceAzureRmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - location := d.Get("location").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := resources.Group{ - Location: utils.String(location), - Tags: expandAzureRmResourceGroupTags(tags), - } - - - - if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { - return fmt.Errorf("Error creating ResourceGroup: %+v", err) - } - - - resp, err := client.Get(ctx, name) - if err != nil { - return err - } - d.SetId(*resp.ID) - - return resourceAzureRmResourceGroupRead(d, meta) -} - -func resourceAzureRmResourceGroupRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) - } - name := id.ResourceGroup - - resp, err := client.Get(ctx, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] ResourceGroup %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading ResourceGroup: %+v", err) - } - - - - - d.Set("name", resp.Name) - if err := d.Set("name", flattenAzureRmResourceGroupName(res["name"])); err != nil { - return fmt.Errorf("Error reading ResourceGroup: %s", err) - } - if err := d.Set("location", flattenAzureRmResourceGroupLocation(res["location"])); err != nil { - return fmt.Errorf("Error reading ResourceGroup: %s", err) - } - if err := d.Set("tags", flattenAzureRmResourceGroupTags(res["tags"])); err != nil { - return fmt.Errorf("Error reading ResourceGroup: %s", err) - } - - return nil -} - -func resourceAzureRmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) - } - name := id.ResourceGroup - - future, err := client.Delete(ctx, name) - if err != nil { - if response.WasNotFound(deleteFuture.Response()) { - return nil - } - return fmt.Errorf("Error deleting ResourceGroup %q: %+v", name, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(deleteFuture.Response()) { - return fmt.Errorf("Error waiting for deleting ResourceGroup %q: %+v", name, err) - } - } - - return nil -} - -func flattenAzureRmResourceGroupName(v interface{}) interface{} { - return v -} - -func flattenAzureRmResourceGroupLocation(v interface{}) interface{} { - return v -} - -func flattenAzureRmResourceGroupTags(v interface{}) interface{} { - return v -} +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + + +func resourceArmResourceGroup() *schema.Resource { + return &schema.Resource{ + Create: resourceArmResourceGroupCreateOrUpdate, + Read: resourceArmResourceGroupRead, + Update: resourceArmResourceGroupCreateOrUpdate, + Delete: resourceArmResourceGroupDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ +"location": locationSchema(), +"name": resourceGroupNameSchema(), +"tags": tagsSchema(), + }, + } +} + +func resourceArmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).resourceGroupsClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + location := azureRMNormalizeLocation(d.Get("location").(string)) + tags := d.Get("tags").(map[string]interface{}) + + parameters := resources.Group{ + Location: utils.String(location), + Tags: expandTags(tags), + } + + + + if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { + return fmt.Errorf("Error creating ResourceGroup: %+v", err) + } + + + resp, err := client.Get(ctx, name) + if err != nil { + return err + } + d.SetId(*resp.ID) + + return resourceArmResourceGroupRead(d, meta) +} + +func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).resourceGroupsClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + } + name := id.ResourceGroup + + resp, err := client.Get(ctx, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] ResourceGroup %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading ResourceGroup: %+v", err) + } + + + + d.Set("name", resp.Name) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) +} + flattenAndSetTags(d, resp.Tags) + + return nil +} + +func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).resourceGroupsClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + } + name := id.ResourceGroup + + future, err := client.Delete(ctx, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting ResourceGroup %q: %+v", name, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting ResourceGroup %q: %+v", name, err) + } + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go similarity index 71% rename from build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go rename to build/azterraform/azurerm/resource_arm_resource_group_generated_test.go index 7ecee8b38745..3c4231ed9a59 100644 --- a/build/azterraform/azurerm/resource_azurerm_resource_group_generated_test.go +++ b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go @@ -23,19 +23,19 @@ import ( ) -func TestAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { +func TestAccArmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, - CheckDestroy: testAccCheckAzureRmResourceGroupDestroy, + CheckDestroy: testAccCheckArmResourceGroupDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(acctest.RandString(10)), + Config: testAccArmResourceGroup_containerAnalysisNoteBasicExample(acctest.RandString(10)), }, { - ResourceName: "google_azure_rm_resource_group.note", + ResourceName: "google_arm_resource_group.note", ImportState: true, ImportStateVerify: true, }, @@ -43,7 +43,7 @@ func TestAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) }) } -func testAccAzureRmResourceGroup_containerAnalysisNoteBasicExample(val string) string { +func testAccArmResourceGroup_containerAnalysisNoteBasicExample(val string) string { return fmt.Sprintf(` resource "google_container_analysis_note" "note" { name = "test-attestor-note-%s" @@ -58,9 +58,9 @@ resource "google_container_analysis_note" "note" { } -func testAccCheckAzureRmResourceGroupDestroy(s *terraform.State) error { +func testAccCheckArmResourceGroupDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { - if rs.Type != "google_azure_rm_resource_group" { + if rs.Type != "google_arm_resource_group" { continue } @@ -73,7 +73,7 @@ func testAccCheckAzureRmResourceGroupDestroy(s *terraform.State) error { _, err = sendRequest(config, "GET", url, nil) if err == nil { - return fmt.Errorf("AzureRmResourceGroup still exists at %s", url) + return fmt.Errorf("ArmResourceGroup still exists at %s", url) } } diff --git a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown b/build/azterraform/website/docs/r/arm_resource_group.html.markdown similarity index 86% rename from build/azterraform/website/docs/r/azurerm_resource_group.html.markdown rename to build/azterraform/website/docs/r/arm_resource_group.html.markdown index adc23c45f4f2..ee4ae154ca86 100644 --- a/build/azterraform/website/docs/r/azurerm_resource_group.html.markdown +++ b/build/azterraform/website/docs/r/arm_resource_group.html.markdown @@ -13,13 +13,13 @@ # # ---------------------------------------------------------------------------- layout: "google" -page_title: "Google: google_azure_rm_resource_group" -sidebar_current: "docs-google-azure-rm-resource-group" +page_title: "Google: google_arm_resource_group" +sidebar_current: "docs-google-arm-resource-group" description: |- Manages a resource group on Azure. --- -# google\_azure\_rm\_resource\_group +# google\_arm\_resource\_group Manages a resource group on Azure. @@ -73,6 +73,6 @@ The following arguments are supported: ResourceGroup can be imported using any of these accepted formats: ``` -$ terraform import google_azure_rm_resource_group.default NotUsedInAzure/{{name}} -$ terraform import google_azure_rm_resource_group.default {{name}} +$ terraform import google_arm_resource_group.default NotUsedInAzure/{{name}} +$ terraform import google_arm_resource_group.default {{name}} ``` diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index bbcdee23beb3..ff87ce43c016 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Resource Group -prefix: azurerm +prefix: arm versions: - !ruby/object:Api::Product::Version name: ga @@ -27,6 +27,7 @@ objects: description: 'The name of the resource group.' required: true input: true + azure_api_path: 'name' - !ruby/object:Api::Type::String name: 'location' description: 'The location where the resource group should be created.' diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index 4dc880850e14..cefed6aba297 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Terraform::Config -name: AzureRm +name: Arm overrides: !ruby/object:Provider::ResourceOverrides ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride azure_parameters_type: Group @@ -8,9 +8,13 @@ overrides: !ruby/object:Provider::ResourceOverrides custom_schema: 'templates/terraform/custom_schema/resource_group_name.erb' location: !ruby/object:Provider::Terraform::PropertyOverride custom_schema: 'templates/terraform/custom_schema/location.erb' + custom_schema_get: 'templates/terraform/custom_schema/get_location.erb' + custom_schema_set: 'templates/terraform/custom_schema/set_location.erb' tags: !ruby/object:Provider::Terraform::PropertyOverride default_from_api: true custom_schema: 'templates/terraform/custom_schema/tags.erb' + custom_expand_func: 'expandTags' + custom_schema_set: 'templates/terraform/custom_schema/set_tags.erb' example: - !ruby/object:Provider::Terraform::Examples name: "container_analysis_note_basic" diff --git a/templates/terraform/custom_schema/get_location.erb b/templates/terraform/custom_schema/get_location.erb new file mode 100644 index 000000000000..94097e633fa0 --- /dev/null +++ b/templates/terraform/custom_schema/get_location.erb @@ -0,0 +1 @@ +azureRMNormalizeLocation(d.Get("<%= schema -%>").(string)) \ No newline at end of file diff --git a/templates/terraform/custom_schema/set_location.erb b/templates/terraform/custom_schema/set_location.erb new file mode 100644 index 000000000000..e73388ed062f --- /dev/null +++ b/templates/terraform/custom_schema/set_location.erb @@ -0,0 +1,3 @@ +if location := <%= response -%>.Location; location != nil { + d.Set("<%= schema -%>", azureRMNormalizeLocation(*location)) +} \ No newline at end of file diff --git a/templates/terraform/custom_schema/set_tags.erb b/templates/terraform/custom_schema/set_tags.erb new file mode 100644 index 000000000000..5d2e085201c8 --- /dev/null +++ b/templates/terraform/custom_schema/set_tags.erb @@ -0,0 +1 @@ +flattenAndSetTags(d, <%= response -%>.Tags) \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 9dfe2cb22647..e1fafba5869c 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -111,16 +111,22 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in ctx := meta.(*ArmClient).StopContext <% settable_properties.each do |prop| -%> +<% unless prop.custom_schema_get -%> <%= prop.name.camelcase(:lower) -%> := d.Get("<%= prop.name.underscore -%>").(<%= go_type(prop) -%>) +<% else -%> + <%= prop.name.camelcase(:lower) -%> := <%= lines(compile_template(prop.custom_schema_get, property: prop, schema: prop.name.underscore)) -%> +<% end -%> <% end -%> parameters := <%= azure_resource_go_package(object.__product) -%>.<%= object.azure_parameters_type -%>{ <% settable_properties.each do |prop| -%> <% unless prop.name == "name" || prop.name == "resourceGroupName" -%> -<% unless azure_address_of_func(prop).nil? -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: <%= azure_address_of_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), -<% else -%> +<% if !prop.custom_expand_func.nil? -%> + <%= prop.azure_api_path.camelcase(:upper) -%>: <%= prop.custom_expand_func -%>(<%= prop.name.camelcase(:lower) -%>), +<% elsif azure_address_of_func(prop).nil? -%> <%= prop.azure_api_path.camelcase(:upper) -%>: expand<%= resource_name -%><%= titlelize_property(prop) -%>(<%= prop.name.camelcase(:lower) -%>), +<% else -%> + <%= prop.azure_api_path.camelcase(:upper) -%>: <%= azure_address_of_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), <% end -%> <% end -%> <% end -%> @@ -204,26 +210,12 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% end -%> - - d.Set("name", resp.Name) -<% properties.reject(&:ignore_read).each do |prop| -%> - if err := d.Set("<%= prop.name.underscore -%>", flatten<%= resource_name -%><%= titlelize_property(prop) -%>(res["<%= prop.api_name -%>"])); err != nil { - return fmt.Errorf("Error reading <%= object.name -%>: %s", err) - } -<% end -%> -<% if has_self_link -%> - if err := d.Set("self_link", ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil { - return fmt.Errorf("Error reading <%= object.name -%>: %s", err) - } -<% end -%> -<% if has_project -%> - project, err := getProject(d, config) - if err != nil { - return err - } - if err := d.Set("project", project); err != nil { - return fmt.Errorf("Error reading <%= object.name -%>: %s", err) - } +<% properties.each do |prop| -%> +<% unless prop.custom_schema_set -%> + d.Set("<%= prop.name.underscore -%>", resp.<%= prop.azure_api_path.camelcase(:upper) -%>) +<% else -%> + <%= lines(compile_template(prop.custom_schema_set, property: prop, schema: prop.name.underscore, response: 'resp')) -%> +<% end -%> <% end -%> return nil @@ -259,14 +251,14 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% else -%> future, err := client.<%= object.azure_delete_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { - if response.WasNotFound(deleteFuture.Response()) { + if response.WasNotFound(future.Response()) { return nil } return fmt.Errorf("Error deleting <%= object.name -%> %q: %+v", name, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(deleteFuture.Response()) { + if !response.WasNotFound(future.Response()) { return fmt.Errorf("Error waiting for deleting <%= object.name -%> %q: %+v", name, err) } } @@ -275,10 +267,6 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ return nil } -<% properties.reject(&:ignore_read).each do |prop| -%> -<%= lines(build_flatten_method(resource_name, prop), 1) -%> -<% end -%> - <% if object.custom_code.encoder -%> func resource<%= resource_name -%>Encoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { <%= lines(compile(object.custom_code.encoder)) -%> From 951074400f8bf1f21cbf9c103b82cebeb10f0f33 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 27 Nov 2018 12:50:21 -0500 Subject: [PATCH 010/175] Adjust documentation to match Azure format --- ...ource_arm_resource_group_generated_test.go | 20 ++--- .../docs/r/arm_resource_group.html.markdown | 78 ------------------- .../docs/r/resource_group.html.markdown | 66 ++++++++++++++++ products/azresourcegroup/terraform.yaml | 7 +- provider/terraform.rb | 2 +- .../terraform/examples/resource_group.tf.erb | 8 ++ .../terraform/property_documentation.erb | 8 +- .../terraform/resource.html.markdown.erb | 47 +++-------- 8 files changed, 100 insertions(+), 136 deletions(-) delete mode 100644 build/azterraform/website/docs/r/arm_resource_group.html.markdown create mode 100644 build/azterraform/website/docs/r/resource_group.html.markdown create mode 100644 templates/terraform/examples/resource_group.tf.erb diff --git a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go index 3c4231ed9a59..937a6ec6475f 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go +++ b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go @@ -23,7 +23,7 @@ import ( ) -func TestAccArmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { +func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ @@ -32,10 +32,10 @@ func TestAccArmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { CheckDestroy: testAccCheckArmResourceGroupDestroy, Steps: []resource.TestStep{ { - Config: testAccArmResourceGroup_containerAnalysisNoteBasicExample(acctest.RandString(10)), + Config: testAccArmResourceGroup_resourceGroupExample(acctest.RandString(10)), }, { - ResourceName: "google_arm_resource_group.note", + ResourceName: "google_arm_resource_group.example", ImportState: true, ImportStateVerify: true, }, @@ -43,14 +43,14 @@ func TestAccArmResourceGroup_containerAnalysisNoteBasicExample(t *testing.T) { }) } -func testAccArmResourceGroup_containerAnalysisNoteBasicExample(val string) string { +func testAccArmResourceGroup_resourceGroupExample(val string) string { return fmt.Sprintf(` -resource "google_container_analysis_note" "note" { - name = "test-attestor-note-%s" - attestation_authority { - hint { - human_readable_name = "Attestor Note" - } +resource "azurerm_resource_group" "example" { + name = "ExampleRG-%s" + location = "West US" + + tags { + environment = "Production" } } `, val, diff --git a/build/azterraform/website/docs/r/arm_resource_group.html.markdown b/build/azterraform/website/docs/r/arm_resource_group.html.markdown deleted file mode 100644 index ee4ae154ca86..000000000000 --- a/build/azterraform/website/docs/r/arm_resource_group.html.markdown +++ /dev/null @@ -1,78 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "google" -page_title: "Google: google_arm_resource_group" -sidebar_current: "docs-google-arm-resource-group" -description: |- - Manages a resource group on Azure. ---- - -# google\_arm\_resource\_group - -Manages a resource group on Azure. - - - - -## Example Usage - Container Analysis Note Basic - - -```hcl -resource "google_container_analysis_note" "note" { - name = "test-attestor-note" - attestation_authority { - hint { - human_readable_name = "Attestor Note" - } - } -} -``` - -## Argument Reference - -The following arguments are supported: - - -* `name` - - (Required) - The name of the resource group. - -* `location` - - (Required) - The location where the resource group should be created. - - -- - - - - -* `tags` - - (Optional) - A mapping of tags to assign to the resource group. - - - - -## Import - -ResourceGroup can be imported using any of these accepted formats: - -``` -$ terraform import google_arm_resource_group.default NotUsedInAzure/{{name}} -$ terraform import google_arm_resource_group.default {{name}} -``` diff --git a/build/azterraform/website/docs/r/resource_group.html.markdown b/build/azterraform/website/docs/r/resource_group.html.markdown new file mode 100644 index 000000000000..ff11cac3d3e4 --- /dev/null +++ b/build/azterraform/website/docs/r/resource_group.html.markdown @@ -0,0 +1,66 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_resource_group" +sidebar_current: "docs-azurerm-resource-resource-group" +description: |- + Manages a resource group on Azure. +--- + +# azurerm_resource_group +Manages a resource group on Azure. + + + +## Example Usage - Resource Group + + +```hcl +resource "azurerm_resource_group" "example" { + name = "ExampleRG" + location = "West US" + + tags { + environment = "Production" + } +} +``` + +## Argument Reference + +The following arguments are supported: + + +* `name` - (Required) The name of the resource group. + +* `location` - (Required) The location where the resource group should be created. + +* `tags` - (Optional) A mapping of tags to assign to the resource group. +## Attributes Reference + +The following attributes are exported: + +* `id` - The resource group ID. + + + + +## Import + +ResourceGroup can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_resource_group.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example +``` diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index cefed6aba297..73e7af39861a 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -17,8 +17,7 @@ overrides: !ruby/object:Provider::ResourceOverrides custom_schema_set: 'templates/terraform/custom_schema/set_tags.erb' example: - !ruby/object:Provider::Terraform::Examples - name: "container_analysis_note_basic" - primary_resource_id: "note" - version: <%= _version_name %> + name: "resource_group" + primary_resource_id: "example" vars: - note_name: "test-attestor-note" + rg_name: "ExampleRG" diff --git a/provider/terraform.rb b/provider/terraform.rb index c2109abf6029..b047cea0f328 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -171,7 +171,7 @@ def generate_documentation(data) product_name = data[:product_name].underscore filepath = - File.join(target_folder, "#{product_name}_#{name}.html.markdown") + File.join(target_folder, "#{name}.html.markdown") generate_resource_file data.clone.merge( default_template: 'templates/terraform/resource.html.markdown.erb', out_file: filepath diff --git a/templates/terraform/examples/resource_group.tf.erb b/templates/terraform/examples/resource_group.tf.erb new file mode 100644 index 000000000000..9b07d98a78a1 --- /dev/null +++ b/templates/terraform/examples/resource_group.tf.erb @@ -0,0 +1,8 @@ +resource "azurerm_resource_group" "<%= ctx[:primary_resource_id] %>" { + name = "<%= ctx[:vars]["rg_name"] %>" + location = "West US" + + tags { + environment = "Production" + } +} \ No newline at end of file diff --git a/templates/terraform/property_documentation.erb b/templates/terraform/property_documentation.erb index bd770163ac5d..21bbadd86afd 100644 --- a/templates/terraform/property_documentation.erb +++ b/templates/terraform/property_documentation.erb @@ -1,11 +1,5 @@ -* `<%= property.name.underscore -%>` - -<% if property.required -%> - (Required) -<% elsif !property.output -%> - (Optional) -<% end -%> -<%= indent(property.description.strip.gsub("\n\n", "\n"), 2) -%> +* `<%= property.name.underscore -%>` - (<%= property.required ? 'Required' : 'Optional' %>) <%= property.description.strip.gsub("\n\n", "\n") -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> Structure is documented below. <% end -%> diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 5c92f49f555c..7548942cad82 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -36,19 +36,19 @@ directly inserted from YAML. -%> <% - resource_name = product_ns.underscore.downcase + '_' + object.name.underscore + resource_name = object.name.underscore properties = object.all_user_properties -%> --- <%= lines(autogen_notice :yaml) -%> -layout: "google" -page_title: "Google: google_<%= resource_name -%>" -sidebar_current: "docs-google-<%= resource_name.gsub("_", "-") -%>" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" +sidebar_current: "docs-azurerm-resource-<%= resource_name.gsub("_", "-") -%>" description: |- <%= indent(object.description.first_sentence, 2) %> --- -# google\_<%= resource_name.gsub("_", "\\_") %> +# azurerm_<%= resource_name -%> <%= lines(object.description) -%> @@ -78,13 +78,6 @@ To get more information about <%= object.name -%>, see: <% end -%> <% unless object.example.empty? -%> <%- object.example.each do |example| -%> - <%- unless example.skip_test -%> - - <%- end -%> ## Example Usage - <%= example.name.camelize(:upper).uncombine %> @@ -98,35 +91,20 @@ The following arguments are supported: <% properties.select(&:required).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> - <% properties.select(&:required).each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> -<%- unless object.docs.required_properties.nil? -%> -<%= "\n" + object.docs.required_properties -%> -<% end -%> - -- - - - <% properties.reject(&:required).reject(&:output).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> -<% if object.base_url.include?("{{project}}") -%> -* `project` - (Optional) The ID of the project in which the resource belongs. - If it is not provided, the provider project is used. -<% end -%> - <% properties.reject(&:required).reject(&:output).each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> -<%- unless object.docs.optional_properties.nil? -%> -<%= "\n" + object.docs.optional_properties -%> -<% end -%> - -<% unless properties.select(&:output).empty? && object.docs.attributes.nil? -%> ## Attributes Reference -In addition to the arguments listed above, the following computed attributes are exported: +The following attributes are exported: + +* `id` - The <%= resource_name.gsub("_", " ") -%> ID. <% properties.select(&:output).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> @@ -141,7 +119,6 @@ In addition to the arguments listed above, the following computed attributes are <%- unless object.docs.attributes.nil? -%> <%= "\n" + object.docs.attributes -%> <% end -%> -<% end -%> <% unless object.async.nil? -%> ## Timeouts @@ -158,10 +135,8 @@ This resource provides the following ## Import -<%= object.name -%> can be imported using any of these accepted formats: +<%= object.name -%> can be imported using the `resource id`, e.g. -``` -<% import_id_formats(object).each do |id_format| -%> -$ terraform import google_<%= resource_name -%>.default <%= id_format %> -<% end -%> +```shell +$ terraform import azurerm_<%= resource_name -%>.example /subscriptions/00000000-0000-0000-0000-000000000000/<%= object.name.camelcase(:lower) -%>s/example ``` From 429a6b6cf19e38ca7dccbca94977e742c32c8af4 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 5 Dec 2018 18:59:42 -0800 Subject: [PATCH 011/175] Refactoring schema properties --- api/azure/type.rb | 10 + api/compiler.rb | 2 + provider/azure/terraform/schema.rb | 63 ++++ provider/azure/terraform/sub_template.rb | 29 ++ provider/terraform.rb | 29 +- provider/terraform/sub_template.rb | 13 +- .../azure/terraform/schemas/location.erb | 1 + .../azure/terraform/schemas/location_get.erb | 5 + .../azure/terraform/schemas/location_set.erb | 5 + templates/terraform/resource.erb | 21 +- .../primitive.erb} | 270 +++++++++--------- templates/terraform/schemas/unsupport.erb | 1 + 12 files changed, 273 insertions(+), 176 deletions(-) create mode 100644 api/azure/type.rb create mode 100644 provider/azure/terraform/schema.rb create mode 100644 provider/azure/terraform/sub_template.rb create mode 100644 templates/azure/terraform/schemas/location.erb create mode 100644 templates/azure/terraform/schemas/location_get.erb create mode 100644 templates/azure/terraform/schemas/location_set.erb rename templates/terraform/{schema_property.erb => schemas/primitive.erb} (87%) create mode 100644 templates/terraform/schemas/unsupport.erb diff --git a/api/azure/type.rb b/api/azure/type.rb new file mode 100644 index 000000000000..e0dac1c01016 --- /dev/null +++ b/api/azure/type.rb @@ -0,0 +1,10 @@ +require 'api/type' + +module Api + module Azure + module Type + class Location < Api::Type::Primitive + end + end + end +end diff --git a/api/compiler.rb b/api/compiler.rb index 4b1c5c33b0dc..57599c752ec3 100644 --- a/api/compiler.rb +++ b/api/compiler.rb @@ -19,6 +19,8 @@ require 'compile/core' require 'google/yaml_validator' +require 'api/azure/type' + module Api # Process .yaml and produces output module class Compiler diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb new file mode 100644 index 000000000000..33b5ff82ca8b --- /dev/null +++ b/provider/azure/terraform/schema.rb @@ -0,0 +1,63 @@ +module Provider + module Azure + module Terraform + module Schema + + def go_type(property) + case property + when Api::Type::String, Api::Azure::Type::Location + 'string' + else + 'interface{}' + end + end + + def expand_func(property) + expand_funcs[property.class] + end + + def expand_funcs + { + Api::Type::Boolean => 'utils.Bool', + Api::Type::String => 'utils.String', + Api::Azure::Type::Location => "utils.String", + } + end + + def schema_property_template(property) + case property + when Api::Azure::Type::Location + 'templates/azure/terraform/schemas/location.erb' + else + 'templates/terraform/schemas/unsupport.erb' + end + end + + def schema_property_get_template(property) + case property + when Api::Azure::Type::Location + 'templates/azure/terraform/schemas/location_get.erb' + else + 'templates/terraform/schemas/unsupport.erb' + end + end + + def schema_property_set_template(property) + case property + when Api::Azure::Type::Location + 'templates/azure/terraform/schemas/location_set.erb' + else + 'templates/terraform/schemas/unsupport.erb' + end + end + + def will_property_set_dereference?(output_var, property) + return true if output_var != 'd' + return true if property.is_a? Api::Azure::Type::Location + false + end + + end + end + end +end diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb new file mode 100644 index 000000000000..238bad00fa15 --- /dev/null +++ b/provider/azure/terraform/sub_template.rb @@ -0,0 +1,29 @@ +module Provider + module Azure + module Terraform + module SubTemplate + + def build_schema_property_get(input, output, property, object, indentation = 0) + compile_template schema_property_get_template(property), + indentation: indentation, + input_var: input, + output_var: output, + prop_name: property.name.underscore, + property: property, + object: object + end + + def build_schema_property_set(input, output, property, object, indentation = 0) + compile_template schema_property_set_template(property), + indentation: indentation, + input_var: input, + output_var: output, + prop_name: property.name.underscore, + property: property, + object: object + end + + end + end + end +end diff --git a/provider/terraform.rb b/provider/terraform.rb index b047cea0f328..8454b6e2fe13 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -20,6 +20,9 @@ require 'provider/terraform/sub_template' require 'google/golang_utils' +require 'provider/azure/terraform/schema' +require 'provider/azure/terraform/sub_template' + module Provider # Code generator for Terraform Resources that manage Google Cloud Platform # resources. @@ -28,6 +31,9 @@ class Terraform < Provider::AbstractCore include Provider::Terraform::SubTemplate include Google::GolangUtils + include Provider::Azure::Terraform::Schema + include Provider::Azure::Terraform::SubTemplate + # Sorts properties in the order they should appear in the TF schema: # Required, Optional, Computed def order_properties(properties) @@ -63,29 +69,6 @@ def tf_types # BEGIN Azure Specific Methods - def go_type(property) - go_types[property.class] - end - - def go_types - { - Api::Type::Boolean => 'bool', - Api::Type::String => 'string', - Api::Type::KeyValuePairs => 'map[string]interface{}', - } - end - - def azure_address_of_func(property) - azure_address_of_funcs[property.class] - end - - def azure_address_of_funcs - { - Api::Type::Boolean => 'utils.Bool', - Api::Type::String => 'utils.String', - } - end - def azure_resource_go_package(product) product.azure_namespace.split('.').last.camelcase(:lower) end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 8f459afb18f3..206dcefb9131 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -17,10 +17,12 @@ module Provider class Terraform < Provider::AbstractCore # Functions to compile sub-templates. module SubTemplate - def build_schema_property(property, object) - compile_template'templates/terraform/schema_property.erb', - property: property, - object: object + def build_schema_property(property, object, indentation = 0) + compile_template schema_property_template(property), + indentation: indentation, + prop_name: property.name.underscore, + property: property, + object: object end # Transforms a Cloud API representation of a property into a Terraform @@ -71,7 +73,8 @@ def autogen_notice_text(line) def compile_template(template_file, data) ctx = binding data.each { |name, value| ctx.local_variable_set(name, value) } - compile_file(ctx, template_file).join("\n") + result = compile_file(ctx, template_file).join("\n") + indent result, data[:indentation] || 0 end end end diff --git a/templates/azure/terraform/schemas/location.erb b/templates/azure/terraform/schemas/location.erb new file mode 100644 index 000000000000..387cb2a3f14b --- /dev/null +++ b/templates/azure/terraform/schemas/location.erb @@ -0,0 +1 @@ +"<%= prop_name -%>": locationSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/location_get.erb b/templates/azure/terraform/schemas/location_get.erb new file mode 100644 index 000000000000..e3414a0d599d --- /dev/null +++ b/templates/azure/terraform/schemas/location_get.erb @@ -0,0 +1,5 @@ +<% if input_var == 'd' -%> +<%= output_var -%> := azureRMNormalizeLocation(<%= input_var -%>.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) +<% else -%> +<%= output_var -%> := azureRMNormalizeLocation(<%= input_var -%>["<%= prop_name -%>"].(<%= go_type(property) -%>)) +<% end -%> diff --git a/templates/azure/terraform/schemas/location_set.erb b/templates/azure/terraform/schemas/location_set.erb new file mode 100644 index 000000000000..71457a41491f --- /dev/null +++ b/templates/azure/terraform/schemas/location_set.erb @@ -0,0 +1,5 @@ +<% if output_var == 'd' -%> +<%= output_var -%>.Set("<%= prop_name -%>", azureRMNormalizeLocation(*<%= input_var -%>)) +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = azureRMNormalizeLocation(*<%= input_var -%>) +<% end -%> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e1fafba5869c..8043af00f324 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -75,7 +75,7 @@ func resource<%= resource_name -%>() *schema.Resource { Schema: map[string]*schema.Schema{ <% order_properties(properties).each do |prop| -%> -<%= lines(build_schema_property(prop, object)) -%> +<%= lines(build_schema_property(prop, object, 12)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> <% if has_project -%> @@ -116,17 +116,19 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in <% else -%> <%= prop.name.camelcase(:lower) -%> := <%= lines(compile_template(prop.custom_schema_get, property: prop, schema: prop.name.underscore)) -%> <% end -%> +<% end -%> + +<% settable_properties.each do |prop| -%> +<%= lines(build_schema_property_get('d', prop.name.camelcase(:lower), prop, object, 4)) -%> <% end -%> parameters := <%= azure_resource_go_package(object.__product) -%>.<%= object.azure_parameters_type -%>{ <% settable_properties.each do |prop| -%> <% unless prop.name == "name" || prop.name == "resourceGroupName" -%> -<% if !prop.custom_expand_func.nil? -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: <%= prop.custom_expand_func -%>(<%= prop.name.camelcase(:lower) -%>), -<% elsif azure_address_of_func(prop).nil? -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: expand<%= resource_name -%><%= titlelize_property(prop) -%>(<%= prop.name.camelcase(:lower) -%>), +<% if expand_funcs.include?(prop.class) -%> + <%= prop.azure_api_path.camelcase(:upper) -%>: <%= expand_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), <% else -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: <%= azure_address_of_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), + <%= prop.azure_api_path.camelcase(:upper) -%>: expand<%= resource_name -%><%= titlelize_property(prop) -%>(<%= prop.name.camelcase(:lower) -%>), <% end -%> <% end -%> <% end -%> @@ -216,6 +218,13 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% else -%> <%= lines(compile_template(prop.custom_schema_set, property: prop, schema: prop.name.underscore, response: 'resp')) -%> <% end -%> +<% end -%> + +<% properties.each do |prop| -%> +<% if will_property_set_dereference?('d', prop) -%> +<% else -%> +<%= lines(build_schema_property_set("resp.#{prop.azure_api_path.camelcase(:upper)}", 'd', prop, object, 4)) -%> +<% end -%> <% end -%> return nil diff --git a/templates/terraform/schema_property.erb b/templates/terraform/schemas/primitive.erb similarity index 87% rename from templates/terraform/schema_property.erb rename to templates/terraform/schemas/primitive.erb index 2c96068e0244..1756ef2748cb 100644 --- a/templates/terraform/schema_property.erb +++ b/templates/terraform/schemas/primitive.erb @@ -1,142 +1,128 @@ -<%# The license inside this block applies to this file. - # Copyright 2017 Google Inc. - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. - # You may obtain a copy of the License at - # - # http://www.apache.org/licenses/LICENSE-2.0 - # - # Unless required by applicable law or agreed to in writing, software - # distributed under the License is distributed on an "AS IS" BASIS, - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - # See the License for the specific language governing permissions and - # limitations under the License. --%> -<% if property.custom_schema -%> -"<%= property.name.underscore -%>": <%= compile_template(property.custom_schema, property: property) -%>, -<% else -%> -<% if tf_types.include?(property.class) -%> -"<%= property.name.underscore -%>": { - <% if property.is_set -%> - Type: schema.TypeSet, - <% else -%> - Type: <%= tf_type(property) %>, - <% end -%> -<% if property.default_from_api -%> - Computed: true, - Optional: true, -<% elsif property.required -%> - Required: true, -<% elsif property.output -%> - Computed: true, -<% else -%> - Optional: true, -<% end -%> -<% if force_new?(property, object) -%> - ForceNew: true, -<% end -%> -<% unless property.validation.nil? || property.output -%> - <% if !property.validation.regex.nil? -%> - ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), - <% elsif !property.validation.function.nil? -%> - ValidateFunc: <%= property.validation.function -%>, - <% end # property.validation.nil? -%> -<% end # property.validation.nil? -%> -<% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> -<% - enum_values = property.values - enum_values.push "" unless property.required --%> - ValidateFunc: validation.StringInSlice([]string{"<%= enum_values.join '","' -%>"}, false), -<% end -%> -<% if !property.diff_suppress_func.nil? -%> - DiffSuppressFunc: <%= property.diff_suppress_func %>, -<% elsif property.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, -<% end -%> -<% unless property.state_func.nil? -%> - StateFunc: <%= property.state_func %>, -<% end -%> -<% if property.is_a?(Api::Type::NestedObject) -%> - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - <% order_properties(property.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> - }, - }, -<% elsif property.is_a?(Api::Type::Array) -%> - <% unless property.min_size.nil? -%> - MinItems: <%= property.min_size %>, - <% end -%> - <% unless property.max_size.nil? -%> - MaxItems: <%= property.max_size %>, - <% end -%> - <% if property.item_type.is_a?(Api::Type::NestedObject) -%> - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - <% order_properties(property.item_type.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> - }, - }, - <% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> - Elem: &schema.Schema{ - Type: <%= tf_types[property.item_type] -%>, - <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, - <% end -%> - }, - <% else # array of basic types -%> - Elem: &schema.Schema{ - Type: <%= tf_types[property.item_type.class] -%>, - <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, - <% end -%> - }, - <% end -%> - <% if property.is_set -%> - <% if !property.set_hash_func.nil? -%> - Set: <%= property.set_hash_func -%>, - <% elsif property.item_type.is_a?(String) -%> - Set: schema.HashString, - <% else -%> - // Default schema.HashSchema is used. - <% end -%> - <% end -%> -<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> - Elem: &schema.Schema{Type: schema.TypeString}, -<% elsif property.is_a?(Api::Type::Map) -%> - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "<%= property.key_name -%>": { - Type: schema.TypeString, - Required: true, - <% if force_new?(property, object) -%> - ForceNew: true, - <% end -%> - }, - <% order_properties(property.value_type.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> - }, - }, - <% if !property.set_hash_func.nil? -%> - Set: <%= property.set_hash_func -%>, - <% end -%> -<% end -%> -<% if property.sensitive -%> - Sensitive: true, -<% end -%> -<% unless property.default_value.nil? -%> - Default: <%= go_literal(property.default_value) -%>, -<% end -%> -<% unless property.conflicts_with.empty? -%> - ConflictsWith: []string{<%= property.conflicts_with.map{ |p| go_literal(p) }.join(', ') -%>}, -<% end -%> -}, -<% else -%> - // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported -<% end # tf_types.include?(property.class) -%> -<% end # property.custom_schema -%> +<% if property.custom_schema -%> +"<%= property.name.underscore -%>": <%= compile_template(property.custom_schema, property: property) -%>, +<% else -%> +<% if tf_types.include?(property.class) -%> +"<%= property.name.underscore -%>": { + <% if property.is_set -%> + Type: schema.TypeSet, + <% else -%> + Type: <%= tf_type(property) %>, + <% end -%> +<% if property.default_from_api -%> + Computed: true, + Optional: true, +<% elsif property.required -%> + Required: true, +<% elsif property.output -%> + Computed: true, +<% else -%> + Optional: true, +<% end -%> +<% if force_new?(property, object) -%> + ForceNew: true, +<% end -%> +<% unless property.validation.nil? || property.output -%> + <% if !property.validation.regex.nil? -%> + ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), + <% elsif !property.validation.function.nil? -%> + ValidateFunc: <%= property.validation.function -%>, + <% end # property.validation.nil? -%> +<% end # property.validation.nil? -%> +<% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> +<% + enum_values = property.values + enum_values.push "" unless property.required +-%> + ValidateFunc: validation.StringInSlice([]string{"<%= enum_values.join '","' -%>"}, false), +<% end -%> +<% if !property.diff_suppress_func.nil? -%> + DiffSuppressFunc: <%= property.diff_suppress_func %>, +<% elsif property.is_a?(Api::Type::ResourceRef) -%> + DiffSuppressFunc: compareSelfLinkOrResourceName, +<% end -%> +<% unless property.state_func.nil? -%> + StateFunc: <%= property.state_func %>, +<% end -%> +<% if property.is_a?(Api::Type::NestedObject) -%> + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + <% order_properties(property.properties).each do |prop| -%> + <%= lines(build_schema_property(prop, object)) -%> + <% end -%> + }, + }, +<% elsif property.is_a?(Api::Type::Array) -%> + <% unless property.min_size.nil? -%> + MinItems: <%= property.min_size %>, + <% end -%> + <% unless property.max_size.nil? -%> + MaxItems: <%= property.max_size %>, + <% end -%> + <% if property.item_type.is_a?(Api::Type::NestedObject) -%> + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + <% order_properties(property.item_type.properties).each do |prop| -%> + <%= lines(build_schema_property(prop, object)) -%> + <% end -%> + }, + }, + <% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> + Elem: &schema.Schema{ + Type: <%= tf_types[property.item_type] -%>, + <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> + DiffSuppressFunc: compareSelfLinkOrResourceName, + <% end -%> + }, + <% else # array of basic types -%> + Elem: &schema.Schema{ + Type: <%= tf_types[property.item_type.class] -%>, + <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> + DiffSuppressFunc: compareSelfLinkOrResourceName, + <% end -%> + }, + <% end -%> + <% if property.is_set -%> + <% if !property.set_hash_func.nil? -%> + Set: <%= property.set_hash_func -%>, + <% elsif property.item_type.is_a?(String) -%> + Set: schema.HashString, + <% else -%> + // Default schema.HashSchema is used. + <% end -%> + <% end -%> +<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> + Elem: &schema.Schema{Type: schema.TypeString}, +<% elsif property.is_a?(Api::Type::Map) -%> + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "<%= property.key_name -%>": { + Type: schema.TypeString, + Required: true, + <% if force_new?(property, object) -%> + ForceNew: true, + <% end -%> + }, + <% order_properties(property.value_type.properties).each do |prop| -%> + <%= lines(build_schema_property(prop, object)) -%> + <% end -%> + }, + }, + <% if !property.set_hash_func.nil? -%> + Set: <%= property.set_hash_func -%>, + <% end -%> +<% end -%> +<% if property.sensitive -%> + Sensitive: true, +<% end -%> +<% unless property.default_value.nil? -%> + Default: <%= go_literal(property.default_value) -%>, +<% end -%> +<% unless property.conflicts_with.empty? -%> + ConflictsWith: []string{<%= property.conflicts_with.map{ |p| go_literal(p) }.join(', ') -%>}, +<% end -%> +}, +<% else -%> + // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported +<% end # tf_types.include?(property.class) -%> +<% end # property.custom_schema -%> diff --git a/templates/terraform/schemas/unsupport.erb b/templates/terraform/schemas/unsupport.erb new file mode 100644 index 000000000000..5259e075da8d --- /dev/null +++ b/templates/terraform/schemas/unsupport.erb @@ -0,0 +1 @@ +// TODO: Property '<%= prop_name -%>' of type <%= property.class -%> is not supported \ No newline at end of file From e39a97c8f14bed1b57b5f895fff653fd80efeb21 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 6 Dec 2018 18:53:22 -0800 Subject: [PATCH 012/175] Refactor: resource group name and tags type --- api/azure/type.rb | 10 ++++++++- .../azurerm/resource_arm_resource_group.go | 10 ++++----- products/azresourcegroup/api.yaml | 6 +++--- products/azresourcegroup/terraform.yaml | 12 ----------- provider/azure/terraform/schema.rb | 21 ++++++++++++------- .../azure/terraform/schemas/location_get.erb | 2 +- .../azure/terraform/schemas/location_set.erb | 6 ++++-- .../terraform/schemas/resource_group_name.erb | 1 + templates/azure/terraform/schemas/tags.erb | 1 + .../azure/terraform/schemas/tags_set.erb | 5 +++++ .../terraform/custom_schema/get_location.erb | 1 - .../terraform/custom_schema/location.erb | 1 - .../custom_schema/resource_group_name.erb | 1 - .../terraform/custom_schema/set_location.erb | 3 --- .../terraform/custom_schema/set_tags.erb | 1 - templates/terraform/custom_schema/tags.erb | 1 - templates/terraform/resource.erb | 21 +------------------ templates/terraform/schemas/basic_get.erb | 5 +++++ templates/terraform/schemas/basic_set.erb | 8 +++++++ 19 files changed, 57 insertions(+), 59 deletions(-) create mode 100644 templates/azure/terraform/schemas/resource_group_name.erb create mode 100644 templates/azure/terraform/schemas/tags.erb create mode 100644 templates/azure/terraform/schemas/tags_set.erb delete mode 100644 templates/terraform/custom_schema/get_location.erb delete mode 100644 templates/terraform/custom_schema/location.erb delete mode 100644 templates/terraform/custom_schema/resource_group_name.erb delete mode 100644 templates/terraform/custom_schema/set_location.erb delete mode 100644 templates/terraform/custom_schema/set_tags.erb delete mode 100644 templates/terraform/custom_schema/tags.erb create mode 100644 templates/terraform/schemas/basic_get.erb create mode 100644 templates/terraform/schemas/basic_set.erb diff --git a/api/azure/type.rb b/api/azure/type.rb index e0dac1c01016..7998ec9a090d 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -3,8 +3,16 @@ module Api module Azure module Type - class Location < Api::Type::Primitive + + class ResourceGroupName < Api::Type::String + end + + class Location < Api::Type::String end + + class Tags < Api::Type::KeyValuePairs + end + end end end diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 3e20f8f2b2e6..294d8546139a 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -30,9 +30,9 @@ func resourceArmResourceGroup() *schema.Resource { Schema: map[string]*schema.Schema{ -"location": locationSchema(), -"name": resourceGroupNameSchema(), -"tags": tagsSchema(), + "location": locationSchema(), + "name": resourceGroupNameSchema(), + "tags": tagsSchema(), }, } } @@ -90,8 +90,8 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro d.Set("name", resp.Name) if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) -} + d.Set("location", azureRMNormalizeLocation(*location)) + } flattenAndSetTags(d, resp.Tags) return nil diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index ff87ce43c016..89f28a09a59c 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -22,19 +22,19 @@ objects: description: | Manages a resource group on Azure. properties: - - !ruby/object:Api::Type::String + - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'name' description: 'The name of the resource group.' required: true input: true azure_api_path: 'name' - - !ruby/object:Api::Type::String + - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'The location where the resource group should be created.' required: true input: true azure_api_path: 'location' - - !ruby/object:Api::Type::KeyValuePairs + - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the resource group.' azure_api_path: 'tags' diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index 73e7af39861a..aea746dc4888 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -3,18 +3,6 @@ name: Arm overrides: !ruby/object:Provider::ResourceOverrides ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride azure_parameters_type: Group - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - custom_schema: 'templates/terraform/custom_schema/resource_group_name.erb' - location: !ruby/object:Provider::Terraform::PropertyOverride - custom_schema: 'templates/terraform/custom_schema/location.erb' - custom_schema_get: 'templates/terraform/custom_schema/get_location.erb' - custom_schema_set: 'templates/terraform/custom_schema/set_location.erb' - tags: !ruby/object:Provider::Terraform::PropertyOverride - default_from_api: true - custom_schema: 'templates/terraform/custom_schema/tags.erb' - custom_expand_func: 'expandTags' - custom_schema_set: 'templates/terraform/custom_schema/set_tags.erb' example: - !ruby/object:Provider::Terraform::Examples name: "resource_group" diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 33b5ff82ca8b..d777b1ab9e83 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -5,8 +5,10 @@ module Schema def go_type(property) case property - when Api::Type::String, Api::Azure::Type::Location + when Api::Type::String 'string' + when Api::Type::KeyValuePairs + 'map[string]interface{}' else 'interface{}' end @@ -21,13 +23,18 @@ def expand_funcs Api::Type::Boolean => 'utils.Bool', Api::Type::String => 'utils.String', Api::Azure::Type::Location => "utils.String", + Api::Azure::Type::Tags => 'expandTags', } end def schema_property_template(property) case property + when Api::Azure::Type::ResourceGroupName + 'templates/azure/terraform/schemas/resource_group_name.erb' when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location.erb' + when Api::Azure::Type::Tags + 'templates/azure/terraform/schemas/tags.erb' else 'templates/terraform/schemas/unsupport.erb' end @@ -37,6 +44,8 @@ def schema_property_get_template(property) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' + when Api::Type::String, Api::Type::KeyValuePairs + 'templates/terraform/schemas/basic_get.erb' else 'templates/terraform/schemas/unsupport.erb' end @@ -46,17 +55,15 @@ def schema_property_set_template(property) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_set.erb' + when Api::Azure::Type::Tags + 'templates/azure/terraform/schemas/tags_set.erb' + when Api::Type::String + 'templates/terraform/schemas/basic_set.erb' else 'templates/terraform/schemas/unsupport.erb' end end - def will_property_set_dereference?(output_var, property) - return true if output_var != 'd' - return true if property.is_a? Api::Azure::Type::Location - false - end - end end end diff --git a/templates/azure/terraform/schemas/location_get.erb b/templates/azure/terraform/schemas/location_get.erb index e3414a0d599d..7e737dc5c8ea 100644 --- a/templates/azure/terraform/schemas/location_get.erb +++ b/templates/azure/terraform/schemas/location_get.erb @@ -1,5 +1,5 @@ <% if input_var == 'd' -%> -<%= output_var -%> := azureRMNormalizeLocation(<%= input_var -%>.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) +<%= output_var -%> := azureRMNormalizeLocation(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) <% else -%> <%= output_var -%> := azureRMNormalizeLocation(<%= input_var -%>["<%= prop_name -%>"].(<%= go_type(property) -%>)) <% end -%> diff --git a/templates/azure/terraform/schemas/location_set.erb b/templates/azure/terraform/schemas/location_set.erb index 71457a41491f..e0028e26f5fc 100644 --- a/templates/azure/terraform/schemas/location_set.erb +++ b/templates/azure/terraform/schemas/location_set.erb @@ -1,5 +1,7 @@ +if location := <%= input_var -%>; location != nil { <% if output_var == 'd' -%> -<%= output_var -%>.Set("<%= prop_name -%>", azureRMNormalizeLocation(*<%= input_var -%>)) + d.Set("<%= prop_name -%>", azureRMNormalizeLocation(*location)) <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = azureRMNormalizeLocation(*<%= input_var -%>) + <%= output_var -%>["<%= prop_name -%>"] = azureRMNormalizeLocation(*location) <% end -%> +} \ No newline at end of file diff --git a/templates/azure/terraform/schemas/resource_group_name.erb b/templates/azure/terraform/schemas/resource_group_name.erb new file mode 100644 index 000000000000..5dfd1ace2f71 --- /dev/null +++ b/templates/azure/terraform/schemas/resource_group_name.erb @@ -0,0 +1 @@ +"<%= prop_name -%>": resourceGroupNameSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/tags.erb b/templates/azure/terraform/schemas/tags.erb new file mode 100644 index 000000000000..4345628cb937 --- /dev/null +++ b/templates/azure/terraform/schemas/tags.erb @@ -0,0 +1 @@ +"<%= prop_name -%>": tagsSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/tags_set.erb b/templates/azure/terraform/schemas/tags_set.erb new file mode 100644 index 000000000000..deb6184eb2bf --- /dev/null +++ b/templates/azure/terraform/schemas/tags_set.erb @@ -0,0 +1,5 @@ +<% if output_var == 'd' -%> +flattenAndSetTags(d, <%= input_var -%>) +<% else -%> +// TODO: setting tags to <%= output_var -%> is not supported +<% end -%> \ No newline at end of file diff --git a/templates/terraform/custom_schema/get_location.erb b/templates/terraform/custom_schema/get_location.erb deleted file mode 100644 index 94097e633fa0..000000000000 --- a/templates/terraform/custom_schema/get_location.erb +++ /dev/null @@ -1 +0,0 @@ -azureRMNormalizeLocation(d.Get("<%= schema -%>").(string)) \ No newline at end of file diff --git a/templates/terraform/custom_schema/location.erb b/templates/terraform/custom_schema/location.erb deleted file mode 100644 index 1ac55d92b40e..000000000000 --- a/templates/terraform/custom_schema/location.erb +++ /dev/null @@ -1 +0,0 @@ -locationSchema() \ No newline at end of file diff --git a/templates/terraform/custom_schema/resource_group_name.erb b/templates/terraform/custom_schema/resource_group_name.erb deleted file mode 100644 index db0ac867580d..000000000000 --- a/templates/terraform/custom_schema/resource_group_name.erb +++ /dev/null @@ -1 +0,0 @@ -resourceGroupNameSchema() \ No newline at end of file diff --git a/templates/terraform/custom_schema/set_location.erb b/templates/terraform/custom_schema/set_location.erb deleted file mode 100644 index e73388ed062f..000000000000 --- a/templates/terraform/custom_schema/set_location.erb +++ /dev/null @@ -1,3 +0,0 @@ -if location := <%= response -%>.Location; location != nil { - d.Set("<%= schema -%>", azureRMNormalizeLocation(*location)) -} \ No newline at end of file diff --git a/templates/terraform/custom_schema/set_tags.erb b/templates/terraform/custom_schema/set_tags.erb deleted file mode 100644 index 5d2e085201c8..000000000000 --- a/templates/terraform/custom_schema/set_tags.erb +++ /dev/null @@ -1 +0,0 @@ -flattenAndSetTags(d, <%= response -%>.Tags) \ No newline at end of file diff --git a/templates/terraform/custom_schema/tags.erb b/templates/terraform/custom_schema/tags.erb deleted file mode 100644 index a06d8e3ceecd..000000000000 --- a/templates/terraform/custom_schema/tags.erb +++ /dev/null @@ -1 +0,0 @@ -tagsSchema() \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 8043af00f324..e29a12dee2f0 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -110,14 +110,6 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in ctx := meta.(*ArmClient).StopContext -<% settable_properties.each do |prop| -%> -<% unless prop.custom_schema_get -%> - <%= prop.name.camelcase(:lower) -%> := d.Get("<%= prop.name.underscore -%>").(<%= go_type(prop) -%>) -<% else -%> - <%= prop.name.camelcase(:lower) -%> := <%= lines(compile_template(prop.custom_schema_get, property: prop, schema: prop.name.underscore)) -%> -<% end -%> -<% end -%> - <% settable_properties.each do |prop| -%> <%= lines(build_schema_property_get('d', prop.name.camelcase(:lower), prop, object, 4)) -%> <% end -%> @@ -213,18 +205,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% end -%> <% properties.each do |prop| -%> -<% unless prop.custom_schema_set -%> - d.Set("<%= prop.name.underscore -%>", resp.<%= prop.azure_api_path.camelcase(:upper) -%>) -<% else -%> - <%= lines(compile_template(prop.custom_schema_set, property: prop, schema: prop.name.underscore, response: 'resp')) -%> -<% end -%> -<% end -%> - -<% properties.each do |prop| -%> -<% if will_property_set_dereference?('d', prop) -%> -<% else -%> -<%= lines(build_schema_property_set("resp.#{prop.azure_api_path.camelcase(:upper)}", 'd', prop, object, 4)) -%> -<% end -%> +<%= lines(build_schema_property_set("resp.#{prop.azure_api_path.camelcase(:upper)}", 'd', prop, object, 4)) -%> <% end -%> return nil diff --git a/templates/terraform/schemas/basic_get.erb b/templates/terraform/schemas/basic_get.erb new file mode 100644 index 000000000000..0b35802e28ed --- /dev/null +++ b/templates/terraform/schemas/basic_get.erb @@ -0,0 +1,5 @@ +<% if input_var == 'd' -%> +<%= output_var -%> := d.Get("<%= prop_name -%>").(<%= go_type(property) -%>) +<% else -%> +<%= output_var -%> := <%= input_var -%>["<%= prop_name -%>"].(<%= go_type(property) -%>) +<% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/basic_set.erb b/templates/terraform/schemas/basic_set.erb new file mode 100644 index 000000000000..a00950e2a92c --- /dev/null +++ b/templates/terraform/schemas/basic_set.erb @@ -0,0 +1,8 @@ +<% if output_var == 'd' -%> +d.Set("<%= prop_name -%>", <%= input_var -%>) +<% else -%> +<% temp_var = prop_name.camelize(:lower) -%> +if <%= temp_var -%> := <%= input_var -%>; <%= temp_var -%> != nil { + <%= output_var -%>["<%= prop_name -%>"] = *<%= temp_var -%> +} +<% end -%> \ No newline at end of file From 7fa7e3564fee2354301331e8d37cf1f7e474d256 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 23 Jan 2019 14:16:56 -0800 Subject: [PATCH 013/175] Introduce azure_update_verb. --- Gemfile.lock | 3 +- api/resource.rb | 10 ++++--- .../azurerm/resource_arm_resource_group.go | 8 +++-- ...ource_arm_resource_group_generated_test.go | 30 +++++++++---------- products/azresourcegroup/api.yaml | 5 ++-- templates/terraform/resource.erb | 24 +++++++++++---- 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bd0b1efcdf7b..b5b92ebc187c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -61,6 +61,7 @@ GEM PLATFORMS ruby + x64-mingw32 DEPENDENCIES activesupport @@ -73,4 +74,4 @@ DEPENDENCIES simplecov BUNDLED WITH - 1.16.5 + 1.17.1 diff --git a/api/resource.rb b/api/resource.rb index 392f8cc9baa4..0c65f28a1ac4 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -66,8 +66,9 @@ module Properties # Azure Specific Attributes attr_reader :azure_create_async attr_reader :azure_delete_async - attr_reader :azure_create_or_update_verb - attr_reader :azure_get_verb + attr_reader :azure_create_verb + attr_reader :azure_read_verb + attr_reader :azure_update_verb attr_reader :azure_delete_verb attr_reader :azure_parameters_type end @@ -264,8 +265,9 @@ def validate check_optional_property :azure_create_async, :boolean check_optional_property :azure_delete_async, :boolean - check_optional_property :azure_create_or_update_verb, String - check_optional_property :azure_get_verb, String + check_optional_property :azure_create_verb, String + check_optional_property :azure_read_verb, String + check_optional_property :azure_update_verb, String check_optional_property :azure_delete_verb, String check_optional_property :azure_parameters_type, String diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 294d8546139a..3074ef5e8164 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -17,11 +17,12 @@ package azurerm + func resourceArmResourceGroup() *schema.Resource { return &schema.Resource{ - Create: resourceArmResourceGroupCreateOrUpdate, + Create: resourceArmResourceGroupCreateUpdate, Read: resourceArmResourceGroupRead, - Update: resourceArmResourceGroupCreateOrUpdate, + Update: resourceArmResourceGroupCreateUpdate, Delete: resourceArmResourceGroupDelete, Importer: &schema.ResourceImporter{ @@ -37,7 +38,7 @@ func resourceArmResourceGroup() *schema.Resource { } } -func resourceArmResourceGroupCreateOrUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext @@ -97,6 +98,7 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro return nil } + func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).resourceGroupsClient ctx := meta.(*ArmClient).StopContext diff --git a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go index 937a6ec6475f..30366de4ec58 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go +++ b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go @@ -15,16 +15,15 @@ package azurerm import ( - "fmt" - "testing" + "fmt" + "testing" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" ) - func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { - t.Parallel() + t.Parallel() resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -44,7 +43,7 @@ func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { } func testAccArmResourceGroup_resourceGroupExample(val string) string { - return fmt.Sprintf(` + return fmt.Sprintf(` resource "azurerm_resource_group" "example" { name = "ExampleRG-%s" location = "West US" @@ -54,25 +53,24 @@ resource "azurerm_resource_group" "example" { } } `, val, - ) + ) } - func testAccCheckArmResourceGroupDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { if rs.Type != "google_arm_resource_group" { continue } - config := testAccProvider.Meta().(*Config) + config := testAccProvider.Meta().(*Config) - url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") - if err != nil { - return err - } + url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") + if err != nil { + return err + } - _, err = sendRequest(config, "GET", url, nil) - if err == nil { + _, err = sendRequest(config, "GET", url, nil) + if err == nil { return fmt.Errorf("ArmResourceGroup still exists at %s", url) } } diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 89f28a09a59c..7a18df008a6a 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -14,8 +14,9 @@ objects: name: 'ResourceGroup' api_name: ResourceGroups base_url: NotUsedInAzure - azure_create_or_update_verb: CreateOrUpdate - azure_get_verb: Get + azure_create_verb: CreateOrUpdate + azure_update_verb: CreateOrUpdate + azure_read_verb: Get azure_delete_verb: Delete azure_delete_async: true azure_parameters_type: ResourceGroup diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e29a12dee2f0..ac2f925cb8e8 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -40,12 +40,18 @@ package azurerm azure_client_name = "#{object.api_name}Client".camelcase(:lower) -%> +<% + combine_create_update = (object.azure_create_verb == object.azure_update_verb) + create_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Create") + update_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Update") +-%> + func resource<%= resource_name -%>() *schema.Resource { return &schema.Resource{ - Create: resource<%= resource_name -%>CreateOrUpdate, + Create: resource<%= resource_name -%><%= create_func_name_postfix -%>, Read: resource<%= resource_name -%>Read, <% if updatable?(object, properties) -%> - Update: resource<%= resource_name -%>CreateOrUpdate, + Update: resource<%= resource_name -%><%= update_func_name_postfix -%>, <% end -%> Delete: resource<%= resource_name -%>Delete, <% if settable_properties.any? {|p| p.unordered_list} && !object.custom_code.resource_definition -%> @@ -105,7 +111,7 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff } <% end -%> -func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta interface{}) error { +func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= azure_client_name -%> ctx := meta.(*ArmClient).StopContext @@ -143,7 +149,7 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in <% end -%> <% unless object.azure_create_async -%> - if _, err := client.<%= object.azure_create_or_update_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { + if _, err := client.<%= object.azure_create_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } <% else -%> @@ -152,7 +158,7 @@ func resource<%= resource_name -%>CreateOrUpdate(d *schema.ResourceData, meta in <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := client.<%= object.azure_get_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_read_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { return err } @@ -177,7 +183,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) // TODO: Get name out <% end -%> - resp, err := client.<%= object.azure_get_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_read_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) @@ -211,6 +217,12 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) return nil } +<% if !combine_create_update -%> +func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { + // TODO: Complete Update Function +} +<% end -%> + func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= azure_client_name -%> From 0f471621f3cae476f09c36eb7c10d7726bcc8cdd Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 23 Jan 2019 14:37:37 -0800 Subject: [PATCH 014/175] Add line back to rg_test.go. --- ...ource_arm_resource_group_generated_test.go | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go index 30366de4ec58..937a6ec6475f 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go +++ b/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go @@ -15,15 +15,16 @@ package azurerm import ( - "fmt" - "testing" + "fmt" + "testing" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" ) + func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { - t.Parallel() + t.Parallel() resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -43,7 +44,7 @@ func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { } func testAccArmResourceGroup_resourceGroupExample(val string) string { - return fmt.Sprintf(` + return fmt.Sprintf(` resource "azurerm_resource_group" "example" { name = "ExampleRG-%s" location = "West US" @@ -53,24 +54,25 @@ resource "azurerm_resource_group" "example" { } } `, val, - ) + ) } + func testAccCheckArmResourceGroupDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { if rs.Type != "google_arm_resource_group" { continue } - config := testAccProvider.Meta().(*Config) + config := testAccProvider.Meta().(*Config) - url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") - if err != nil { - return err - } + url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") + if err != nil { + return err + } - _, err = sendRequest(config, "GET", url, nil) - if err == nil { + _, err = sendRequest(config, "GET", url, nil) + if err == nil { return fmt.Errorf("ArmResourceGroup still exists at %s", url) } } From e1726e95a764fca15bbbdc5cf4c015dc222039c7 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 23 Jan 2019 16:09:10 -0800 Subject: [PATCH 015/175] Add ContainerRegistry API definition. --- products/azcontainerregistry/api.yaml | 70 +++++++++++++++++++++ products/azcontainerregistry/terraform.yaml | 5 ++ 2 files changed, 75 insertions(+) create mode 100644 products/azcontainerregistry/api.yaml create mode 100644 products/azcontainerregistry/terraform.yaml diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml new file mode 100644 index 000000000000..2846f780d74e --- /dev/null +++ b/products/azcontainerregistry/api.yaml @@ -0,0 +1,70 @@ +--- !ruby/object:Api::Product +name: Azure Container Registry +prefix: arm +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.ContainerRegistry' +azure_version: 'stable/2018-09-01' +objects: + - !ruby/object:Api::Resource + name: ContainerRegistry + api_name: ContainerRegistry + base_url: NotUsedInAzure + azure_create_verb: Create + azure_update_verb: Update + azure_read_verb: Get + azure_delete_verb: Delete + azure_delete_async: true + azure_parameters_type: Registry + description: | + Manages a container registry on Azure. + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the container registry.' + required: true + azure_api_path: 'name' + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resource_group_name' + description: 'The resource group name of the container registry.' + required: true + input: true + azure_api_path: 'rgname' + - !ruby/object:Api::Azure::Type::Location + name: 'location' + description: 'The location where the container registry should be created.' + required: true + input: true + azure_api_path: 'location' + - !ruby/object:Api::Type::Enum + name: 'sku' + values: + - :Classic + - :Basic + - :Standard + - :Premium + description: 'The sku of the container registry.' + default_value: :Classic + azure_api_path: 'sku' + - !ruby/object:Api::Type::Boolean + name: 'admin_enabled' + description: 'Specifies whether admin is enabled of this container registry.' + default_value: false + azure_api_path: 'registryProperties' + - !ruby/object:Api::Type::String + name: 'storage_account_id' + description: 'The storage account ID of the container registry.' + azure_api_path: 'storageAccount.id' + - !ruby/object:Api::Type::String + name: 'login_server' + description: 'The login server of the container registry.' + output: true + azure_api_path: 'loginServer' + - !ruby/object:Api::Azure::Type::Tags + name: 'tags' + description: 'A mapping of tags to assign to the container registry.' + azure_api_path: 'tags' diff --git a/products/azcontainerregistry/terraform.yaml b/products/azcontainerregistry/terraform.yaml new file mode 100644 index 000000000000..b02dfbf3367e --- /dev/null +++ b/products/azcontainerregistry/terraform.yaml @@ -0,0 +1,5 @@ +--- !ruby/object:Provider::Terraform::Config +name: Arm +overrides: !ruby/object:Provider::ResourceOverrides + ContainerRegistry: !ruby/object:Provider::Terraform::ResourceOverride + example: From 1925902c05b16ea387c31ca31a002ad56422adc8 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 23 Jan 2019 16:22:22 -0800 Subject: [PATCH 016/175] Handle more primitive schema definitions. --- .../resource_arm_container_registry.go | 169 ++++++++++++++++++ .../docs/r/container_registry.html.markdown | 62 +++++++ provider/azure/terraform/schema.rb | 2 + 3 files changed, 233 insertions(+) create mode 100644 build/azterraform/azurerm/resource_arm_container_registry.go create mode 100644 build/azterraform/website/docs/r/container_registry.html.markdown diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go new file mode 100644 index 000000000000..f552621593fd --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -0,0 +1,169 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + + + +func resourceArmContainerRegistry() *schema.Resource { + return &schema.Resource{ + Create: resourceArmContainerRegistryCreate, + Read: resourceArmContainerRegistryRead, + Update: resourceArmContainerRegistryUpdate, + Delete: resourceArmContainerRegistryDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "location": locationSchema(), + "name": { + Type: schema.TypeString, + Required: true, + }, + "resource_group_name": resourceGroupNameSchema(), + "admin_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "sku": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{"Classic","Basic","Standard","Premium",""}, false), + Default: "Classic", + }, + "storage_account_id": { + Type: schema.TypeString, + Optional: true, + }, + "tags": tagsSchema(), + "login_server": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).containerRegistryClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroupName := d.Get("resource_group_name").(string) + location := azureRMNormalizeLocation(d.Get("location").(string)) + // TODO: Property 'sku' of type Api::Type::Enum is not supported + // TODO: Property 'admin_enabled' of type Api::Type::Boolean is not supported + storageAccountId := d.Get("storage_account_id").(string) + tags := d.Get("tags").(map[string]interface{}) + + parameters := containerRegistry.Registry{ + Rgname: expandArmContainerRegistryResource_group_name(resourceGroupName), + Location: utils.String(location), + Sku: expandArmContainerRegistrySku(sku), + RegistryProperties: utils.Bool(adminEnabled), + StorageAccount.id: utils.String(storageAccountId), + Tags: expandTags(tags), + } + + + + if _, err := client.Create(ctx, resourceGroup, name, parameters); err != nil { + return fmt.Errorf("Error creating ContainerRegistry: %+v", err) + } + + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + return err + } + d.SetId(*resp.ID) + + return resourceArmContainerRegistryRead(d, meta) +} + +func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).containerRegistryClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + // TODO: Get name out + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] ContainerRegistry %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading ContainerRegistry: %+v", err) + } + + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resp.Rgname) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) + } + // TODO: Property 'sku' of type Api::Type::Enum is not supported + // TODO: Property 'admin_enabled' of type Api::Type::Boolean is not supported + d.Set("storage_account_id", resp.StorageAccount.id) + d.Set("login_server", resp.LoginServer) + flattenAndSetTags(d, resp.Tags) + + return nil +} + +func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{}) error { + // TODO: Complete Update Function +} + +func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).containerRegistryClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + // TODO: Get name out + + future, err := client.Delete(ctx, resourceGroup, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting ContainerRegistry %q: %+v", name, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting ContainerRegistry %q: %+v", name, err) + } + } + + return nil +} diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown new file mode 100644 index 000000000000..8c59a654c5c2 --- /dev/null +++ b/build/azterraform/website/docs/r/container_registry.html.markdown @@ -0,0 +1,62 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_container_registry" +sidebar_current: "docs-azurerm-resource-container-registry" +description: |- + Manages a container registry on Azure. +--- + +# azurerm_container_registry +Manages a container registry on Azure. + + + +## Argument Reference + +The following arguments are supported: + + +* `name` - (Required) The name of the container registry. + +* `resource_group_name` - (Required) The resource group name of the container registry. + +* `location` - (Required) The location where the container registry should be created. + +* `sku` - (Optional) The sku of the container registry. + +* `admin_enabled` - (Optional) Specifies whether admin is enabled of this container registry. + +* `storage_account_id` - (Optional) The storage account ID of the container registry. + +* `tags` - (Optional) A mapping of tags to assign to the container registry. +## Attributes Reference + +The following attributes are exported: + +* `id` - The container registry ID. + + +* `login_server` - (Optional) The login server of the container registry. + + + +## Import + +ContainerRegistry can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/containerRegistrys/example +``` diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index d777b1ab9e83..0daa9d291f83 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -35,6 +35,8 @@ def schema_property_template(property) 'templates/azure/terraform/schemas/location.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags.erb' + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String + 'templates/terraform/schemas/primitive.erb' else 'templates/terraform/schemas/unsupport.erb' end From a1744c84d422984d97cc17dc2aee3adc024fe7e0 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 23 Jan 2019 17:53:50 -0800 Subject: [PATCH 017/175] Get name from Azure ID portion. --- api/resource.rb | 2 ++ .../resource_arm_container_registry.go | 21 ++++++++++++------- products/azcontainerregistry/api.yaml | 11 ++++++---- templates/terraform/resource.erb | 21 ++++++++++++++----- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/api/resource.rb b/api/resource.rb index 0c65f28a1ac4..77afbbab4801 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -64,6 +64,7 @@ module Properties attr_reader :min_version # Minimum API version this resource is in # Azure Specific Attributes + attr_reader :azure_id_portion attr_reader :azure_create_async attr_reader :azure_delete_async attr_reader :azure_create_verb @@ -263,6 +264,7 @@ def validate check_optional_property :input, :boolean check_optional_property :min_version, String + check_optional_property :azure_id_portion, String check_optional_property :azure_create_async, :boolean check_optional_property :azure_delete_async, :boolean check_optional_property :azure_create_verb, String diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index f552621593fd..7773cffd347c 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -35,6 +35,7 @@ func resourceArmContainerRegistry() *schema.Resource { "name": { Type: schema.TypeString, Required: true, + ForceNew: true, }, "resource_group_name": resourceGroupNameSchema(), "admin_enabled": { @@ -66,7 +67,7 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} ctx := meta.(*ArmClient).StopContext name := d.Get("name").(string) - resourceGroupName := d.Get("resource_group_name").(string) + resourceGroup := d.Get("resource_group_name").(string) location := azureRMNormalizeLocation(d.Get("location").(string)) // TODO: Property 'sku' of type Api::Type::Enum is not supported // TODO: Property 'admin_enabled' of type Api::Type::Boolean is not supported @@ -74,7 +75,6 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} tags := d.Get("tags").(map[string]interface{}) parameters := containerRegistry.Registry{ - Rgname: expandArmContainerRegistryResource_group_name(resourceGroupName), Location: utils.String(location), Sku: expandArmContainerRegistrySku(sku), RegistryProperties: utils.Bool(adminEnabled), @@ -84,8 +84,12 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} - if _, err := client.Create(ctx, resourceGroup, name, parameters); err != nil { - return fmt.Errorf("Error creating ContainerRegistry: %+v", err) + future, err := client.Create(ctx, resourceGroup, name, parameters) + if err != nil { + return fmt.Errorf("Error creating ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -93,6 +97,9 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} if err != nil { return err } + if read.ID == nil { + return fmt.Errorf("Cannot read ContainerRegistry %q", name) + } d.SetId(*resp.ID) return resourceArmContainerRegistryRead(d, meta) @@ -107,7 +114,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup - // TODO: Get name out + name := id.Path["registries"] resp, err := client.Get(ctx, resourceGroup, name) if err != nil { @@ -122,7 +129,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.Set("name", resp.Name) - d.Set("resource_group_name", resp.Rgname) + d.Set("resource_group_name", resourceGroup) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } @@ -149,7 +156,7 @@ func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{} return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup - // TODO: Get name out + name := id.Path["registries"] future, err := client.Delete(ctx, resourceGroup, name) if err != nil { diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 2846f780d74e..6349a311d44b 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -14,7 +14,9 @@ objects: name: ContainerRegistry api_name: ContainerRegistry base_url: NotUsedInAzure + azure_id_portion: registries azure_create_verb: Create + azure_create_async: true azure_update_verb: Update azure_read_verb: Get azure_delete_verb: Delete @@ -27,9 +29,10 @@ objects: name: 'name' description: 'The name of the container registry.' required: true + input: true azure_api_path: 'name' - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resource_group_name' + name: 'resourceGroupName' description: 'The resource group name of the container registry.' required: true input: true @@ -51,16 +54,16 @@ objects: default_value: :Classic azure_api_path: 'sku' - !ruby/object:Api::Type::Boolean - name: 'admin_enabled' + name: 'adminEnabled' description: 'Specifies whether admin is enabled of this container registry.' default_value: false azure_api_path: 'registryProperties' - !ruby/object:Api::Type::String - name: 'storage_account_id' + name: 'storageAccountId' description: 'The storage account ID of the container registry.' azure_api_path: 'storageAccount.id' - !ruby/object:Api::Type::String - name: 'login_server' + name: 'loginServer' description: 'The login server of the container registry.' output: true azure_api_path: 'loginServer' diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index ac2f925cb8e8..336e7a8a6050 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -117,7 +117,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext <% settable_properties.each do |prop| -%> -<%= lines(build_schema_property_get('d', prop.name.camelcase(:lower), prop, object, 4)) -%> +<% output_var = (prop.name == "resourceGroupName" ? "resourceGroup" : prop.name.camelcase(:lower)) -%> +<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> parameters := <%= azure_resource_go_package(object.__product) -%>.<%= object.azure_parameters_type -%>{ @@ -153,7 +154,13 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } <% else -%> - // TODO: Async CreateOrUpdate Operation + future, err := client.<%= object.azure_create_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + if err != nil { + return fmt.Errorf("Error creating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + } <% end -%> <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> @@ -162,6 +169,9 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res if err != nil { return err } + if read.ID == nil { + return fmt.Errorf("Cannot read <%= object.name -%> %q", name) + } d.SetId(*resp.ID) return resource<%= resource_name -%>Read(d, meta) @@ -180,7 +190,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) name := id.ResourceGroup <% else -%> resourceGroup := id.ResourceGroup - // TODO: Get name out + name := id.Path["<%= object.azure_id_portion -%>"] <% end -%> resp, err := client.<%= object.azure_read_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) @@ -211,7 +221,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% end -%> <% properties.each do |prop| -%> -<%= lines(build_schema_property_set("resp.#{prop.azure_api_path.camelcase(:upper)}", 'd', prop, object, 4)) -%> +<% input_var = (prop.name == "resourceGroupName" ? "resourceGroup" : "resp.#{prop.azure_api_path.camelcase(:upper)}") -%> +<%= lines(build_schema_property_set(input_var, 'd', prop, object, 4)) -%> <% end -%> return nil @@ -245,7 +256,7 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ name := id.ResourceGroup <% else -%> resourceGroup := id.ResourceGroup - // TODO: Get name out + name := id.Path["<%= object.azure_id_portion -%>"] <% end -%> <% unless object.azure_delete_async -%> From ace000bcdae5aafde066ae7eb299bcf7659fec3f Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 24 Jan 2019 19:18:03 -0800 Subject: [PATCH 018/175] Introduce Go & Python SDK type definitions. --- api/azure/sdk_typedef.rb | 30 ++++++++++++++++++ api/compiler.rb | 1 + api/resource.rb | 3 ++ .../resource_arm_container_registry.go | 20 +++++++++--- .../azurerm/resource_arm_resource_group.go | 3 ++ google/yaml_validator.rb | 14 +++++++++ products/azcontainerregistry/api.yaml | 31 ++++++++++++++++--- products/azresourcegroup/api.yaml | 7 +++++ provider/azure/terraform/schema.rb | 8 +++-- templates/terraform/resource.erb | 15 +++++++++ 10 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 api/azure/sdk_typedef.rb diff --git a/api/azure/sdk_typedef.rb b/api/azure/sdk_typedef.rb new file mode 100644 index 000000000000..c1f6293a9a5a --- /dev/null +++ b/api/azure/sdk_typedef.rb @@ -0,0 +1,30 @@ +require 'api/object' + +module Api + module Azure + class SDKTypeDefinition < Api::Object + attr_reader :go_field_name + + def validate + super + check_property :go_field_name + end + + class BooleanObject < SDKTypeDefinition + end + + class StringObject < SDKTypeDefinition + end + + class ComplexObject < SDKTypeDefinition + attr_reader :go_type_name + + def validate + super + check_property :go_type_name, String + end + end + + end + end +end \ No newline at end of file diff --git a/api/compiler.rb b/api/compiler.rb index 57599c752ec3..ec542ecda0a3 100644 --- a/api/compiler.rb +++ b/api/compiler.rb @@ -20,6 +20,7 @@ require 'google/yaml_validator' require 'api/azure/type' +require 'api/azure/sdk_typedef' module Api # Process .yaml and produces output module diff --git a/api/resource.rb b/api/resource.rb index 77afbbab4801..f3c299e54e13 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -64,6 +64,7 @@ module Properties attr_reader :min_version # Minimum API version this resource is in # Azure Specific Attributes + attr_reader :azure_sdk_type_defs attr_reader :azure_id_portion attr_reader :azure_create_async attr_reader :azure_delete_async @@ -264,6 +265,8 @@ def validate check_optional_property :input, :boolean check_optional_property :min_version, String + check_property :azure_sdk_type_defs, Hash + check_property_hash :azure_sdk_type_defs, String, Api::Azure::SDKTypeDefinition check_optional_property :azure_id_portion, String check_optional_property :azure_create_async, :boolean check_optional_property :azure_delete_async, :boolean diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 7773cffd347c..65f4a1b04138 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -69,15 +69,15 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) location := azureRMNormalizeLocation(d.Get("location").(string)) - // TODO: Property 'sku' of type Api::Type::Enum is not supported - // TODO: Property 'admin_enabled' of type Api::Type::Boolean is not supported + sku := d.Get("sku").(string) + adminEnabled := d.Get("admin_enabled").(bool) storageAccountId := d.Get("storage_account_id").(string) tags := d.Get("tags").(map[string]interface{}) parameters := containerRegistry.Registry{ Location: utils.String(location), Sku: expandArmContainerRegistrySku(sku), - RegistryProperties: utils.Bool(adminEnabled), + Properties::Adminuserenabled: utils.Bool(adminEnabled), StorageAccount.id: utils.String(storageAccountId), Tags: expandTags(tags), } @@ -133,8 +133,8 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - // TODO: Property 'sku' of type Api::Type::Enum is not supported - // TODO: Property 'admin_enabled' of type Api::Type::Boolean is not supported + d.Set("sku", resp.Sku) + d.Set("admin_enabled", resp.Properties::Adminuserenabled) d.Set("storage_account_id", resp.StorageAccount.id) d.Set("login_server", resp.LoginServer) flattenAndSetTags(d, resp.Tags) @@ -143,6 +143,16 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) } func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).containerRegistryClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + name := id.Path["registries"] + // TODO: Complete Update Function } diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 3074ef5e8164..6d2571376ce8 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -62,6 +62,9 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface if err != nil { return err } + if read.ID == nil { + return fmt.Errorf("Cannot read ResourceGroup %q", name) + } d.SetId(*resp.ID) return resourceArmResourceGroupRead(d, meta) diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 5a6c8b16a4fb..21354b355d6a 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -121,6 +121,20 @@ def check_optional_property_list(name, type = nil) check_property_list(name, type) end + def check_property_hash(name, keyType = nil, valType = nil) + obj_hash = instance_variable_get("@#{name}") + if obj_hash.nil? + Google::LOGGER.debug "No next level @ #{object_display_name}: #{name}" + else + Google::LOGGER.debug \ + "Checking next level for #{object_display_name}: #{name}" + obj_hash.each do |k, v| + check_property_value "#{name}:key", k, keyType + check_property_value "#{name}:value", v, valType + end + end + end + # Verifies if a property is of a given type and its value are one of the # valid possibilities. def check_property_oneof(property, valid_values, type = nil) diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 6349a311d44b..06ed267ff5e2 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -8,12 +8,34 @@ versions: scopes: - NotUsedInAzure azure_namespace: 'Microsoft.ContainerRegistry' -azure_version: 'stable/2018-09-01' +azure_version: 'stable/2017-10-01' objects: - !ruby/object:Api::Resource name: ContainerRegistry api_name: ContainerRegistry base_url: NotUsedInAzure + + azure_sdk_type_defs: + 'location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + 'properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryProperties + go_type_name: RegistryProperties + 'properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + 'sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + 'sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + 'sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + 'storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + 'storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + azure_id_portion: registries azure_create_verb: Create azure_create_async: true @@ -22,6 +44,7 @@ objects: azure_delete_verb: Delete azure_delete_async: true azure_parameters_type: Registry + description: | Manages a container registry on Azure. properties: @@ -52,16 +75,16 @@ objects: - :Premium description: 'The sku of the container registry.' default_value: :Classic - azure_api_path: 'sku' + azure_api_path: 'sku/name' - !ruby/object:Api::Type::Boolean name: 'adminEnabled' description: 'Specifies whether admin is enabled of this container registry.' default_value: false - azure_api_path: 'registryProperties' + azure_api_path: 'properties/adminUserEnabled' - !ruby/object:Api::Type::String name: 'storageAccountId' description: 'The storage account ID of the container registry.' - azure_api_path: 'storageAccount.id' + azure_api_path: 'storageAccount/id' - !ruby/object:Api::Type::String name: 'loginServer' description: 'The login server of the container registry.' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 7a18df008a6a..a34ca5c60205 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -14,12 +14,19 @@ objects: name: 'ResourceGroup' api_name: ResourceGroups base_url: NotUsedInAzure + + azure_sdk_type_defs: + 'properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: 'TBD' + go_type_name: 'TBD' + azure_create_verb: CreateOrUpdate azure_update_verb: CreateOrUpdate azure_read_verb: Get azure_delete_verb: Delete azure_delete_async: true azure_parameters_type: ResourceGroup + description: | Manages a resource group on Azure. properties: diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 0daa9d291f83..9aba5177ee88 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -5,7 +5,9 @@ module Schema def go_type(property) case property - when Api::Type::String + when Api::Type::Boolean + 'bool' + when Api::Type::Enum, Api::Type::String 'string' when Api::Type::KeyValuePairs 'map[string]interface{}' @@ -46,7 +48,7 @@ def schema_property_get_template(property) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' - when Api::Type::String, Api::Type::KeyValuePairs + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs 'templates/terraform/schemas/basic_get.erb' else 'templates/terraform/schemas/unsupport.erb' @@ -59,7 +61,7 @@ def schema_property_set_template(property) 'templates/azure/terraform/schemas/location_set.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags_set.erb' - when Api::Type::String + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String 'templates/terraform/schemas/basic_set.erb' else 'templates/terraform/schemas/unsupport.erb' diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 336e7a8a6050..28fdf72ad01c 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -230,6 +230,21 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% if !combine_create_update -%> func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).<%= azure_client_name -%> + + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) + } +<% if azure_is_resource_group -%> + name := id.ResourceGroup +<% else -%> + resourceGroup := id.ResourceGroup + name := id.Path["<%= object.azure_id_portion -%>"] +<% end -%> + // TODO: Complete Update Function } <% end -%> From c851a8ecaa6ddf8fd0855d7724072dfbad2ed6a2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 25 Jan 2019 19:39:00 -0800 Subject: [PATCH 019/175] Implement request hierarchical object copy. --- api/azure/sdk_typedef.rb | 2 +- .../resource_arm_container_registry.go | 26 ++++++++------- .../azurerm/resource_arm_resource_group.go | 6 ++-- products/azcontainerregistry/api.yaml | 32 +++++++++++-------- products/azresourcegroup/api.yaml | 13 +++++--- provider/azure/terraform/schema.rb | 11 +++++++ provider/azure/terraform/sub_template.rb | 12 +++++++ .../sdktypes/property_to_sdkfield.erb | 6 ++++ .../sdktypes/property_to_sdkobject.erb | 18 +++++++++++ .../azure/terraform/sdktypes/unsupport.erb | 1 + templates/terraform/resource.erb | 16 ++-------- 11 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkfield.erb create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkobject.erb create mode 100644 templates/azure/terraform/sdktypes/unsupport.erb diff --git a/api/azure/sdk_typedef.rb b/api/azure/sdk_typedef.rb index c1f6293a9a5a..8f2cf4cf70c3 100644 --- a/api/azure/sdk_typedef.rb +++ b/api/azure/sdk_typedef.rb @@ -7,7 +7,7 @@ class SDKTypeDefinition < Api::Object def validate super - check_property :go_field_name + check_optional_property :go_field_name end class BooleanObject < SDKTypeDefinition diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 65f4a1b04138..5f13e2d21927 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -16,8 +16,6 @@ package azurerm - - func resourceArmContainerRegistry() *schema.Resource { return &schema.Resource{ Create: resourceArmContainerRegistryCreate, @@ -76,9 +74,15 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} parameters := containerRegistry.Registry{ Location: utils.String(location), - Sku: expandArmContainerRegistrySku(sku), - Properties::Adminuserenabled: utils.Bool(adminEnabled), - StorageAccount.id: utils.String(storageAccountId), + Sku: &containerRegistry.Sku{ + Name: expandArmContainerRegistrySku(sku), + } + RegistryProperties: &containerRegistry.RegistryProperties{ + AdminUserEnabled: utils.Bool(adminEnabled), + } + StorageAccount: &containerRegistry.StorageAccountProperties{ + ID: utils.String(storageAccountId), + } Tags: expandTags(tags), } @@ -130,14 +134,14 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.Set("name", resp.Name) d.Set("resource_group_name", resourceGroup) - if location := resp.Location; location != nil { + if location := resp.::Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - d.Set("sku", resp.Sku) - d.Set("admin_enabled", resp.Properties::Adminuserenabled) - d.Set("storage_account_id", resp.StorageAccount.id) - d.Set("login_server", resp.LoginServer) - flattenAndSetTags(d, resp.Tags) + d.Set("sku", resp.::Sku::Name) + d.Set("admin_enabled", resp.::Properties::Adminuserenabled) + d.Set("storage_account_id", resp.::Storageaccount::Id) + d.Set("login_server", resp.::Loginserver) + flattenAndSetTags(d, resp.::Tags) return nil } diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 6d2571376ce8..d50b731bc7e5 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -16,8 +16,6 @@ package azurerm - - func resourceArmResourceGroup() *schema.Resource { return &schema.Resource{ Create: resourceArmResourceGroupCreateUpdate, @@ -93,10 +91,10 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro d.Set("name", resp.Name) - if location := resp.Location; location != nil { + if location := resp.::Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - flattenAndSetTags(d, resp.Tags) + flattenAndSetTags(d, resp.::Tags) return nil } diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 06ed267ff5e2..be187fb9e94e 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -16,25 +16,29 @@ objects: base_url: NotUsedInAzure azure_sdk_type_defs: - 'location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Registry + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location - 'properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: RegistryProperties go_type_name: RegistryProperties - 'properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject go_field_name: AdminUserEnabled - 'sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: Sku go_type_name: Sku - 'sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Name - 'sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Tier - 'storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + '/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: StorageAccount go_type_name: StorageAccountProperties - 'storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags azure_id_portion: registries azure_create_verb: Create @@ -65,7 +69,7 @@ objects: description: 'The location where the container registry should be created.' required: true input: true - azure_api_path: 'location' + azure_api_path: '/location' - !ruby/object:Api::Type::Enum name: 'sku' values: @@ -75,22 +79,22 @@ objects: - :Premium description: 'The sku of the container registry.' default_value: :Classic - azure_api_path: 'sku/name' + azure_api_path: '/sku/name' - !ruby/object:Api::Type::Boolean name: 'adminEnabled' description: 'Specifies whether admin is enabled of this container registry.' default_value: false - azure_api_path: 'properties/adminUserEnabled' + azure_api_path: '/properties/adminUserEnabled' - !ruby/object:Api::Type::String name: 'storageAccountId' description: 'The storage account ID of the container registry.' - azure_api_path: 'storageAccount/id' + azure_api_path: '/storageAccount/id' - !ruby/object:Api::Type::String name: 'loginServer' description: 'The login server of the container registry.' output: true - azure_api_path: 'loginServer' + azure_api_path: '/loginServer' - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the container registry.' - azure_api_path: 'tags' + azure_api_path: '/tags' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index a34ca5c60205..779b65789ad8 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -16,9 +16,12 @@ objects: base_url: NotUsedInAzure azure_sdk_type_defs: - 'properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: 'TBD' - go_type_name: 'TBD' + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags azure_create_verb: CreateOrUpdate azure_update_verb: CreateOrUpdate @@ -41,8 +44,8 @@ objects: description: 'The location where the resource group should be created.' required: true input: true - azure_api_path: 'location' + azure_api_path: '/location' - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the resource group.' - azure_api_path: 'tags' + azure_api_path: '/tags' diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 9aba5177ee88..779fcd7ee5d1 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -68,6 +68,17 @@ def schema_property_set_template(property) end end + def property_to_sdk_object_template(sdktype) + case sdktype + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + 'templates/azure/terraform/sdktypes/property_to_sdkfield.erb' + when Api::Azure::SDKTypeDefinition::ComplexObject + 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' + else + 'templates/azure/terraform/sdktypes/unsupport.erb' + end + end + end end end diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 238bad00fa15..bf20ff31d39f 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -23,6 +23,18 @@ def build_schema_property_set(input, output, property, object, indentation = 0) object: object end + def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, resource_name, properties, object, indentation = 4) + compile_template property_to_sdk_object_template(sdk_type_def), + indentation: indentation, + output_statement: output, + sdk_package_name: sdk_package, + resource_name: resource_name, + sdk_obj_path: sdk_path, + sdk_type_def: sdk_type_def, + properties: properties, + object: object + end + end end end diff --git a/templates/azure/terraform/sdktypes/property_to_sdkfield.erb b/templates/azure/terraform/sdktypes/property_to_sdkfield.erb new file mode 100644 index 000000000000..760100656c7e --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkfield.erb @@ -0,0 +1,6 @@ +<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<% if expand_funcs.include?(property.class) -%> +<%= output_statement -%><%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), +<% else -%> +<%= output_statement -%>expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb new file mode 100644 index 000000000000..62663d5ade59 --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -0,0 +1,18 @@ +<%= output_statement -%><%= sdk_obj_path == "/" ? "" : "&" -%><%= sdk_package_name -%>.<%= sdk_type_def.go_type_name -%>{ +<% + one_level_props = Hash.new + properties.select { |p| p.azure_api_path.start_with?(sdk_obj_path) }.each do |prop| + prop_key = prop.azure_api_path[sdk_obj_path.length..-1].split("/")[0] + prop_list = one_level_props[prop_key] || Array.new + one_level_props[prop_key] = prop_list << prop + end +-%> +<% + one_level_props.each do |prop_name, prop_list| + sdk_path = sdk_obj_path + prop_name + sdk_type_def = object.azure_sdk_type_defs[sdk_path] + output = sdk_type_def.go_field_name + ": " +-%> +<%= lines(build_property_to_sdk_object(output, sdk_path + "/", sdk_type_def, sdk_package_name, resource_name, properties, object)) -%> +<% end -%> +} \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/unsupport.erb b/templates/azure/terraform/sdktypes/unsupport.erb new file mode 100644 index 000000000000..f7d2348f5a8b --- /dev/null +++ b/templates/azure/terraform/sdktypes/unsupport.erb @@ -0,0 +1 @@ +// TODO: field <%= sdk_obj_path -%> with type <%= sdk_type_def -%> is not supported \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 28fdf72ad01c..8c1008ef2672 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -34,12 +34,11 @@ package azurerm has_project = object.base_url.include?("{{project}}") has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> - <% azure_is_resource_group = object.name == "ResourceGroup" azure_client_name = "#{object.api_name}Client".camelcase(:lower) + sdk_package = azure_resource_go_package(object.__product) -%> - <% combine_create_update = (object.azure_create_verb == object.azure_update_verb) create_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Create") @@ -121,17 +120,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> - parameters := <%= azure_resource_go_package(object.__product) -%>.<%= object.azure_parameters_type -%>{ -<% settable_properties.each do |prop| -%> -<% unless prop.name == "name" || prop.name == "resourceGroupName" -%> -<% if expand_funcs.include?(prop.class) -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: <%= expand_func(prop) -%>(<%= prop.name.camelcase(:lower) -%>), -<% else -%> - <%= prop.azure_api_path.camelcase(:upper) -%>: expand<%= resource_name -%><%= titlelize_property(prop) -%>(<%= prop.name.camelcase(:lower) -%>), -<% end -%> -<% end -%> -<% end -%> - } +<% sdk_type_def = object.azure_sdk_type_defs["/"] -%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object)) -%> <% if object.custom_code.encoder -%> obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) From 4cf84342b82ff1d70f8231a678806d92892817f7 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 28 Jan 2019 16:37:08 -0800 Subject: [PATCH 020/175] Set SDK object back to schema properties. --- .../resource_arm_container_registry.go | 17 +++++++++++++ products/azcontainerregistry/api.yaml | 2 ++ provider/azure/terraform/schema.rb | 11 +++++++++ provider/azure/terraform/sub_template.rb | 10 ++++++++ .../sdktypes/sdkfield_to_property.erb | 3 +++ .../sdktypes/sdkobject_to_property.erb | 24 +++++++++++++++++++ templates/terraform/resource.erb | 6 ++--- 7 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/sdkfield_to_property.erb create mode 100644 templates/azure/terraform/sdktypes/sdkobject_to_property.erb diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 5f13e2d21927..4c8441b99897 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -132,6 +132,22 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) + } + if sku := resp.Sku; sku != nil { + d.Set("sku", sku.Name) + } + if registryProperties := resp.RegistryProperties; registryProperties != nil { + d.Set("admin_enabled", registryProperties.AdminUserEnabled) + } + if storageAccount := resp.StorageAccount; storageAccount != nil { + d.Set("storage_account_id", storageAccount.ID) + } + d.Set("login_server", resp.LoginServer) + flattenAndSetTags(d, resp.Tags) + +/* d.Set("name", resp.Name) d.Set("resource_group_name", resourceGroup) if location := resp.::Location; location != nil { @@ -142,6 +158,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.Set("storage_account_id", resp.::Storageaccount::Id) d.Set("login_server", resp.::Loginserver) flattenAndSetTags(d, resp.::Tags) +*/ return nil } diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index be187fb9e94e..d63c0e8026be 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -20,6 +20,8 @@ objects: go_type_name: Registry '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location + '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoginServer '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: RegistryProperties go_type_name: RegistryProperties diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 779fcd7ee5d1..e4aa576b055b 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -79,6 +79,17 @@ def property_to_sdk_object_template(sdktype) end end + def sdk_object_to_property_template(sdktype) + case sdktype + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + 'templates/azure/terraform/sdktypes/sdkfield_to_property.erb' + when Api::Azure::SDKTypeDefinition::ComplexObject + 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' + else + 'templates/azure/terraform/sdktypes/unsupport.erb' + end + end + end end end diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index bf20ff31d39f..635585cc9807 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -35,6 +35,16 @@ def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, re object: object end + def build_sdk_object_to_property(input, sdk_path, sdk_type_def, properties, object, indentation = 4) + compile_template sdk_object_to_property_template(sdk_type_def), + indentation: indentation, + input_statement: input, + sdk_obj_path: sdk_path, + sdk_type_def: sdk_type_def, + properties: properties, + object: object + end + end end end diff --git a/templates/azure/terraform/sdktypes/sdkfield_to_property.erb b/templates/azure/terraform/sdktypes/sdkfield_to_property.erb new file mode 100644 index 000000000000..ff9c551efb48 --- /dev/null +++ b/templates/azure/terraform/sdktypes/sdkfield_to_property.erb @@ -0,0 +1,3 @@ +<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<% input_var = (property.name == "resourceGroupName" ? "resourceGroup" : input_statement + "." + sdk_type_def.go_field_name) -%> +<%= lines(build_schema_property_set(input_var, 'd', property, object)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb new file mode 100644 index 000000000000..d6828f8c9b31 --- /dev/null +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -0,0 +1,24 @@ +<% + temp_var_name = (sdk_obj_path == "/" ? input_statement : sdk_type_def.go_field_name.camelcase(:lower)) +-%> +<% if sdk_obj_path != "/" -%> +if <%= temp_var_name -%> := <%= input_statement -%>.<%= sdk_type_def.go_field_name -%>; <%= temp_var_name -%> != nil { +<% end -%> +<% + one_level_props = Hash.new + properties.select { |p| p.azure_api_path.start_with?(sdk_obj_path) }.each do |prop| + prop_key = prop.azure_api_path[sdk_obj_path.length..-1].split("/")[0] + prop_list = one_level_props[prop_key] || Array.new + one_level_props[prop_key] = prop_list << prop + end +-%> +<% + one_level_props.each do |prop_name, prop_list| + sdk_path = sdk_obj_path + prop_name + sdk_type_def = object.azure_sdk_type_defs[sdk_path] +-%> +<%= lines(build_sdk_object_to_property(temp_var_name, sdk_path + "/", sdk_type_def, properties, object, (sdk_obj_path == "/" ? 0 : 4))) -%> +<% end -%> +<% if sdk_obj_path != "/" -%> +} +<% end -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 8c1008ef2672..e1b193f8b4a2 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -210,10 +210,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% end -%> -<% properties.each do |prop| -%> -<% input_var = (prop.name == "resourceGroupName" ? "resourceGroup" : "resp.#{prop.azure_api_path.camelcase(:upper)}") -%> -<%= lines(build_schema_property_set(input_var, 'd', prop, object, 4)) -%> -<% end -%> +<% sdk_type_def = object.azure_sdk_type_defs["/"] -%> +<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object)) -%> return nil } From 5e7c5ed3d1e32b4a058cb94a88fe7951792272aa Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 28 Jan 2019 16:55:37 -0800 Subject: [PATCH 021/175] Add update function template. --- .../resource_arm_container_registry.go | 43 +++++++++++++------ .../azurerm/resource_arm_resource_group.go | 4 +- .../sdktypes/sdkfield_to_property.erb | 2 +- templates/terraform/resource.erb | 27 +++++++++++- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 4c8441b99897..2f2154e76754 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -132,6 +132,8 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } @@ -147,19 +149,6 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.Set("login_server", resp.LoginServer) flattenAndSetTags(d, resp.Tags) -/* - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - if location := resp.::Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - d.Set("sku", resp.::Sku::Name) - d.Set("admin_enabled", resp.::Properties::Adminuserenabled) - d.Set("storage_account_id", resp.::Storageaccount::Id) - d.Set("login_server", resp.::Loginserver) - flattenAndSetTags(d, resp.::Tags) -*/ - return nil } @@ -174,7 +163,33 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} resourceGroup := id.ResourceGroup name := id.Path["registries"] - // TODO: Complete Update Function + sku := d.Get("sku").(string) + adminEnabled := d.Get("admin_enabled").(bool) + storageAccountId := d.Get("storage_account_id").(string) + tags := d.Get("tags").(map[string]interface{}) + + parameters := containerRegistry.Registry{ + Sku: &containerRegistry.Sku{ + Name: expandArmContainerRegistrySku(sku), + } + RegistryProperties: &containerRegistry.RegistryProperties{ + AdminUserEnabled: utils.Bool(adminEnabled), + } + StorageAccount: &containerRegistry.StorageAccountProperties{ + ID: utils.String(storageAccountId), + } + Tags: expandTags(tags), + } + + future, err := client.Update(ctx, resourceGroup, name, parameters) + if err != nil { + return fmt.Errorf("Error updating ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for update of ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + return resourceArmContainerRegistryRead(d, meta) } func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{}) error { diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index d50b731bc7e5..bc84be4b3fa5 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -91,10 +91,10 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro d.Set("name", resp.Name) - if location := resp.::Location; location != nil { + if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - flattenAndSetTags(d, resp.::Tags) + flattenAndSetTags(d, resp.Tags) return nil } diff --git a/templates/azure/terraform/sdktypes/sdkfield_to_property.erb b/templates/azure/terraform/sdktypes/sdkfield_to_property.erb index ff9c551efb48..d6900f4753b8 100644 --- a/templates/azure/terraform/sdktypes/sdkfield_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkfield_to_property.erb @@ -1,3 +1,3 @@ <% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> -<% input_var = (property.name == "resourceGroupName" ? "resourceGroup" : input_statement + "." + sdk_type_def.go_field_name) -%> +<% input_var = input_statement + "." + sdk_type_def.go_field_name -%> <%= lines(build_schema_property_set(input_var, 'd', property, object)) -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e1b193f8b4a2..1db86d58c523 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -210,6 +210,10 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% end -%> + d.Set("name", resp.Name) +<% if !azure_is_resource_group -%> + d.Set("resource_group_name", resourceGroup) +<% end -%> <% sdk_type_def = object.azure_sdk_type_defs["/"] -%> <%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object)) -%> @@ -233,7 +237,28 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res name := id.Path["<%= object.azure_id_portion -%>"] <% end -%> - // TODO: Complete Update Function +<% settable_properties.each do |prop| -%> +<% if prop.name != "name" && prop.name != "resourceGroupName" && prop.name != "location" -%> +<% output_var = prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> +<% end -%> +<% end -%> + +<% + sdk_type_def = object.azure_sdk_type_defs["/"] + updatable_properties = settable_properties.reject { |p| p.name == "location" } +-%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object)) -%> + + future, err := client.<%= object.azure_update_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + if err != nil { + return fmt.Errorf("Error updating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for update of <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + return resource<%= resource_name -%>Read(d, meta) } <% end -%> From ba5611a45940c4e72f173e81574c43e9a0ed3839 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 28 Jan 2019 18:12:38 -0800 Subject: [PATCH 022/175] Fix some go code style issues. --- api/azure/sdk_typedef.rb | 25 ++++ api/resource.rb | 3 +- .../resource_arm_container_registry.go | 46 ++++---- .../azurerm/resource_arm_resource_group.go | 2 +- products/azcontainerregistry/api.yaml | 108 +++++++++++++----- products/azresourcegroup/api.yaml | 29 +++-- provider/azure/terraform/schema.rb | 8 +- provider/azure/terraform/sub_template.rb | 6 +- provider/terraform.rb | 2 +- .../sdktypes/property_to_sdkenum.erb | 2 + .../sdktypes/property_to_sdkobject.erb | 6 +- ...field.erb => property_to_sdkprimitive.erb} | 0 .../sdktypes/sdkenum_to_property.erb | 3 + .../sdktypes/sdkobject_to_property.erb | 4 +- ...perty.erb => sdkprimitive_to_property.erb} | 0 templates/terraform/resource.erb | 14 +-- 16 files changed, 181 insertions(+), 77 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkenum.erb rename templates/azure/terraform/sdktypes/{property_to_sdkfield.erb => property_to_sdkprimitive.erb} (100%) create mode 100644 templates/azure/terraform/sdktypes/sdkenum_to_property.erb rename templates/azure/terraform/sdktypes/{sdkfield_to_property.erb => sdkprimitive_to_property.erb} (100%) diff --git a/api/azure/sdk_typedef.rb b/api/azure/sdk_typedef.rb index 8f2cf4cf70c3..3bbe3766af52 100644 --- a/api/azure/sdk_typedef.rb +++ b/api/azure/sdk_typedef.rb @@ -2,6 +2,22 @@ module Api module Azure + class SDKTypeDefinitions < Api::Object + attr_reader :create + attr_reader :read + attr_reader :update + + def validate + super + check_property :create, Hash + check_property :read, Hash + check_property :update, Hash + check_property_hash :create, String, Api::Azure::SDKTypeDefinition + check_property_hash :read, String, Api::Azure::SDKTypeDefinition + check_property_hash :update, String, Api::Azure::SDKTypeDefinition + end + end + class SDKTypeDefinition < Api::Object attr_reader :go_field_name @@ -16,6 +32,15 @@ class BooleanObject < SDKTypeDefinition class StringObject < SDKTypeDefinition end + class EnumObject < SDKTypeDefinition + attr_reader :go_enum_type_name + + def validate + super + check_property :go_enum_type_name, String + end + end + class ComplexObject < SDKTypeDefinition attr_reader :go_type_name diff --git a/api/resource.rb b/api/resource.rb index f3c299e54e13..9bb99806a5de 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -265,8 +265,7 @@ def validate check_optional_property :input, :boolean check_optional_property :min_version, String - check_property :azure_sdk_type_defs, Hash - check_property_hash :azure_sdk_type_defs, String, Api::Azure::SDKTypeDefinition + check_property :azure_sdk_type_defs, Api::Azure::SDKTypeDefinitions check_optional_property :azure_id_portion, String check_optional_property :azure_create_async, :boolean check_optional_property :azure_delete_async, :boolean diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 2f2154e76754..42be7c3f65d6 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -72,17 +72,17 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} storageAccountId := d.Get("storage_account_id").(string) tags := d.Get("tags").(map[string]interface{}) - parameters := containerRegistry.Registry{ + parameters := containerregistry.Registry{ Location: utils.String(location), - Sku: &containerRegistry.Sku{ - Name: expandArmContainerRegistrySku(sku), - } - RegistryProperties: &containerRegistry.RegistryProperties{ + Sku: &containerregistry.Sku{ + Name: containerregistry.SkuName(sku), + }, + RegistryProperties: &containerregistry.RegistryProperties{ AdminUserEnabled: utils.Bool(adminEnabled), - } - StorageAccount: &containerRegistry.StorageAccountProperties{ - ID: utils.String(storageAccountId), - } + StorageAccount: &containerregistry.StorageAccountProperties{ + ID: utils.String(storageAccountId), + }, + }, Tags: expandTags(tags), } @@ -101,7 +101,7 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} if err != nil { return err } - if read.ID == nil { + if resp.ID == nil { return fmt.Errorf("Cannot read ContainerRegistry %q", name) } d.SetId(*resp.ID) @@ -138,13 +138,13 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.Set("location", azureRMNormalizeLocation(*location)) } if sku := resp.Sku; sku != nil { - d.Set("sku", sku.Name) + d.Set("sku", string(sku.Name)) } if registryProperties := resp.RegistryProperties; registryProperties != nil { d.Set("admin_enabled", registryProperties.AdminUserEnabled) - } - if storageAccount := resp.StorageAccount; storageAccount != nil { - d.Set("storage_account_id", storageAccount.ID) + if storageAccount := registryProperties.StorageAccount; storageAccount != nil { + d.Set("storage_account_id", storageAccount.ID) + } } d.Set("login_server", resp.LoginServer) flattenAndSetTags(d, resp.Tags) @@ -168,16 +168,16 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} storageAccountId := d.Get("storage_account_id").(string) tags := d.Get("tags").(map[string]interface{}) - parameters := containerRegistry.Registry{ - Sku: &containerRegistry.Sku{ - Name: expandArmContainerRegistrySku(sku), - } - RegistryProperties: &containerRegistry.RegistryProperties{ + parameters := containerregistry.RegistryUpdateParameters{ + Sku: &containerregistry.Sku{ + Name: containerregistry.SkuName(sku), + }, + RegistryPropertiesUpdateParameters: &containerregistry.RegistryPropertiesUpdateParameters{ AdminUserEnabled: utils.Bool(adminEnabled), - } - StorageAccount: &containerRegistry.StorageAccountProperties{ - ID: utils.String(storageAccountId), - } + StorageAccount: &containerregistry.StorageAccountProperties{ + ID: utils.String(storageAccountId), + }, + }, Tags: expandTags(tags), } diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index bc84be4b3fa5..ce3af02617ef 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -60,7 +60,7 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface if err != nil { return err } - if read.ID == nil { + if resp.ID == nil { return fmt.Errorf("Cannot read ResourceGroup %q", name) } d.SetId(*resp.ID) diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index d63c0e8026be..2b3697fcb322 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -15,32 +15,86 @@ objects: api_name: ContainerRegistry base_url: NotUsedInAzure - azure_sdk_type_defs: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Registry - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoginServer - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryProperties - go_type_name: RegistryProperties - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags + azure_sdk_type_defs: !ruby/object:Api::Azure::SDKTypeDefinitions + create: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Registry + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryProperties + go_type_name: RegistryProperties + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + read: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Registry + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoginServer + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryProperties + go_type_name: RegistryProperties + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + update: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: RegistryUpdateParameters + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoginServer + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryPropertiesUpdateParameters + go_type_name: RegistryPropertiesUpdateParameters + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags azure_id_portion: registries azure_create_verb: Create @@ -90,7 +144,7 @@ objects: - !ruby/object:Api::Type::String name: 'storageAccountId' description: 'The storage account ID of the container registry.' - azure_api_path: '/storageAccount/id' + azure_api_path: '/properties/storageAccount/id' - !ruby/object:Api::Type::String name: 'loginServer' description: 'The login server of the container registry.' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 779b65789ad8..a05a1bc467a3 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -15,13 +15,28 @@ objects: api_name: ResourceGroups base_url: NotUsedInAzure - azure_sdk_type_defs: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags + azure_sdk_type_defs: !ruby/object:Api::Azure::SDKTypeDefinitions + create: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + read: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + update: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags azure_create_verb: CreateOrUpdate azure_update_verb: CreateOrUpdate diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index e4aa576b055b..eb7fe68e4bfe 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -71,7 +71,9 @@ def schema_property_set_template(property) def property_to_sdk_object_template(sdktype) case sdktype when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject - 'templates/azure/terraform/sdktypes/property_to_sdkfield.erb' + 'templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb' + when Api::Azure::SDKTypeDefinition::EnumObject + 'templates/azure/terraform/sdktypes/property_to_sdkenum.erb' when Api::Azure::SDKTypeDefinition::ComplexObject 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' else @@ -82,7 +84,9 @@ def property_to_sdk_object_template(sdktype) def sdk_object_to_property_template(sdktype) case sdktype when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject - 'templates/azure/terraform/sdktypes/sdkfield_to_property.erb' + 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' + when Api::Azure::SDKTypeDefinition::EnumObject + 'templates/azure/terraform/sdktypes/sdkenum_to_property.erb' when Api::Azure::SDKTypeDefinition::ComplexObject 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' else diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 635585cc9807..08a24135af65 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -23,7 +23,7 @@ def build_schema_property_set(input, output, property, object, indentation = 0) object: object end - def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, resource_name, properties, object, indentation = 4) + def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, resource_name, properties, sdk_type_defs, object, indentation = 4) compile_template property_to_sdk_object_template(sdk_type_def), indentation: indentation, output_statement: output, @@ -31,16 +31,18 @@ def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, re resource_name: resource_name, sdk_obj_path: sdk_path, sdk_type_def: sdk_type_def, + sdk_type_defs: sdk_type_defs, properties: properties, object: object end - def build_sdk_object_to_property(input, sdk_path, sdk_type_def, properties, object, indentation = 4) + def build_sdk_object_to_property(input, sdk_path, sdk_type_def, properties, sdk_type_defs, object, indentation = 4) compile_template sdk_object_to_property_template(sdk_type_def), indentation: indentation, input_statement: input, sdk_obj_path: sdk_path, sdk_type_def: sdk_type_def, + sdk_type_defs: sdk_type_defs, properties: properties, object: object end diff --git a/provider/terraform.rb b/provider/terraform.rb index 8454b6e2fe13..97323784e75d 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -70,7 +70,7 @@ def tf_types # BEGIN Azure Specific Methods def azure_resource_go_package(product) - product.azure_namespace.split('.').last.camelcase(:lower) + product.azure_namespace.split('.').last.downcase end # END Azure Specific Methods diff --git a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb new file mode 100644 index 000000000000..89e55108c555 --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb @@ -0,0 +1,2 @@ +<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<%= output_statement -%><%= sdk_package_name -%>.<%= sdk_type_def.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 62663d5ade59..5d697045dc9d 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -10,9 +10,9 @@ <% one_level_props.each do |prop_name, prop_list| sdk_path = sdk_obj_path + prop_name - sdk_type_def = object.azure_sdk_type_defs[sdk_path] + sdk_type_def = sdk_type_defs[sdk_path] output = sdk_type_def.go_field_name + ": " -%> -<%= lines(build_property_to_sdk_object(output, sdk_path + "/", sdk_type_def, sdk_package_name, resource_name, properties, object)) -%> +<%= lines(build_property_to_sdk_object(output, sdk_path + "/", sdk_type_def, sdk_package_name, resource_name, properties, sdk_type_defs, object)) -%> <% end -%> -} \ No newline at end of file +}<%= "," unless sdk_obj_path == "/" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkfield.erb b/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb similarity index 100% rename from templates/azure/terraform/sdktypes/property_to_sdkfield.erb rename to templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb new file mode 100644 index 000000000000..4daf84ccd46d --- /dev/null +++ b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb @@ -0,0 +1,3 @@ +<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<% input_var = "string(" + input_statement + "." + sdk_type_def.go_field_name + ")" -%> +<%= lines(build_schema_property_set(input_var, 'd', property, object)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index d6828f8c9b31..9dc125ad7777 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -15,9 +15,9 @@ if <%= temp_var_name -%> := <%= input_statement -%>.<%= sdk_type_def.go_field_na <% one_level_props.each do |prop_name, prop_list| sdk_path = sdk_obj_path + prop_name - sdk_type_def = object.azure_sdk_type_defs[sdk_path] + sdk_type_def = sdk_type_defs[sdk_path] -%> -<%= lines(build_sdk_object_to_property(temp_var_name, sdk_path + "/", sdk_type_def, properties, object, (sdk_obj_path == "/" ? 0 : 4))) -%> +<%= lines(build_sdk_object_to_property(temp_var_name, sdk_path + "/", sdk_type_def, properties, sdk_type_defs, object, (sdk_obj_path == "/" ? 0 : 4))) -%> <% end -%> <% if sdk_obj_path != "/" -%> } diff --git a/templates/azure/terraform/sdktypes/sdkfield_to_property.erb b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb similarity index 100% rename from templates/azure/terraform/sdktypes/sdkfield_to_property.erb rename to templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 1db86d58c523..382a07b8c37f 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -120,8 +120,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<% sdk_type_def = object.azure_sdk_type_defs["/"] -%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object)) -%> +<% sdk_type_def = object.azure_sdk_type_defs.create["/"] -%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_type_defs.create, object)) -%> <% if object.custom_code.encoder -%> obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) @@ -159,7 +159,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res if err != nil { return err } - if read.ID == nil { + if resp.ID == nil { return fmt.Errorf("Cannot read <%= object.name -%> %q", name) } d.SetId(*resp.ID) @@ -214,8 +214,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% if !azure_is_resource_group -%> d.Set("resource_group_name", resourceGroup) <% end -%> -<% sdk_type_def = object.azure_sdk_type_defs["/"] -%> -<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object)) -%> +<% sdk_type_def = object.azure_sdk_type_defs.read["/"] -%> +<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object.azure_sdk_type_defs.read, object)) -%> return nil } @@ -245,10 +245,10 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <% - sdk_type_def = object.azure_sdk_type_defs["/"] + sdk_type_def = object.azure_sdk_type_defs.update["/"] updatable_properties = settable_properties.reject { |p| p.name == "location" } -%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object)) -%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object.azure_sdk_type_defs.update, object)) -%> future, err := client.<%= object.azure_update_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) if err != nil { From a0e88384e953e7b9cdf2dbb2fd3bfa21d2038d23 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 28 Jan 2019 18:43:13 -0800 Subject: [PATCH 023/175] Generate documentation of Azure container registry. --- ...e_arm_container_registry_generated_test.go | 94 +++++++++++++++++++ .../docs/r/container_registry.html.markdown | 49 +++++++--- .../docs/r/resource_group.html.markdown | 12 +-- products/azcontainerregistry/api.yaml | 14 +-- products/azcontainerregistry/terraform.yaml | 5 + .../examples/container_registry.tf.erb | 21 +++++ .../terraform/property_documentation.erb | 13 ++- .../terraform/resource.html.markdown.erb | 11 ++- 8 files changed, 188 insertions(+), 31 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_container_registry_generated_test.go create mode 100644 templates/terraform/examples/container_registry.tf.erb diff --git a/build/azterraform/azurerm/resource_arm_container_registry_generated_test.go b/build/azterraform/azurerm/resource_arm_container_registry_generated_test.go new file mode 100644 index 000000000000..aa21ab9429e3 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_container_registry_generated_test.go @@ -0,0 +1,94 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" +) + + +func TestAccArmContainerRegistry_containerRegistryExample(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckArmContainerRegistryDestroy, + Steps: []resource.TestStep{ + { + Config: testAccArmContainerRegistry_containerRegistryExample(acctest.RandString(10)), + }, + { + ResourceName: "google_arm_container_registry.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccArmContainerRegistry_containerRegistryExample(val string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "example" { + name = "example-rg-%s" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} +`, val, + ) +} + + +func testAccCheckArmContainerRegistryDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "google_arm_container_registry" { + continue + } + + config := testAccProvider.Meta().(*Config) + + url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") + if err != nil { + return err + } + + _, err = sendRequest(config, "GET", url, nil) + if err == nil { + return fmt.Errorf("ArmContainerRegistry still exists at %s", url) + } + } + + return nil +} diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown index 8c59a654c5c2..0e05fce26699 100644 --- a/build/azterraform/website/docs/r/container_registry.html.markdown +++ b/build/azterraform/website/docs/r/container_registry.html.markdown @@ -20,43 +20,68 @@ description: |- --- # azurerm_container_registry + Manages a container registry on Azure. +## Example Usage - Container Registry + + +```hcl +resource "azurerm_resource_group" "example" { + name = "example-rg" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} +``` + ## Argument Reference The following arguments are supported: +* `name` - (Required) Specifies the name of the Container Registry. Changing this forces a new resource to be created. -* `name` - (Required) The name of the container registry. - -* `resource_group_name` - (Required) The resource group name of the container registry. +* `resource_group_name` - (Required) The name of the resource group in which to create the Container Registry. Changing this forces a new resource to be created. -* `location` - (Required) The location where the container registry should be created. +* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. -* `sku` - (Optional) The sku of the container registry. +* `sku` - (Optional) The SKU name of the the container registry. Defaults to `Classic`. -* `admin_enabled` - (Optional) Specifies whether admin is enabled of this container registry. +* `admin_enabled` - (Optional) Specifies whether the admin user is enabled. Defaults to `false`. -* `storage_account_id` - (Optional) The storage account ID of the container registry. +* `storage_account_id` - (Optional) The ID of a Storage Account which must be located in the same Azure Region as the Container Registry. * `tags` - (Optional) A mapping of tags to assign to the container registry. + ## Attributes Reference The following attributes are exported: * `id` - The container registry ID. - -* `login_server` - (Optional) The login server of the container registry. +* `login_server` - The URL that can be used to log into the container registry. ## Import ContainerRegistry can be imported using the `resource id`, e.g. - ```shell -$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/containerRegistrys/example -``` +$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.ContainerRegistry/registries/example``` diff --git a/build/azterraform/website/docs/r/resource_group.html.markdown b/build/azterraform/website/docs/r/resource_group.html.markdown index ff11cac3d3e4..ee6a15f05281 100644 --- a/build/azterraform/website/docs/r/resource_group.html.markdown +++ b/build/azterraform/website/docs/r/resource_group.html.markdown @@ -20,6 +20,7 @@ description: |- --- # azurerm_resource_group + Manages a resource group on Azure. @@ -42,12 +43,12 @@ resource "azurerm_resource_group" "example" { The following arguments are supported: +* `name` - (Required) The name of the resource group. Changing this forces a new resource to be created. -* `name` - (Required) The name of the resource group. - -* `location` - (Required) The location where the resource group should be created. +* `location` - (Required) The location where the resource group should be created. Changing this forces a new resource to be created. * `tags` - (Optional) A mapping of tags to assign to the resource group. + ## Attributes Reference The following attributes are exported: @@ -56,11 +57,8 @@ The following attributes are exported: - ## Import ResourceGroup can be imported using the `resource id`, e.g. - ```shell -$ terraform import azurerm_resource_group.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example -``` +$ terraform import azurerm_resource_group.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg``` diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 2b3697fcb322..aea4e89544db 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -110,19 +110,19 @@ objects: properties: - !ruby/object:Api::Type::String name: 'name' - description: 'The name of the container registry.' + description: 'Specifies the name of the Container Registry.' required: true input: true azure_api_path: 'name' - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' - description: 'The resource group name of the container registry.' + description: 'The name of the resource group in which to create the Container Registry.' required: true input: true azure_api_path: 'rgname' - !ruby/object:Api::Azure::Type::Location name: 'location' - description: 'The location where the container registry should be created.' + description: 'Specifies the supported Azure location where the resource exists.' required: true input: true azure_api_path: '/location' @@ -133,21 +133,21 @@ objects: - :Basic - :Standard - :Premium - description: 'The sku of the container registry.' + description: 'The SKU name of the the container registry.' default_value: :Classic azure_api_path: '/sku/name' - !ruby/object:Api::Type::Boolean name: 'adminEnabled' - description: 'Specifies whether admin is enabled of this container registry.' + description: 'Specifies whether the admin user is enabled.' default_value: false azure_api_path: '/properties/adminUserEnabled' - !ruby/object:Api::Type::String name: 'storageAccountId' - description: 'The storage account ID of the container registry.' + description: 'The ID of a Storage Account which must be located in the same Azure Region as the Container Registry.' azure_api_path: '/properties/storageAccount/id' - !ruby/object:Api::Type::String name: 'loginServer' - description: 'The login server of the container registry.' + description: 'The URL that can be used to log into the container registry.' output: true azure_api_path: '/loginServer' - !ruby/object:Api::Azure::Type::Tags diff --git a/products/azcontainerregistry/terraform.yaml b/products/azcontainerregistry/terraform.yaml index b02dfbf3367e..94bc190a97e5 100644 --- a/products/azcontainerregistry/terraform.yaml +++ b/products/azcontainerregistry/terraform.yaml @@ -3,3 +3,8 @@ name: Arm overrides: !ruby/object:Provider::ResourceOverrides ContainerRegistry: !ruby/object:Provider::Terraform::ResourceOverride example: + - !ruby/object:Provider::Terraform::Examples + name: "container_registry" + primary_resource_id: "example" + vars: + rg_name: "example-rg" diff --git a/templates/terraform/examples/container_registry.tf.erb b/templates/terraform/examples/container_registry.tf.erb new file mode 100644 index 000000000000..567b0d238e56 --- /dev/null +++ b/templates/terraform/examples/container_registry.tf.erb @@ -0,0 +1,21 @@ +resource "azurerm_resource_group" "example" { + name = "<%= ctx[:vars]["rg_name"] %>" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} \ No newline at end of file diff --git a/templates/terraform/property_documentation.erb b/templates/terraform/property_documentation.erb index 21bbadd86afd..37103c8984d0 100644 --- a/templates/terraform/property_documentation.erb +++ b/templates/terraform/property_documentation.erb @@ -1,5 +1,16 @@ -* `<%= property.name.underscore -%>` - (<%= property.required ? 'Required' : 'Optional' %>) <%= property.description.strip.gsub("\n\n", "\n") -%> +<% + prefix = "" + prefix = "(Required) " if property.required && !property.output + prefix = "(Optional) " if !property.required && !property.output + + force_new_postfix = "" + force_new_postfix = " Changing this forces a new resource to be created." if property.input && !property.output + + default_value_postfix = "" + default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil +-%> +* `<%= property.name.underscore -%>` - <%= prefix %><%= property.description.strip.gsub("\n\n", "\n") -%><%= default_value_postfix -%><%= force_new_postfix -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> Structure is documented below. <% end -%> diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 7548942cad82..fde3692f6bfa 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -50,6 +50,7 @@ description: |- # azurerm_<%= resource_name -%> + <%= lines(object.description) -%> @@ -87,7 +88,6 @@ To get more information about <%= object.name -%>, see: ## Argument Reference The following arguments are supported: - <% properties.select(&:required).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> @@ -100,12 +100,12 @@ The following arguments are supported: <% properties.reject(&:required).reject(&:output).each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> + ## Attributes Reference The following attributes are exported: * `id` - The <%= resource_name.gsub("_", " ") -%> ID. - <% properties.select(&:output).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> @@ -136,7 +136,10 @@ This resource provides the following ## Import <%= object.name -%> can be imported using the `resource id`, e.g. - +<% + resource_id_postfix = "" + resource_id_postfix = "/#{object.__product.azure_namespace}/#{object.azure_id_portion}/example" unless object.name == "ResourceGroup" +-%> ```shell -$ terraform import azurerm_<%= resource_name -%>.example /subscriptions/00000000-0000-0000-0000-000000000000/<%= object.name.camelcase(:lower) -%>s/example +$ terraform import azurerm_<%= resource_name -%>.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg<%= resource_id_postfix -%> ``` From 4aaaa8dd18394df7131d5289845d47702d0515e2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 15 Feb 2019 17:34:33 +0800 Subject: [PATCH 024/175] Move CRUD verbs into SDK Definition. --- api/azure/sdk_definition.rb | 21 ++ api/azure/sdk_operation_definition.rb | 23 +++ ...{sdk_typedef.rb => sdk_type_definition.rb} | 18 +- api/compiler.rb | 2 +- api/resource.rb | 16 +- google/yaml_validator.rb | 6 + products/azcontainerregistry/api.yaml | 183 ++++++++++-------- products/azresourcegroup/api.yaml | 64 +++--- templates/terraform/resource.erb | 30 +-- 9 files changed, 203 insertions(+), 160 deletions(-) create mode 100644 api/azure/sdk_definition.rb create mode 100644 api/azure/sdk_operation_definition.rb rename api/azure/{sdk_typedef.rb => sdk_type_definition.rb} (58%) diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb new file mode 100644 index 000000000000..7b564349a579 --- /dev/null +++ b/api/azure/sdk_definition.rb @@ -0,0 +1,21 @@ +require 'api/object' +require 'api/azure/sdk_operation_definition' + +module Api + module Azure + class SDKDefinition < Api::Object + attr_reader :create + attr_reader :read + attr_reader :update + attr_reader :delete + + def validate + super + check_property :create, Api::Azure::SDKOperationDefinition + check_property :read, Api::Azure::SDKOperationDefinition + check_property :update, Api::Azure::SDKOperationDefinition + check_property :delete, Api::Azure::SDKOperationDefinition + end + end + end +end diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb new file mode 100644 index 000000000000..e0053aa164f9 --- /dev/null +++ b/api/azure/sdk_operation_definition.rb @@ -0,0 +1,23 @@ +require 'api/object' +require 'api/azure/sdk_type_definition' + +module Api + module Azure + class SDKOperationDefinition < Api::Object + attr_reader :go_func_name + attr_reader :async + attr_reader :request + attr_reader :response + + def validate + super + check_property :go_func_name, String + check_optional_property :async, :boolean + check_property :request, Hash + check_property_hash :request, String, Api::Azure::SDKTypeDefinition + check_optional_property :response, Hash + check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinition + end + end + end +end diff --git a/api/azure/sdk_typedef.rb b/api/azure/sdk_type_definition.rb similarity index 58% rename from api/azure/sdk_typedef.rb rename to api/azure/sdk_type_definition.rb index 3bbe3766af52..69fdb7de90f5 100644 --- a/api/azure/sdk_typedef.rb +++ b/api/azure/sdk_type_definition.rb @@ -2,22 +2,6 @@ module Api module Azure - class SDKTypeDefinitions < Api::Object - attr_reader :create - attr_reader :read - attr_reader :update - - def validate - super - check_property :create, Hash - check_property :read, Hash - check_property :update, Hash - check_property_hash :create, String, Api::Azure::SDKTypeDefinition - check_property_hash :read, String, Api::Azure::SDKTypeDefinition - check_property_hash :update, String, Api::Azure::SDKTypeDefinition - end - end - class SDKTypeDefinition < Api::Object attr_reader :go_field_name @@ -52,4 +36,4 @@ def validate end end -end \ No newline at end of file +end diff --git a/api/compiler.rb b/api/compiler.rb index ec542ecda0a3..352af2cac53b 100644 --- a/api/compiler.rb +++ b/api/compiler.rb @@ -20,7 +20,7 @@ require 'google/yaml_validator' require 'api/azure/type' -require 'api/azure/sdk_typedef' +require 'api/azure/sdk_definition' module Api # Process .yaml and produces output module diff --git a/api/resource.rb b/api/resource.rb index 9bb99806a5de..dc18f0838a86 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -64,14 +64,8 @@ module Properties attr_reader :min_version # Minimum API version this resource is in # Azure Specific Attributes - attr_reader :azure_sdk_type_defs + attr_reader :azure_sdk_definition attr_reader :azure_id_portion - attr_reader :azure_create_async - attr_reader :azure_delete_async - attr_reader :azure_create_verb - attr_reader :azure_read_verb - attr_reader :azure_update_verb - attr_reader :azure_delete_verb attr_reader :azure_parameters_type end @@ -265,14 +259,8 @@ def validate check_optional_property :input, :boolean check_optional_property :min_version, String - check_property :azure_sdk_type_defs, Api::Azure::SDKTypeDefinitions + check_property :azure_sdk_definition, Api::Azure::SDKDefinition check_optional_property :azure_id_portion, String - check_optional_property :azure_create_async, :boolean - check_optional_property :azure_delete_async, :boolean - check_optional_property :azure_create_verb, String - check_optional_property :azure_read_verb, String - check_optional_property :azure_update_verb, String - check_optional_property :azure_delete_verb, String check_optional_property :azure_parameters_type, String set_variables(@parameters, :__resource) diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 21354b355d6a..53aac00142da 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -135,6 +135,12 @@ def check_property_hash(name, keyType = nil, valType = nil) end end + def check_optional_property_hash(name, keyType = nil, valType = nil) + obj_hash = instance_variable_get("@#{name}") + return if obj_hash.nil? + check_property_hash(name, keyType, valType) + end + # Verifies if a property is of a given type and its value are one of the # valid possibilities. def check_property_oneof(property, valid_values, type = nil) diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index aea4e89544db..9fdc08ec33fa 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -15,94 +15,105 @@ objects: api_name: ContainerRegistry base_url: NotUsedInAzure - azure_sdk_type_defs: !ruby/object:Api::Azure::SDKTypeDefinitions - create: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Registry - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryProperties - go_type_name: RegistryProperties - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - read: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Registry - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoginServer - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryProperties - go_type_name: RegistryProperties - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - update: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: RegistryUpdateParameters - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoginServer - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryPropertiesUpdateParameters - go_type_name: RegistryPropertiesUpdateParameters - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Create + async: true + request: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Registry + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryProperties + go_type_name: RegistryProperties + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Registry + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoginServer + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryProperties + go_type_name: RegistryProperties + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + update: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Update + request: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: RegistryUpdateParameters + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoginServer + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: RegistryPropertiesUpdateParameters + go_type_name: RegistryPropertiesUpdateParameters + '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: AdminUserEnabled + '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sku + go_type_name: Sku + '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: Name + go_enum_type_name: SkuName + '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tier + '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: StorageAccount + go_type_name: StorageAccountProperties + '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + async: true + request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: name + azure_id_portion: registries - azure_create_verb: Create - azure_create_async: true - azure_update_verb: Update - azure_read_verb: Get - azure_delete_verb: Delete - azure_delete_async: true azure_parameters_type: Registry description: | diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index a05a1bc467a3..8a43268afe8c 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -15,34 +15,44 @@ objects: api_name: ResourceGroups base_url: NotUsedInAzure - azure_sdk_type_defs: !ruby/object:Api::Azure::SDKTypeDefinitions - create: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - read: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - update: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + update: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Group + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + async: true + request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name - azure_create_verb: CreateOrUpdate - azure_update_verb: CreateOrUpdate - azure_read_verb: Get - azure_delete_verb: Delete - azure_delete_async: true azure_parameters_type: ResourceGroup description: | diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 382a07b8c37f..3bc688d0f78b 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -40,7 +40,7 @@ package azurerm sdk_package = azure_resource_go_package(object.__product) -%> <% - combine_create_update = (object.azure_create_verb == object.azure_update_verb) + combine_create_update = (object.azure_sdk_definition.create.go_func_name == object.azure_sdk_definition.update.go_func_name) create_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Create") update_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Update") -%> @@ -120,8 +120,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<% sdk_type_def = object.azure_sdk_type_defs.create["/"] -%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_type_defs.create, object)) -%> +<% sdk_type_def = object.azure_sdk_definition.create.request["/"] -%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> <% if object.custom_code.encoder -%> obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) @@ -139,12 +139,12 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res defer mutexKV.Unlock(lockName) <% end -%> -<% unless object.azure_create_async -%> - if _, err := client.<%= object.azure_create_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { +<% unless object.azure_sdk_definition.create.async -%> + if _, err := client.<%= object.azure_sdk_definition.create.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } <% else -%> - future, err := client.<%= object.azure_create_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + future, err := client.<%= object.azure_sdk_definition.create.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) if err != nil { return fmt.Errorf("Error creating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -155,7 +155,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := client.<%= object.azure_read_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_sdk_definition.read.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { return err } @@ -183,7 +183,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) name := id.Path["<%= object.azure_id_portion -%>"] <% end -%> - resp, err := client.<%= object.azure_read_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := client.<%= object.azure_sdk_definition.read.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) @@ -214,8 +214,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% if !azure_is_resource_group -%> d.Set("resource_group_name", resourceGroup) <% end -%> -<% sdk_type_def = object.azure_sdk_type_defs.read["/"] -%> -<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object.azure_sdk_type_defs.read, object)) -%> +<% sdk_type_def = object.azure_sdk_definition.read.response["/"] -%> +<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object.azure_sdk_definition.read.response, object)) -%> return nil } @@ -245,12 +245,12 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <% - sdk_type_def = object.azure_sdk_type_defs.update["/"] + sdk_type_def = object.azure_sdk_definition.update.request["/"] updatable_properties = settable_properties.reject { |p| p.name == "location" } -%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object.azure_sdk_type_defs.update, object)) -%> +<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object.azure_sdk_definition.update.request, object)) -%> - future, err := client.<%= object.azure_update_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + future, err := client.<%= object.azure_sdk_definition.update.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) if err != nil { return fmt.Errorf("Error updating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -287,10 +287,10 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ name := id.Path["<%= object.azure_id_portion -%>"] <% end -%> -<% unless object.azure_delete_async -%> +<% unless object.azure_sdk_definition.delete.async -%> // TODO: Synced Delete Operation <% else -%> - future, err := client.<%= object.azure_delete_verb -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + future, err := client.<%= object.azure_sdk_definition.delete.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if response.WasNotFound(future.Response()) { return nil From c267fb1d6521e02107600d71ad9779cc22fe5b9b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 18 Feb 2019 14:41:08 +0800 Subject: [PATCH 025/175] Refine request parameter invocation logic. --- api/azure/sdk_definition.rb | 2 + api/azure/sdk_type_definition.rb | 4 + api/resource.rb | 4 - .../resource_arm_container_registry.go | 1 - .../azurerm/resource_arm_resource_group.go | 1 - .../docs/r/container_registry.html.markdown | 2 +- products/azcontainerregistry/api.yaml | 39 ++++++--- products/azresourcegroup/api.yaml | 16 +++- products/azresourcegroup/terraform.yaml | 1 - provider/azure/terraform/sub_template.rb | 12 +++ provider/terraform/resource_override.rb | 5 -- .../azure/terraform/sdk/azure_id_parser.erb | 8 ++ .../terraform/sdk/function_invocation.erb | 3 + templates/terraform/resource.erb | 79 +++++-------------- .../terraform/resource.html.markdown.erb | 2 +- 15 files changed, 92 insertions(+), 87 deletions(-) create mode 100644 templates/azure/terraform/sdk/azure_id_parser.erb create mode 100644 templates/azure/terraform/sdk/function_invocation.erb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 7b564349a579..0cb7a3954743 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -4,6 +4,7 @@ module Api module Azure class SDKDefinition < Api::Object + attr_reader :provider_name attr_reader :create attr_reader :read attr_reader :update @@ -11,6 +12,7 @@ class SDKDefinition < Api::Object def validate super + check_optional_property :provider_name, String check_property :create, Api::Azure::SDKOperationDefinition check_property :read, Api::Azure::SDKOperationDefinition check_property :update, Api::Azure::SDKOperationDefinition diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 69fdb7de90f5..d6e95464b0c3 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -3,10 +3,14 @@ module Api module Azure class SDKTypeDefinition < Api::Object + attr_reader :id_portion + attr_reader :go_parameter_expression attr_reader :go_field_name def validate super + check_optional_property :id_portion + check_optional_property :go_parameter_expression check_optional_property :go_field_name end diff --git a/api/resource.rb b/api/resource.rb index dc18f0838a86..09762b31ff93 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -65,8 +65,6 @@ module Properties # Azure Specific Attributes attr_reader :azure_sdk_definition - attr_reader :azure_id_portion - attr_reader :azure_parameters_type end include Properties @@ -260,8 +258,6 @@ def validate check_optional_property :min_version, String check_property :azure_sdk_definition, Api::Azure::SDKDefinition - check_optional_property :azure_id_portion, String - check_optional_property :azure_parameters_type, String set_variables(@parameters, :__resource) set_variables(@properties, :__resource) diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 42be7c3f65d6..b443c2995eb0 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -87,7 +87,6 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} } - future, err := client.Create(ctx, resourceGroup, name, parameters) if err != nil { return fmt.Errorf("Error creating ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index ce3af02617ef..192624908c33 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -50,7 +50,6 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface } - if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { return fmt.Errorf("Error creating ResourceGroup: %+v", err) } diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown index 0e05fce26699..5f535d29e906 100644 --- a/build/azterraform/website/docs/r/container_registry.html.markdown +++ b/build/azterraform/website/docs/r/container_registry.html.markdown @@ -84,4 +84,4 @@ The following attributes are exported: ContainerRegistry can be imported using the `resource id`, e.g. ```shell -$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.ContainerRegistry/registries/example``` +$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.ContainerRegistry/TODO.ID_PORTION/example``` diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 9fdc08ec33fa..658b7c24024e 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -16,11 +16,19 @@ objects: base_url: NotUsedInAzure azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.ContainerRegistry create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Create async: true request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: resourceGroup + 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: registries + go_parameter_expression: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_parameter_expression: parameters go_type_name: Registry '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -47,8 +55,12 @@ objects: read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: name + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: resourceGroup + 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: registries + go_parameter_expression: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Registry @@ -79,7 +91,14 @@ objects: update: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Update request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: resourceGroup + 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: registries + go_parameter_expression: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_parameter_expression: parameters go_type_name: RegistryUpdateParameters '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -109,12 +128,12 @@ objects: go_func_name: Delete async: true request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: name - - - azure_id_portion: registries - azure_parameters_type: Registry + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: resourceGroup + 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: registries + go_parameter_expression: name description: | Manages a container registry on Azure. @@ -124,13 +143,13 @@ objects: description: 'Specifies the name of the Container Registry.' required: true input: true - azure_api_path: 'name' + azure_api_path: 'registryName' - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Container Registry.' required: true input: true - azure_api_path: 'rgname' + azure_api_path: 'resourceGroupName' - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'Specifies the supported Azure location where the resource exists.' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 8a43268afe8c..92c0982b9711 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -19,7 +19,11 @@ objects: create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_parameter_expression: parameters go_type_name: Group '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -29,7 +33,8 @@ objects: go_func_name: Get request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name + id_portion: resourceGroups + go_parameter_expression: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Group @@ -40,7 +45,11 @@ objects: update: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate request: + 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_parameter_expression: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_parameter_expression: parameters go_type_name: Group '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -51,9 +60,8 @@ objects: async: true request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - - azure_parameters_type: ResourceGroup + id_portion: resourceGroups + go_parameter_expression: name description: | Manages a resource group on Azure. diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml index aea746dc4888..58abe421fe1d 100644 --- a/products/azresourcegroup/terraform.yaml +++ b/products/azresourcegroup/terraform.yaml @@ -2,7 +2,6 @@ name: Arm overrides: !ruby/object:Provider::ResourceOverrides ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride - azure_parameters_type: Group example: - !ruby/object:Provider::Terraform::Examples name: "resource_group" diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 08a24135af65..ba1ea0d06163 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -47,6 +47,18 @@ def build_sdk_object_to_property(input, sdk_path, sdk_type_def, properties, sdk_ object: object end + def build_sdk_func_invocation(sdk_op_def) + compile_template 'templates/azure/terraform/sdk/function_invocation.erb', + sdk_op_def: sdk_op_def + end + + def build_azure_id_parser(sdk_op_def, object, indentation = 4) + compile_template 'templates/azure/terraform/sdk/azure_id_parser.erb', + indentation: indentation, + sdk_op_def: sdk_op_def, + object: object + end + end end end diff --git a/provider/terraform/resource_override.rb b/provider/terraform/resource_override.rb index 7b478d3a64e4..173213b66868 100644 --- a/provider/terraform/resource_override.rb +++ b/provider/terraform/resource_override.rb @@ -38,9 +38,6 @@ module OverrideProperties # New examples in documentation - will take the "examples" name when # old-style examples are gone. attr_reader :example - - # Azure Specific Properties - attr_reader :azure_parameters_type end # A class to control overridden properties on terraform.yaml in lieu of @@ -65,8 +62,6 @@ def validate check_optional_property :custom_code, Provider::Terraform::CustomCode check_optional_property :docs, Provider::Terraform::Docs - check_optional_property :azure_parameters_type, String - check_property :import_format, Array check_property_list :import_format, String end diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb new file mode 100644 index 000000000000..48d1bb0838d9 --- /dev/null +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -0,0 +1,8 @@ +id, err := parseAzureResourceID(d.Id()) +if err != nil { + return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) +} +<% sdk_op_def.request.reject {|k, v| v.id_portion.nil?}.each_value do |param| -%> +<%= param.go_parameter_expression -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> + +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdk/function_invocation.erb b/templates/azure/terraform/sdk/function_invocation.erb new file mode 100644 index 000000000000..e3ebbab45580 --- /dev/null +++ b/templates/azure/terraform/sdk/function_invocation.erb @@ -0,0 +1,3 @@ +<% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> +<% param_expressions = params.values.map {|v| v.go_parameter_expression} -%> +client.<%= sdk_op_def.go_func_name -%>(ctx, <%= param_expressions.join(", ") -%>) \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 3bc688d0f78b..23eceecd848d 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -83,20 +83,6 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(build_schema_property(prop, object, 12)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> -<% if has_project -%> - "project": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - }, -<% end -%> -<% if has_self_link -%> - "self_link": { - Type: schema.TypeString, - Computed: true, - }, -<% end -%> }, } } @@ -116,19 +102,13 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext <% settable_properties.each do |prop| -%> -<% output_var = (prop.name == "resourceGroupName" ? "resourceGroup" : prop.name.camelcase(:lower)) -%> +<% go_expr = object.azure_sdk_definition.create.request[prop.azure_api_path].go_parameter_expression -%> +<% output_var = go_expr.nil? ? prop.name.camelcase(:lower) : go_expr -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> <% sdk_type_def = object.azure_sdk_definition.create.request["/"] -%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> - -<% if object.custom_code.encoder -%> - obj, err = resource<%= resource_name -%>Encoder(d, meta, obj) - if err != nil { - return err - } -<% end -%> +<%= lines(build_property_to_sdk_object("#{sdk_type_def.go_parameter_expression} := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -140,11 +120,12 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% end -%> <% unless object.azure_sdk_definition.create.async -%> - if _, err := client.<%= object.azure_sdk_definition.create.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters); err != nil { + if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%>; err != nil { return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) } <% else -%> - future, err := client.<%= object.azure_sdk_definition.create.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%> + if err != nil { return fmt.Errorf("Error creating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -155,7 +136,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := client.<%= object.azure_sdk_definition.read.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> + if err != nil { return err } @@ -172,18 +154,11 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) ctx := meta.(*ArmClient).StopContext - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) - } -<% if azure_is_resource_group -%> - name := id.ResourceGroup -<% else -%> - resourceGroup := id.ResourceGroup - name := id.Path["<%= object.azure_id_portion -%>"] -<% end -%> +<%= build_azure_id_parser(object.azure_sdk_definition.read, object) -%> + + + resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> - resp, err := client.<%= object.azure_sdk_definition.read.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) @@ -226,16 +201,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) - } -<% if azure_is_resource_group -%> - name := id.ResourceGroup -<% else -%> - resourceGroup := id.ResourceGroup - name := id.Path["<%= object.azure_id_portion -%>"] -<% end -%> +<%= build_azure_id_parser(object.azure_sdk_definition.update, object) -%> + <% settable_properties.each do |prop| -%> <% if prop.name != "name" && prop.name != "resourceGroupName" && prop.name != "location" -%> @@ -250,7 +217,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res -%> <%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object.azure_sdk_definition.update.request, object)) -%> - future, err := client.<%= object.azure_sdk_definition.update.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name, parameters) + future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.update) -%> + if err != nil { return fmt.Errorf("Error updating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -276,21 +244,14 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) - } -<% if azure_is_resource_group -%> - name := id.ResourceGroup -<% else -%> - resourceGroup := id.ResourceGroup - name := id.Path["<%= object.azure_id_portion -%>"] -<% end -%> +<%= build_azure_id_parser(object.azure_sdk_definition.delete, object) -%> + <% unless object.azure_sdk_definition.delete.async -%> // TODO: Synced Delete Operation <% else -%> - future, err := client.<%= object.azure_sdk_definition.delete.go_func_name -%>(ctx<%= ", resourceGroup" unless azure_is_resource_group -%>, name) + future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%> + if err != nil { if response.WasNotFound(future.Response()) { return nil diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index fde3692f6bfa..b0c8635cd3b3 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -138,7 +138,7 @@ This resource provides the following <%= object.name -%> can be imported using the `resource id`, e.g. <% resource_id_postfix = "" - resource_id_postfix = "/#{object.__product.azure_namespace}/#{object.azure_id_portion}/example" unless object.name == "ResourceGroup" + resource_id_postfix = "/#{object.__product.azure_namespace}/TODO.ID_PORTION/example" unless object.name == "ResourceGroup" -%> ```shell $ terraform import azurerm_<%= resource_name -%>.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg<%= resource_id_postfix -%> From cc48b36b3ea9acaf5282b60e8c8ea3dd8aaa32db Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 18 Feb 2019 15:36:54 +0800 Subject: [PATCH 026/175] Refine terraform schema sort logic. --- .../azurerm/resource_arm_container_registry.go | 9 ++++++++- .../azurerm/resource_arm_resource_group.go | 4 +++- provider/azure/terraform.rb | 17 +++++++++++++++++ provider/terraform.rb | 6 ++---- templates/terraform/resource.erb | 7 ++++--- 5 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 provider/azure/terraform.rb diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index b443c2995eb0..28e5f2c12b01 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -29,29 +29,36 @@ func resourceArmContainerRegistry() *schema.Resource { Schema: map[string]*schema.Schema{ - "location": locationSchema(), "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, + "resource_group_name": resourceGroupNameSchema(), + + "location": locationSchema(), + "admin_enabled": { Type: schema.TypeBool, Optional: true, Default: false, }, + "sku": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice([]string{"Classic","Basic","Standard","Premium",""}, false), Default: "Classic", }, + "storage_account_id": { Type: schema.TypeString, Optional: true, }, + "tags": tagsSchema(), + "login_server": { Type: schema.TypeString, Computed: true, diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 192624908c33..5f5948bacf8e 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -29,8 +29,10 @@ func resourceArmResourceGroup() *schema.Resource { Schema: map[string]*schema.Schema{ - "location": locationSchema(), "name": resourceGroupNameSchema(), + + "location": locationSchema(), + "tags": tagsSchema(), }, } diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb new file mode 100644 index 000000000000..85b4ad4ca57d --- /dev/null +++ b/provider/azure/terraform.rb @@ -0,0 +1,17 @@ +require 'provider/azure/terraform/schema' +require 'provider/azure/terraform/sub_template' + +module Provider + module Azure + module Terraform + include Provider::Azure::Terraform::Schema + include Provider::Azure::Terraform::SubTemplate + + def order_azure_properties(properties) + special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} + other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} + special_props + order_properties(other_props) + end + end + end +end \ No newline at end of file diff --git a/provider/terraform.rb b/provider/terraform.rb index 97323784e75d..12ac429345c7 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -20,8 +20,7 @@ require 'provider/terraform/sub_template' require 'google/golang_utils' -require 'provider/azure/terraform/schema' -require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform' module Provider # Code generator for Terraform Resources that manage Google Cloud Platform @@ -31,8 +30,7 @@ class Terraform < Provider::AbstractCore include Provider::Terraform::SubTemplate include Google::GolangUtils - include Provider::Azure::Terraform::Schema - include Provider::Azure::Terraform::SubTemplate + include Provider::Azure::Terraform # Sorts properties in the order they should appear in the TF schema: # Required, Optional, Computed diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 23eceecd848d..ab2f02884eef 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -78,9 +78,10 @@ func resource<%= resource_name -%>() *schema.Resource { <% end -%> <%= lines(compile(object.custom_code.resource_definition)) if object.custom_code.resource_definition -%> - Schema: map[string]*schema.Schema{ -<% order_properties(properties).each do |prop| -%> -<%= lines(build_schema_property(prop, object, 12)) -%> + Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> +<% order_azure_properties(properties).each do |prop| -%> +<%= lines_before(build_schema_property(prop, object, 12)) -%> + <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> }, From 106c8811e00d4386007cc805dac4ae29039feda2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 19 Feb 2019 18:46:01 +0800 Subject: [PATCH 027/175] Introduce Azure Automation Variable resource. --- api/azure/sdk_type_definition.rb | 4 +- .../resource_arm_automation_variable.go | 156 ++++++++++++++++++ ..._arm_automation_variable_generated_test.go | 94 +++++++++++ .../docs/r/automation_variable.html.markdown | 83 ++++++++++ products/azautomationvariable/api.yaml | 138 ++++++++++++++++ products/azautomationvariable/terraform.yaml | 10 ++ products/azcontainerregistry/api.yaml | 20 +-- products/azresourcegroup/api.yaml | 12 +- provider/azure/terraform/sub_template.rb | 11 +- .../azure/terraform/sdk/azure_id_parser.erb | 2 +- .../terraform/sdk/function_invocation.erb | 4 +- .../terraform/sdk/parameters_schema_set.erb | 4 + .../sdktypes/sdkenum_to_property.erb | 2 +- .../sdktypes/sdkobject_to_property.erb | 7 +- .../sdktypes/sdkprimitive_to_property.erb | 2 +- templates/terraform/resource.erb | 34 +--- 16 files changed, 528 insertions(+), 55 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_automation_variable.go create mode 100644 build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go create mode 100644 build/azterraform/website/docs/r/automation_variable.html.markdown create mode 100644 products/azautomationvariable/api.yaml create mode 100644 products/azautomationvariable/terraform.yaml create mode 100644 templates/azure/terraform/sdk/parameters_schema_set.erb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index d6e95464b0c3..0043e814dd31 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -4,13 +4,13 @@ module Api module Azure class SDKTypeDefinition < Api::Object attr_reader :id_portion - attr_reader :go_parameter_expression + attr_reader :go_variable_name attr_reader :go_field_name def validate super check_optional_property :id_portion - check_optional_property :go_parameter_expression + check_optional_property :go_variable_name check_optional_property :go_field_name end diff --git a/build/azterraform/azurerm/resource_arm_automation_variable.go b/build/azterraform/azurerm/resource_arm_automation_variable.go new file mode 100644 index 000000000000..0280fd08e23d --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_automation_variable.go @@ -0,0 +1,156 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmAutomationVariable() *schema.Resource { + return &schema.Resource{ + Create: resourceArmAutomationVariableCreateUpdate, + Read: resourceArmAutomationVariableRead, + Update: resourceArmAutomationVariableCreateUpdate, + Delete: resourceArmAutomationVariableDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "automation_account_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "description": { + Type: schema.TypeString, + Optional: true, + }, + + "encrypted": { + Type: schema.TypeBool, + Optional: true, + }, + + "value": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceArmAutomationVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + accountName := d.Get("automation_account_name").(string) + description := d.Get("description").(string) + value := d.Get("value").(string) + encrypted := d.Get("encrypted").(bool) + + parameters := automation.VariableCreateOrUpdateParameters{ + VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ + Description: utils.String(description), + Value: utils.String(value), + IsEncrypted: utils.Bool(encrypted), + }, + } + + + if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { + return fmt.Errorf("Error creating AutomationVariable: %+v", err) + } + + + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + return err + } + if resp.ID == nil { + return fmt.Errorf("Cannot read AutomationVariable %q", name) + } + d.SetId(*resp.ID) + + return resourceArmAutomationVariableRead(d, meta) +} + +func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing AutomationVariable ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + accountName := id.Path["automationAccounts"] + name := id.Path["variables"] + + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] AutomationVariable %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading AutomationVariable: %+v", err) + } + + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("automation_account_name", accountName) + if properties := resp.VariableProperties; properties != nil { + d.Set("description", properties.Description) + d.Set("value", properties.Value) + d.Set("encrypted", properties.IsEncrypted) + } + + return nil +} + + +func resourceArmAutomationVariableDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing AutomationVariable ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + accountName := id.Path["automationAccounts"] + name := id.Path["variables"] + + if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { + return fmt.Errorf("Error deleting AutomationVariable %q: %+v", name, err) + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go b/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go new file mode 100644 index 000000000000..80b1d1a86292 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go @@ -0,0 +1,94 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" +) + + +func TestAccArmAutomationVariable_containerRegistryExample(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckArmAutomationVariableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccArmAutomationVariable_containerRegistryExample(acctest.RandString(10)), + }, + { + ResourceName: "google_arm_automation_variable.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccArmAutomationVariable_containerRegistryExample(val string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "example" { + name = "example-rg-%s" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} +`, val, + ) +} + + +func testAccCheckArmAutomationVariableDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "google_arm_automation_variable" { + continue + } + + config := testAccProvider.Meta().(*Config) + + url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") + if err != nil { + return err + } + + _, err = sendRequest(config, "GET", url, nil) + if err == nil { + return fmt.Errorf("ArmAutomationVariable still exists at %s", url) + } + } + + return nil +} diff --git a/build/azterraform/website/docs/r/automation_variable.html.markdown b/build/azterraform/website/docs/r/automation_variable.html.markdown new file mode 100644 index 000000000000..fc41b243505c --- /dev/null +++ b/build/azterraform/website/docs/r/automation_variable.html.markdown @@ -0,0 +1,83 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_automation_variable" +sidebar_current: "docs-azurerm-resource-automation-variable" +description: |- + Manages an automation variable on Azure. +--- + +# azurerm_automation_variable + +Manages an automation variable on Azure. + + + +## Example Usage - Container Registry + + +```hcl +resource "azurerm_resource_group" "example" { + name = "example-rg" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the Automation Variable. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which to create the Automation Variable. Changing this forces a new resource to be created. + +* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. Changing this forces a new resource to be created. + +* `description` - (Optional) The description of the Automation Variable. + +* `value` - (Optional) The value of the Automation Variable. + +* `encrypted` - (Optional) The encrypted flag of the Automation Variable. + +## Attributes Reference + +The following attributes are exported: + +* `id` - The automation variable ID. + + + +## Import + +AutomationVariable can be imported using the `resource id`, e.g. +```shell +$ terraform import azurerm_automation_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.Automation/TODO.ID_PORTION/example``` diff --git a/products/azautomationvariable/api.yaml b/products/azautomationvariable/api.yaml new file mode 100644 index 000000000000..e9b1dc89077c --- /dev/null +++ b/products/azautomationvariable/api.yaml @@ -0,0 +1,138 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: arm +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + update: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_api_path: 'variableName' + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_api_path: 'resourceGroupName' + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_api_path: 'automationAccountName' + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_api_path: '/properties/description' + - !ruby/object:Api::Type::String + name: 'value' + description: 'The value of the Automation Variable.' + azure_api_path: '/properties/value' + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'The encrypted flag of the Automation Variable.' + azure_api_path: '/properties/isEncrypted' diff --git a/products/azautomationvariable/terraform.yaml b/products/azautomationvariable/terraform.yaml new file mode 100644 index 000000000000..3bf4a5fcdaac --- /dev/null +++ b/products/azautomationvariable/terraform.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Terraform::Config +name: Arm +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Terraform::ResourceOverride + example: + - !ruby/object:Provider::Terraform::Examples + name: "container_registry" + primary_resource_id: "example" + vars: + rg_name: "example-rg" diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 658b7c24024e..d6c48827bd12 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -23,12 +23,12 @@ objects: request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: resourceGroup + go_variable_name: resourceGroup 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: registries - go_parameter_expression: name + go_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_parameter_expression: parameters + go_variable_name: parameters go_type_name: Registry '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -57,10 +57,10 @@ objects: request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: resourceGroup + go_variable_name: resourceGroup 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: registries - go_parameter_expression: name + go_variable_name: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Registry @@ -93,12 +93,12 @@ objects: request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: resourceGroup + go_variable_name: resourceGroup 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: registries - go_parameter_expression: name + go_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_parameter_expression: parameters + go_variable_name: parameters go_type_name: RegistryUpdateParameters '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -130,10 +130,10 @@ objects: request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: resourceGroup + go_variable_name: resourceGroup 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: registries - go_parameter_expression: name + go_variable_name: name description: | Manages a container registry on Azure. diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 92c0982b9711..df5f214faae6 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -21,9 +21,9 @@ objects: request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: name + go_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_parameter_expression: parameters + go_variable_name: parameters go_type_name: Group '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -34,7 +34,7 @@ objects: request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: name + go_variable_name: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Group @@ -47,9 +47,9 @@ objects: request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: name + go_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_parameter_expression: parameters + go_variable_name: parameters go_type_name: Group '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location @@ -61,7 +61,7 @@ objects: request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups - go_parameter_expression: name + go_variable_name: name description: | Manages a resource group on Azure. diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index ba1ea0d06163..67dc638b26c0 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -13,14 +13,13 @@ def build_schema_property_get(input, output, property, object, indentation = 0) object: object end - def build_schema_property_set(input, output, property, object, indentation = 0) + def build_schema_property_set(input, output, property, indentation = 0) compile_template schema_property_set_template(property), indentation: indentation, input_var: input, output_var: output, prop_name: property.name.underscore, - property: property, - object: object + property: property end def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, resource_name, properties, sdk_type_defs, object, indentation = 4) @@ -59,6 +58,12 @@ def build_azure_id_parser(sdk_op_def, object, indentation = 4) object: object end + def build_parameters_schema_property_set(sdk_op_def, properties, indentation = 4) + compile_template 'templates/azure/terraform/sdk/parameters_schema_set.erb', + indentation: indentation, + sdk_op_def: sdk_op_def, + properties: properties + end end end end diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb index 48d1bb0838d9..8f524f7383e7 100644 --- a/templates/azure/terraform/sdk/azure_id_parser.erb +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -3,6 +3,6 @@ if err != nil { return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) } <% sdk_op_def.request.reject {|k, v| v.id_portion.nil?}.each_value do |param| -%> -<%= param.go_parameter_expression -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> +<%= param.go_variable_name -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdk/function_invocation.erb b/templates/azure/terraform/sdk/function_invocation.erb index e3ebbab45580..16064fe23918 100644 --- a/templates/azure/terraform/sdk/function_invocation.erb +++ b/templates/azure/terraform/sdk/function_invocation.erb @@ -1,3 +1,3 @@ <% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> -<% param_expressions = params.values.map {|v| v.go_parameter_expression} -%> -client.<%= sdk_op_def.go_func_name -%>(ctx, <%= param_expressions.join(", ") -%>) \ No newline at end of file +<% param_vars = params.values.map {|v| v.go_variable_name} -%> +client.<%= sdk_op_def.go_func_name -%>(ctx, <%= param_vars.join(", ") -%>) \ No newline at end of file diff --git a/templates/azure/terraform/sdk/parameters_schema_set.erb b/templates/azure/terraform/sdk/parameters_schema_set.erb new file mode 100644 index 000000000000..a48231905461 --- /dev/null +++ b/templates/azure/terraform/sdk/parameters_schema_set.erb @@ -0,0 +1,4 @@ +<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) }.each do |prop| -%> +<% var_name = sdk_op_def.request[prop.azure_api_path].go_variable_name -%> +<%= lines(build_schema_property_set(var_name == "name" ? "resp.Name" : var_name, "d", prop)) -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb index 4daf84ccd46d..8a9a1e7cc1ed 100644 --- a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb @@ -1,3 +1,3 @@ <% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> <% input_var = "string(" + input_statement + "." + sdk_type_def.go_field_name + ")" -%> -<%= lines(build_schema_property_set(input_var, 'd', property, object)) -%> \ No newline at end of file +<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 9dc125ad7777..5fc26b93988e 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -1,12 +1,15 @@ <% - temp_var_name = (sdk_obj_path == "/" ? input_statement : sdk_type_def.go_field_name.camelcase(:lower)) + temp_var_name = input_statement + if sdk_obj_path != "/" + temp_var_name = sdk_type_def.go_variable_name || sdk_type_def.go_field_name.camelcase(:lower) + end -%> <% if sdk_obj_path != "/" -%> if <%= temp_var_name -%> := <%= input_statement -%>.<%= sdk_type_def.go_field_name -%>; <%= temp_var_name -%> != nil { <% end -%> <% one_level_props = Hash.new - properties.select { |p| p.azure_api_path.start_with?(sdk_obj_path) }.each do |prop| + properties.select{|p| p.azure_api_path.start_with?(sdk_obj_path)}.each do |prop| prop_key = prop.azure_api_path[sdk_obj_path.length..-1].split("/")[0] prop_list = one_level_props[prop_key] || Array.new one_level_props[prop_key] = prop_list << prop diff --git a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb index d6900f4753b8..79d9495e2a35 100644 --- a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb @@ -1,3 +1,3 @@ <% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> <% input_var = input_statement + "." + sdk_type_def.go_field_name -%> -<%= lines(build_schema_property_set(input_var, 'd', property, object)) -%> \ No newline at end of file +<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index ab2f02884eef..9f10468b4951 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -35,7 +35,6 @@ package azurerm has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> <% - azure_is_resource_group = object.name == "ResourceGroup" azure_client_name = "#{object.api_name}Client".camelcase(:lower) sdk_package = azure_resource_go_package(object.__product) -%> @@ -103,13 +102,13 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext <% settable_properties.each do |prop| -%> -<% go_expr = object.azure_sdk_definition.create.request[prop.azure_api_path].go_parameter_expression -%> -<% output_var = go_expr.nil? ? prop.name.camelcase(:lower) : go_expr -%> +<% var_name = object.azure_sdk_definition.create.request[prop.azure_api_path].go_variable_name -%> +<% output_var = var_name.nil? ? prop.name.camelcase(:lower) : var_name -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> <% sdk_type_def = object.azure_sdk_definition.create.request["/"] -%> -<%= lines(build_property_to_sdk_object("#{sdk_type_def.go_parameter_expression} := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> +<%= lines(build_property_to_sdk_object("#{sdk_type_def.go_variable_name} := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -186,10 +185,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% end -%> - d.Set("name", resp.Name) -<% if !azure_is_resource_group -%> - d.Set("resource_group_name", resourceGroup) -<% end -%> +<%= lines(build_parameters_schema_property_set(object.azure_sdk_definition.read, properties)) -%> <% sdk_type_def = object.azure_sdk_definition.read.response["/"] -%> <%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object.azure_sdk_definition.read.response, object)) -%> @@ -249,7 +245,9 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% unless object.azure_sdk_definition.delete.async -%> - // TODO: Synced Delete Operation + if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%>; err != nil { + return fmt.Errorf("Error deleting <%= object.name -%> %q: %+v", name, err) + } <% else -%> future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%> @@ -269,21 +267,3 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ return nil } - -<% if object.custom_code.encoder -%> -func resource<%= resource_name -%>Encoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.encoder)) -%> -} -<% end -%> - -<% if object.custom_code.update_encoder-%> -func resource<%= resource_name -%>UpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.update_encoder)) -%> -} -<% end -%> - -<% if object.custom_code.decoder -%> -func resource<%= resource_name -%>Decoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { -<%= lines(compile(object.custom_code.decoder)) -%> -} -<% end -%> From 163d21547719f7b1ff6e82a769b8d455e6b7c220 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 20 Feb 2019 16:52:31 +0800 Subject: [PATCH 028/175] Implement AccTestCheckExist/Destroy. --- .../resource_arm_automation_variable.go | 16 +-- ..._arm_automation_variable_generated_test.go | 94 ------------- .../resource_arm_automation_variable_test.go | 129 ++++++++++++++++++ .../resource_arm_container_registry.go | 24 ++-- ...> resource_arm_container_registry_test.go} | 0 .../azurerm/resource_arm_resource_group.go | 16 +-- ...go => resource_arm_resource_group_test.go} | 0 provider/azure/terraform.rb | 2 + .../azure/terraform/acctest/sub_template.rb | 20 +++ provider/azure/terraform/sub_template.rb | 10 ++ provider/terraform.rb | 2 +- .../acctest/parameters_from_schema.erb | 11 ++ .../azure/terraform/sdk/azure_id_parser.erb | 2 +- .../sdk/errorf_with_resource_name.erb | 19 +++ .../terraform/sdk/function_invocation.erb | 2 +- .../examples/base_configs/test_file.go.erb | 77 +++++++---- templates/terraform/resource.erb | 35 +++-- 17 files changed, 298 insertions(+), 161 deletions(-) delete mode 100644 build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go create mode 100644 build/azterraform/azurerm/resource_arm_automation_variable_test.go rename build/azterraform/azurerm/{resource_arm_container_registry_generated_test.go => resource_arm_container_registry_test.go} (100%) rename build/azterraform/azurerm/{resource_arm_resource_group_generated_test.go => resource_arm_resource_group_test.go} (100%) create mode 100644 provider/azure/terraform/acctest/sub_template.rb create mode 100644 templates/azure/terraform/acctest/parameters_from_schema.erb create mode 100644 templates/azure/terraform/sdk/errorf_with_resource_name.erb diff --git a/build/azterraform/azurerm/resource_arm_automation_variable.go b/build/azterraform/azurerm/resource_arm_automation_variable.go index 0280fd08e23d..08070162994d 100644 --- a/build/azterraform/azurerm/resource_arm_automation_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_variable.go @@ -82,16 +82,16 @@ func resourceArmAutomationVariableCreateUpdate(d *schema.ResourceData, meta inte if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { - return fmt.Errorf("Error creating AutomationVariable: %+v", err) + return fmt.Errorf("Error creating Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } resp, err := client.Get(ctx, resourceGroup, accountName, name) if err != nil { - return err + return fmt.Errorf("Error retrieving Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read AutomationVariable %q", name) + return fmt.Errorf("Cannot read Automation Variable %q (Resource Group %q, Automation Account Name %q) ID", name, resourceGroup, accountName) } d.SetId(*resp.ID) @@ -104,7 +104,7 @@ func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing AutomationVariable ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Automation Variable ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] @@ -113,11 +113,11 @@ func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) resp, err := client.Get(ctx, resourceGroup, accountName, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] AutomationVariable %q does not exist - removing from state", d.Id()) + log.Printf("[INFO] Automation Variable %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading AutomationVariable: %+v", err) + return fmt.Errorf("Error reading Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } @@ -142,14 +142,14 @@ func resourceArmAutomationVariableDelete(d *schema.ResourceData, meta interface{ id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing AutomationVariable ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Automation Variable ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] name := id.Path["variables"] if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { - return fmt.Errorf("Error deleting AutomationVariable %q: %+v", name, err) + return fmt.Errorf("Error deleting Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go b/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go deleted file mode 100644 index 80b1d1a86292..000000000000 --- a/build/azterraform/azurerm/resource_arm_automation_variable_generated_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" -) - - -func TestAccArmAutomationVariable_containerRegistryExample(t *testing.T) { - t.Parallel() - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckArmAutomationVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccArmAutomationVariable_containerRegistryExample(acctest.RandString(10)), - }, - { - ResourceName: "google_arm_automation_variable.example", - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func testAccArmAutomationVariable_containerRegistryExample(val string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "example" { - name = "example-rg-%s" - location = "West US" -} - -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" -} - -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" -} -`, val, - ) -} - - -func testAccCheckArmAutomationVariableDestroy(s *terraform.State) error { - for _, rs := range s.RootModule().Resources { - if rs.Type != "google_arm_automation_variable" { - continue - } - - config := testAccProvider.Meta().(*Config) - - url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") - if err != nil { - return err - } - - _, err = sendRequest(config, "GET", url, nil) - if err == nil { - return fmt.Errorf("ArmAutomationVariable still exists at %s", url) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_automation_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_variable_test.go new file mode 100644 index 000000000000..5f354df900bf --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_automation_variable_test.go @@ -0,0 +1,129 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func TestAccAzureRMAutomationVariable_containerRegistryExample(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAzureRMAutomationVariableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAutomationVariable_containerRegistryExample(acctest.RandString(10)), + }, + { + ResourceName: "azurerm_automation_variable.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccAzureRMAutomationVariable_containerRegistryExample(val string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "example" { + name = "example-rg-%s" + location = "West US" +} + +resource "azurerm_storage_account" "example" { + name = "tfexamplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + account_tier = "Standard" + account_replication_type = "GRS" +} + +resource "azurerm_container_registry" "example" { + name = "tf-example-acr" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + admin_enabled = true + sku = "Classic" + storage_account_id = "${azurerm_storage_account.example.id}" +} +`, val, + ) +} + + +func testCheckAzureRMAutomationVariableExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Automation Variable not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] + if !hasResourceGroup { + return fmt.Errorf("Bad: no resource group name found in state for Automation Variable: %q", name) + } + accountName, hasAccountName := rs.Primary.Attributes["automation_account_name"] + if !hasAccountName { + return fmt.Errorf("Bad: no automation account name found in state for Automation Variable: %q", name) + } + + client := testAccProvider.Meta().(*ArmClient).automationVariableClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Automation Variable %q (Resource Group %q, Automation Account Name %q) does not exist", name, resourceGroup, accountName) + } + return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMAutomationVariableDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).automationVariableClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_automation_variable" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + accountName := rs.Primary.Attributes["automation_account_name"] + + if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return err + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 28e5f2c12b01..267250f0b034 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -96,10 +96,10 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} future, err := client.Create(ctx, resourceGroup, name, parameters) if err != nil { - return fmt.Errorf("Error creating ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error creating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error waiting for creation of Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -108,7 +108,7 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} return err } if resp.ID == nil { - return fmt.Errorf("Cannot read ContainerRegistry %q", name) + return fmt.Errorf("Cannot read Container Registry %q", name) } d.SetId(*resp.ID) @@ -121,7 +121,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup name := id.Path["registries"] @@ -129,11 +129,11 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) resp, err := client.Get(ctx, resourceGroup, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] ContainerRegistry %q does not exist - removing from state", d.Id()) + log.Printf("[INFO] Container Registry %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading ContainerRegistry: %+v", err) + return fmt.Errorf("Error reading Container Registry: %+v", err) } @@ -164,7 +164,7 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup name := id.Path["registries"] @@ -189,10 +189,10 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} future, err := client.Update(ctx, resourceGroup, name, parameters) if err != nil { - return fmt.Errorf("Error updating ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error updating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for update of ContainerRegistry %q (Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error waiting for update of Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } return resourceArmContainerRegistryRead(d, meta) @@ -205,7 +205,7 @@ func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{} id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing ContainerRegistry ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup name := id.Path["registries"] @@ -215,12 +215,12 @@ func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{} if response.WasNotFound(future.Response()) { return nil } - return fmt.Errorf("Error deleting ContainerRegistry %q: %+v", name, err) + return fmt.Errorf("Error deleting Container Registry %q: %+v", name, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting ContainerRegistry %q: %+v", name, err) + return fmt.Errorf("Error waiting for deleting Container Registry %q: %+v", name, err) } } diff --git a/build/azterraform/azurerm/resource_arm_container_registry_generated_test.go b/build/azterraform/azurerm/resource_arm_container_registry_test.go similarity index 100% rename from build/azterraform/azurerm/resource_arm_container_registry_generated_test.go rename to build/azterraform/azurerm/resource_arm_container_registry_test.go diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 5f5948bacf8e..268201cc00d6 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -53,7 +53,7 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { - return fmt.Errorf("Error creating ResourceGroup: %+v", err) + return fmt.Errorf("Error creating Resource Group: %+v", err) } @@ -62,7 +62,7 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface return err } if resp.ID == nil { - return fmt.Errorf("Cannot read ResourceGroup %q", name) + return fmt.Errorf("Cannot read Resource Group %q", name) } d.SetId(*resp.ID) @@ -75,18 +75,18 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Resource Group ID %q: %+v", d.Id(), err) } name := id.ResourceGroup resp, err := client.Get(ctx, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] ResourceGroup %q does not exist - removing from state", d.Id()) + log.Printf("[INFO] Resource Group %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading ResourceGroup: %+v", err) + return fmt.Errorf("Error reading Resource Group: %+v", err) } @@ -108,7 +108,7 @@ func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) er id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing ResourceGroup ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Resource Group ID %q: %+v", d.Id(), err) } name := id.ResourceGroup @@ -117,12 +117,12 @@ func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) er if response.WasNotFound(future.Response()) { return nil } - return fmt.Errorf("Error deleting ResourceGroup %q: %+v", name, err) + return fmt.Errorf("Error deleting Resource Group %q: %+v", name, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting ResourceGroup %q: %+v", name, err) + return fmt.Errorf("Error waiting for deleting Resource Group %q: %+v", name, err) } } diff --git a/build/azterraform/azurerm/resource_arm_resource_group_generated_test.go b/build/azterraform/azurerm/resource_arm_resource_group_test.go similarity index 100% rename from build/azterraform/azurerm/resource_arm_resource_group_generated_test.go rename to build/azterraform/azurerm/resource_arm_resource_group_test.go diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 85b4ad4ca57d..6ef659885aa3 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,11 +1,13 @@ require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform/acctest/sub_template' module Provider module Azure module Terraform include Provider::Azure::Terraform::Schema include Provider::Azure::Terraform::SubTemplate + include Provider::Azure::Terraform::AccTest::SubTemplate def order_azure_properties(properties) special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb new file mode 100644 index 000000000000..de1ba196e8cc --- /dev/null +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -0,0 +1,20 @@ +module Provider + module Azure + module Terraform + module AccTest + module SubTemplate + + def build_acctest_parameters_from_schema(sdk_op_def, properties, object, check_existence = false, indentation = 4) + compile_template 'templates/azure/terraform/acctest/parameters_from_schema.erb', + indentation: indentation, + sdk_op_def: sdk_op_def, + check_existence: check_existence, + properties: properties, + object: object + end + + end + end + end + end +end diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 67dc638b26c0..0e25d520f971 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -64,6 +64,16 @@ def build_parameters_schema_property_set(sdk_op_def, properties, indentation = 4 sdk_op_def: sdk_op_def, properties: properties end + + def build_errorf_with_resource_name(format_string, include_error, sdk_op_def, properties, object) + compile_template 'templates/azure/terraform/sdk/errorf_with_resource_name.erb', + format_string: format_string, + include_error: include_error, + sdk_op_def: sdk_op_def, + properties: properties, + object: object + end + end end end diff --git a/provider/terraform.rb b/provider/terraform.rb index 12ac429345c7..e8e1812d38ed 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -171,7 +171,7 @@ def generate_resource_tests(data) filepath = File.join( target_folder, - "resource_#{product_name}_#{name}_generated_test.go" + "resource_#{product_name}_#{name}_test.go" ) generate_resource_file data.clone.merge( product: data[:product_name].camelize(:upper), diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb new file mode 100644 index 000000000000..e56bfe329a0e --- /dev/null +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -0,0 +1,11 @@ +<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) }.each do |prop| -%> +<% var_name = sdk_op_def.request[prop.azure_api_path].go_variable_name -%> +<% if check_existence && var_name != "name" -%> +<%= var_name -%>, has<%= var_name.camelcase(:upper) -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] +if !has<%= var_name.camelcase(:upper) -%> { + return fmt.Errorf("Bad: no <%= prop.name.titlecase.downcase -%> found in state for <%= object.name.titlecase -%>: %q", name) +} +<% else -%> +<%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb index 8f524f7383e7..36f8021b37a3 100644 --- a/templates/azure/terraform/sdk/azure_id_parser.erb +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -1,6 +1,6 @@ id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing <%= object.name -%> ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing <%= object.name.titlecase -%> ID %q: %+v", d.Id(), err) } <% sdk_op_def.request.reject {|k, v| v.id_portion.nil?}.each_value do |param| -%> <%= param.go_variable_name -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb new file mode 100644 index 000000000000..64d442df9835 --- /dev/null +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -0,0 +1,19 @@ +<% + res_name = "" + depends = [] + param_vars = [] + properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) && !p.azure_api_path.start_with?("/") }.each do |prop| + param = sdk_op_def.request[prop.azure_api_path] + param_vars += [param.go_variable_name] + case prop.name + when "name" + res_name = "#{object.name.titlecase} %q" + when "resourceGroupName" + depends += ["Resource Group %q"] + else + depends += ["#{prop.name.titlecase} %q"] + end + end + res_name += " (#{depends.join(', ')})" unless depends.empty? +-%> +fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= param_vars.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file diff --git a/templates/azure/terraform/sdk/function_invocation.erb b/templates/azure/terraform/sdk/function_invocation.erb index 16064fe23918..b55101485c4a 100644 --- a/templates/azure/terraform/sdk/function_invocation.erb +++ b/templates/azure/terraform/sdk/function_invocation.erb @@ -1,3 +1,3 @@ <% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> -<% param_vars = params.values.map {|v| v.go_variable_name} -%> +<% param_vars = params.values.map{|v| v.go_variable_name} -%> client.<%= sdk_op_def.go_func_name -%>(ctx, <%= param_vars.join(", ") -%>) \ No newline at end of file diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 6b6b3cd24595..66dfa0c1a28f 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -3,18 +3,20 @@ package azurerm import ( - "fmt" - "testing" + "fmt" + "testing" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) <% - api_name = @config.name || product_ns - resource_name = api_name + object.name - terraform_name = "google_" + resource_name.underscore + resource_name = "AzureRM" + object.name + terraform_name = "azurerm_" + object.name.underscore + azure_client_name = "#{object.api_name}Client".camelcase(:lower) + properties = object.all_user_properties %> -<% object.example.reject(&:skip_test).each do |example| -%> +<% object.example.reject(&:skip_test).each do |example| -%> <% # {Compute}{Address}_{addressBasic} test_slug = "#{resource_name}_#{example.name.camelize(:lower)}Example" @@ -52,24 +54,51 @@ func testAcc<%= test_slug -%>(val string) string { } <%- end %> -func testAccCheck<%= resource_name -%>Destroy(s *terraform.State) error { - for _, rs := range s.RootModule().Resources { - if rs.Type != "<%= terraform_name -%>" { - continue - } +func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("<%= object.name.titlecase -%> not found: %s", resourceName) + } - config := testAccProvider.Meta().(*Config) +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object, true, 8)) -%> - url, err := replaceVarsForTest(rs, "<%= build_url(object.self_link_url) -%>") - if err != nil { - return err - } + client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> - _, err = sendRequest(config, "GET", url, nil) - if err == nil { - return fmt.Errorf("<%= resource_name -%> still exists at %s", url) - } - } + ctx := testAccProvider.Meta().(*ArmClient).StopContext - return nil + if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return <%= build_errorf_with_resource_name("Bad: %s does not exist", false, object.azure_sdk_definition.delete, properties, object) -%> + + } + return fmt.Errorf("Bad: Get on <%= azure_client_name -%>: %+v", err) + } + + return nil + } +} + +func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> + + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "<%= terraform_name -%>" { + continue + } + +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object)) -%> + + if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return err + } + } + + return nil + } + + return nil } diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 9f10468b4951..5fbae378c093 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -121,16 +121,19 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% unless object.azure_sdk_definition.create.async -%> if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%>; err != nil { - return fmt.Errorf("Error creating <%= object.name -%>: %+v", err) + return <%= build_errorf_with_resource_name("Error creating %s", true, object.azure_sdk_definition.create, properties, object) -%> + } <% else -%> future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%> if err != nil { - return fmt.Errorf("Error creating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + return <%= build_errorf_with_resource_name("Error creating %s", true, object.azure_sdk_definition.create, properties, object) -%> + } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + return <%= build_errorf_with_resource_name("Error waiting for creation of %s", true, object.azure_sdk_definition.create, properties, object) -%> + } <% end -%> @@ -139,10 +142,12 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> if err != nil { - return err + return <%= build_errorf_with_resource_name("Error retrieving %s", true, object.azure_sdk_definition.create, properties, object) -%> + } if resp.ID == nil { - return fmt.Errorf("Cannot read <%= object.name -%> %q", name) + return <%= build_errorf_with_resource_name("Cannot read %s ID", false, object.azure_sdk_definition.create, properties, object) -%> + } d.SetId(*resp.ID) @@ -161,11 +166,12 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] <%= object.name -%> %q does not exist - removing from state", d.Id()) + log.Printf("[INFO] <%= object.name.titlecase -%> %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading <%= object.name -%>: %+v", err) + return <%= build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, properties, object) -%> + } <% unless object.self_link_query.nil? -%> @@ -217,10 +223,12 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.update) -%> if err != nil { - return fmt.Errorf("Error updating <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + return <%= build_errorf_with_resource_name("Error updating %s", true, object.azure_sdk_definition.update, properties, object) -%> + } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for update of <%= object.name -%> %q (Resource Group %q): %+v", name, resourceGroup, err) + return <%= build_errorf_with_resource_name("Error waiting for update of %s", true, object.azure_sdk_definition.update, properties, object) -%> + } return resource<%= resource_name -%>Read(d, meta) @@ -246,7 +254,8 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% unless object.azure_sdk_definition.delete.async -%> if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%>; err != nil { - return fmt.Errorf("Error deleting <%= object.name -%> %q: %+v", name, err) + return <%= build_errorf_with_resource_name("Error deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> + } <% else -%> future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%> @@ -255,12 +264,14 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ if response.WasNotFound(future.Response()) { return nil } - return fmt.Errorf("Error deleting <%= object.name -%> %q: %+v", name, err) + return <%= build_errorf_with_resource_name("Error deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> + } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting <%= object.name -%> %q: %+v", name, err) + return <%= build_errorf_with_resource_name("Error waiting for deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> + } } <% end -%> From 36989ee86caa3a6584136eefb5e60fe6a44f250d Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 22 Feb 2019 22:56:22 +0800 Subject: [PATCH 029/175] Implement AccTest for Terraform resources. --- .../resource_arm_automation_variable.go | 1 + .../resource_arm_automation_variable_test.go | 159 ++++++++++++------ .../resource_arm_container_registry.go | 10 +- .../resource_arm_container_registry_test.go | 105 +++++------- .../azurerm/resource_arm_resource_group.go | 8 +- .../resource_arm_resource_group_test.go | 89 +++++----- .../docs/r/automation_variable.html.markdown | 2 +- products/azautomationvariable/api.yaml | 1 + products/azautomationvariable/terraform.yaml | 42 ++++- .../azure/terraform/acctest/sub_template.rb | 15 +- provider/azure/terraform/resource_override.rb | 131 +++++++++++++++ provider/terraform.rb | 1 + .../terraform/acctest/dependencies_hcl.erb | 5 + .../terraform/acctest/resource_test_hcl.erb | 20 +++ .../examples/base_configs/test_file.go.erb | 109 ++++++++---- 15 files changed, 491 insertions(+), 207 deletions(-) create mode 100644 provider/azure/terraform/resource_override.rb create mode 100644 templates/azure/terraform/acctest/dependencies_hcl.erb create mode 100644 templates/azure/terraform/acctest/resource_test_hcl.erb diff --git a/build/azterraform/azurerm/resource_arm_automation_variable.go b/build/azterraform/azurerm/resource_arm_automation_variable.go index 08070162994d..9e4bf504b431 100644 --- a/build/azterraform/azurerm/resource_arm_automation_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_variable.go @@ -51,6 +51,7 @@ func resourceArmAutomationVariable() *schema.Resource { "encrypted": { Type: schema.TypeBool, Optional: true, + Default: false, }, "value": { diff --git a/build/azterraform/azurerm/resource_arm_automation_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_variable_test.go index 5f354df900bf..edd97753f271 100644 --- a/build/azterraform/azurerm/resource_arm_automation_variable_test.go +++ b/build/azterraform/azurerm/resource_arm_automation_variable_test.go @@ -18,57 +18,65 @@ import ( "fmt" "testing" - "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) - -func TestAccAzureRMAutomationVariable_containerRegistryExample(t *testing.T) { - t.Parallel() - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckAzureRMAutomationVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationVariable_containerRegistryExample(acctest.RandString(10)), - }, - { - ResourceName: "azurerm_automation_variable.example", - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func testAccAzureRMAutomationVariable_containerRegistryExample(val string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "example" { - name = "example-rg-%s" - location = "West US" +func TestAccAzureRMAutomationVariable_basic(t *testing.T) { + resourceName := "azurerm_automation_variable.test" + rInt := tf.AccRandTimeInt() + location := testLocation() + config := testAccAzureRMAutomationVariable_basic(rInt, location) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationVariableDestroy, + Steps: []resource.TestStep{ + { + Config: config, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) } -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" -} - -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" -} -`, val, - ) +func TestAccAzureRMAutomationVariable_complete(t *testing.T) { + resourceName := "azurerm_automation_variable.test" + rInt := tf.AccRandTimeInt() + location := testLocation() + config := testAccAzureRMAutomationVariable_complete(rInt, location) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationVariableDestroy, + Steps: []resource.TestStep{ + { + Config: config, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "description", "This is a variable created by Terraform acceptance test."), + resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) } @@ -112,13 +120,13 @@ func testCheckAzureRMAutomationVariableDestroy(s *terraform.State) error { continue } - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - accountName := rs.Primary.Attributes["automation_account_name"] + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + accountName := rs.Primary.Attributes["automation_account_name"] if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return err + return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) } } @@ -127,3 +135,56 @@ func testCheckAzureRMAutomationVariableDestroy(s *terraform.State) error { return nil } + +func testAccAzureRMAutomationVariable_basic(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_automation_account" "test" { + name = "acctestAutoAcct-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + + sku { + name = "Basic" + } +} + +"azurerm_automation_variable" "test" { + name = "acctestAutoVar-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + automation_account_name = "${azurerm_automation_account.test.name}" + value = "Hello, Terraform Basic Test." +} +`, rInt, location, rInt, rInt) +} + +func testAccAzureRMAutomationVariable_complete(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_automation_account" "test" { + name = "acctestAutoAcct-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + + sku { + name = "Basic" + } +} + +"azurerm_automation_variable" "test" { + name = "acctestAutoVar-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + automation_account_name = "${azurerm_automation_account.test.name}" + description = "This is a variable created by Terraform acceptance test." + value = "Hello, Terraform Complete Test." +} +`, rInt, location, rInt, rInt) +} diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 267250f0b034..932e499a0662 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -105,10 +105,10 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} resp, err := client.Get(ctx, resourceGroup, name) if err != nil { - return err + return fmt.Errorf("Error retrieving Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Container Registry %q", name) + return fmt.Errorf("Cannot read Container Registry %q (Resource Group %q) ID", name, resourceGroup) } d.SetId(*resp.ID) @@ -133,7 +133,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) d.SetId("") return nil } - return fmt.Errorf("Error reading Container Registry: %+v", err) + return fmt.Errorf("Error reading Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } @@ -215,12 +215,12 @@ func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{} if response.WasNotFound(future.Response()) { return nil } - return fmt.Errorf("Error deleting Container Registry %q: %+v", name, err) + return fmt.Errorf("Error deleting Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Container Registry %q: %+v", name, err) + return fmt.Errorf("Error waiting for deleting Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } } diff --git a/build/azterraform/azurerm/resource_arm_container_registry_test.go b/build/azterraform/azurerm/resource_arm_container_registry_test.go index aa21ab9429e3..d30cf034c8fe 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry_test.go +++ b/build/azterraform/azurerm/resource_arm_container_registry_test.go @@ -15,80 +15,63 @@ package azurerm import ( - "fmt" - "testing" + "fmt" + "testing" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func TestAccArmContainerRegistry_containerRegistryExample(t *testing.T) { - t.Parallel() +func testCheckAzureRMContainerRegistryExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Container Registry not found: %s", resourceName) + } - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckArmContainerRegistryDestroy, - Steps: []resource.TestStep{ - { - Config: testAccArmContainerRegistry_containerRegistryExample(acctest.RandString(10)), - }, - { - ResourceName: "google_arm_container_registry.example", - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} + name := rs.Primary.Attributes["name"] + resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] + if !hasResourceGroup { + return fmt.Errorf("Bad: no resource group name found in state for Container Registry: %q", name) + } -func testAccArmContainerRegistry_containerRegistryExample(val string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "example" { - name = "example-rg-%s" - location = "West US" -} + client := testAccProvider.Meta().(*ArmClient).containerRegistryClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" -} + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Container Registry %q (Resource Group %q) does not exist", name, resourceGroup) + } + return fmt.Errorf("Bad: Get on containerRegistryClient: %+v", err) + } -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" -} -`, val, - ) + return nil + } } +func testCheckAzureRMContainerRegistryDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).containerRegistryClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext -func testAccCheckArmContainerRegistryDestroy(s *terraform.State) error { - for _, rs := range s.RootModule().Resources { - if rs.Type != "google_arm_container_registry" { - continue - } + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_container_registry" { + continue + } - config := testAccProvider.Meta().(*Config) + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] - url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") - if err != nil { - return err - } + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on containerRegistryClient: %+v", err) + } + } - _, err = sendRequest(config, "GET", url, nil) - if err == nil { - return fmt.Errorf("ArmContainerRegistry still exists at %s", url) - } - } + return nil + } - return nil + return nil } diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 268201cc00d6..35feea8dbc7e 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -53,16 +53,16 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { - return fmt.Errorf("Error creating Resource Group: %+v", err) + return fmt.Errorf("Error creating Resource Group %q: %+v", name, err) } resp, err := client.Get(ctx, name) if err != nil { - return err + return fmt.Errorf("Error retrieving Resource Group %q: %+v", name, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Resource Group %q", name) + return fmt.Errorf("Cannot read Resource Group %q ID", name) } d.SetId(*resp.ID) @@ -86,7 +86,7 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro d.SetId("") return nil } - return fmt.Errorf("Error reading Resource Group: %+v", err) + return fmt.Errorf("Error reading Resource Group %q: %+v", name, err) } diff --git a/build/azterraform/azurerm/resource_arm_resource_group_test.go b/build/azterraform/azurerm/resource_arm_resource_group_test.go index 937a6ec6475f..e6a7d9b084f3 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group_test.go +++ b/build/azterraform/azurerm/resource_arm_resource_group_test.go @@ -15,67 +15,58 @@ package azurerm import ( - "fmt" - "testing" + "fmt" + "testing" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func TestAccArmResourceGroup_resourceGroupExample(t *testing.T) { - t.Parallel() +func testCheckAzureRMResourceGroupExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Resource Group not found: %s", resourceName) + } - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckArmResourceGroupDestroy, - Steps: []resource.TestStep{ - { - Config: testAccArmResourceGroup_resourceGroupExample(acctest.RandString(10)), - }, - { - ResourceName: "google_arm_resource_group.example", - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} + name := rs.Primary.Attributes["name"] -func testAccArmResourceGroup_resourceGroupExample(val string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "example" { - name = "ExampleRG-%s" - location = "West US" + client := testAccProvider.Meta().(*ArmClient).resourceGroupsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext - tags { - environment = "Production" - } -} -`, val, - ) + if resp, err := client.Get(ctx, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Resource Group %q does not exist", name) + } + return fmt.Errorf("Bad: Get on resourceGroupsClient: %+v", err) + } + + return nil + } } +func testCheckAzureRMResourceGroupDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).resourceGroupsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext -func testAccCheckArmResourceGroupDestroy(s *terraform.State) error { - for _, rs := range s.RootModule().Resources { - if rs.Type != "google_arm_resource_group" { - continue - } + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_resource_group" { + continue + } - config := testAccProvider.Meta().(*Config) + name := rs.Primary.Attributes["name"] - url, err := replaceVarsForTest(rs, "NotUsedInAzureNotUsedInAzure/{{name}}") - if err != nil { - return err - } + if resp, err := client.Get(ctx, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on resourceGroupsClient: %+v", err) + } + } - _, err = sendRequest(config, "GET", url, nil) - if err == nil { - return fmt.Errorf("ArmResourceGroup still exists at %s", url) - } - } + return nil + } - return nil + return nil } diff --git a/build/azterraform/website/docs/r/automation_variable.html.markdown b/build/azterraform/website/docs/r/automation_variable.html.markdown index fc41b243505c..6991b7231910 100644 --- a/build/azterraform/website/docs/r/automation_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_variable.html.markdown @@ -66,7 +66,7 @@ The following arguments are supported: * `value` - (Optional) The value of the Automation Variable. -* `encrypted` - (Optional) The encrypted flag of the Automation Variable. +* `encrypted` - (Optional) The encrypted flag of the Automation Variable. Defaults to `false`. ## Attributes Reference diff --git a/products/azautomationvariable/api.yaml b/products/azautomationvariable/api.yaml index e9b1dc89077c..34c6d1320e2b 100644 --- a/products/azautomationvariable/api.yaml +++ b/products/azautomationvariable/api.yaml @@ -135,4 +135,5 @@ objects: - !ruby/object:Api::Type::Boolean name: 'encrypted' description: 'The encrypted flag of the Automation Variable.' + default_value: false azure_api_path: '/properties/isEncrypted' diff --git a/products/azautomationvariable/terraform.yaml b/products/azautomationvariable/terraform.yaml index 3bf4a5fcdaac..f44eab28f299 100644 --- a/products/azautomationvariable/terraform.yaml +++ b/products/azautomationvariable/terraform.yaml @@ -1,7 +1,47 @@ --- !ruby/object:Provider::Terraform::Config name: Arm overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Terraform::ResourceOverride + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + acctests: + basic: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + custom_dependencies_code: | + resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" + } + + resource "azurerm_automation_account" "test" { + name = "acctestAutoAcct-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + + sku { + name = "Basic" + } + } + properties: + name: acctestAutoVar-%d + resourceGroupName: ${azurerm_resource_group.test.name} + automationAccountName: ${azurerm_automation_account.test.name} + value: Hello, Terraform Basic Test. + hcl_parameters: + - AccDefaultInt + - AccLocation + - AccDefaultInt + - AccDefaultInt + steps: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition + config_name: config + hcl_reference: basic + complete: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + based_on: basic + properties: + description: This is a variable created by Terraform acceptance test. + value: Hello, Terraform Complete Test. + steps: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition + config_name: config + hcl_reference: complete example: - !ruby/object:Provider::Terraform::Examples name: "container_registry" diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb index de1ba196e8cc..5043ec1a918d 100644 --- a/provider/azure/terraform/acctest/sub_template.rb +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -4,7 +4,7 @@ module Terraform module AccTest module SubTemplate - def build_acctest_parameters_from_schema(sdk_op_def, properties, object, check_existence = false, indentation = 4) + def build_acctest_parameters_from_schema(sdk_op_def, properties, object, check_existence = false, indentation = 8) compile_template 'templates/azure/terraform/acctest/parameters_from_schema.erb', indentation: indentation, sdk_op_def: sdk_op_def, @@ -13,6 +13,19 @@ def build_acctest_parameters_from_schema(sdk_op_def, properties, object, check_e object: object end + def build_acctest_dependencies_hcl(acctest_def, object) + compile_template 'templates/azure/terraform/acctest/dependencies_hcl.erb', + acctest_def: acctest_def, + object: object + end + + def build_acctest_resource_test_hcl(acctest_def, object, resource_id = "test") + compile_template 'templates/azure/terraform/acctest/resource_test_hcl.erb', + acctest_def: acctest_def, + resource_id: resource_id, + object: object + end + end end end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb new file mode 100644 index 000000000000..efca32aea36a --- /dev/null +++ b/provider/azure/terraform/resource_override.rb @@ -0,0 +1,131 @@ +require 'provider/terraform/resource_override' + +module Provider + module Azure + module Terraform + module OverrideProperties + attr_reader :acctests + include Provider::Terraform::OverrideProperties + end + + class ResourceOverride < Provider::Terraform::ResourceOverride + include Provider::Azure::Terraform::OverrideProperties + + def validate + super + check_optional_property :acctests, Hash + check_optional_property_hash :acctests, String, AccTestDefinition + post_initialization + end + + def apply(resource) + super + end + + class AccTestDefinition < Api::Object + attr_reader :based_on + attr_reader :steps + attr_reader :hcl_parameters + attr_reader :check_import + attr_reader :custom_dependencies_code + attr_reader :properties + + def validate + super + @initialized = false + + check_property :steps, Array + check_property_list :steps, AccTestStepDefinition + + check_optional_property :based_on, String + check_optional_property :check_import, :boolean + @check_import = true if @check_import.nil? + check_optional_property :custom_dependencies_code, String + + check_optional_property :properties, Hash + @properties ||= Hash.new + check_optional_property_hash :properties, String, String + + check_optional_property :hcl_parameters, Array + @hcl_parameters ||= [] + convert_hcl_parameter_strings + check_optional_property_list :hcl_parameters, AccTestHCLParametersDefinition + end + + def post_initialization(resource) + merge_hcl_parameters(resource) unless @initialized + @initialized = true + end + + private + + def convert_hcl_parameter_strings() + @hcl_parameters.each_index do |i| + @hcl_parameters[i] = AccTestHCLParametersDefinition.new(@hcl_parameters[i]) if @hcl_parameters[i].instance_of? String + end + end + + def merge_hcl_parameters(resource) + parent_def_id = @based_on + until parent_def_id.nil? + parent_def = resource.acctests[parent_def_id] + parent_def.post_initialization(resource) + parent_def.hcl_parameters.reverse_each{|param| @hcl_parameters.insert(0, param)} + parent_def_id = parent_def.based_on + end + end + end + + class AccTestHCLParametersDefinition < Api::Object + attr_reader :variable_name + attr_reader :go_type + attr_reader :create_expression + + def validate + super + check_property :variable_name, String + check_property :go_type, String + check_property :create_expression, String + end + + def initialize(str) + case str + when "AccDefaultInt" + @variable_name = "rInt" + @go_type = "int" + @create_expression = "tf.AccRandTimeInt()" + when "AccLocation" + @variable_name = "location" + @go_type = "string" + @create_expression = "testLocation()" + else + raise "#{str} is not a valid pre-defined AccTestHCLParametersDefinition" + end + end + end + + class AccTestStepDefinition < Api::Object + attr_reader :config_name + attr_reader :hcl_reference + + def validate + super + check_property :config_name, String + check_property :hcl_reference, String + end + end + + private + + def overriden + Provider::Azure::Terraform::OverrideProperties + end + + def post_initialization + @acctests.each_value{|acctest_def| acctest_def.post_initialization(self)} + end + + end + end + end +end diff --git a/provider/terraform.rb b/provider/terraform.rb index e8e1812d38ed..f5e6339031ef 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -21,6 +21,7 @@ require 'google/golang_utils' require 'provider/azure/terraform' +require 'provider/azure/terraform/resource_override' module Provider # Code generator for Terraform Resources that manage Google Cloud Platform diff --git a/templates/azure/terraform/acctest/dependencies_hcl.erb b/templates/azure/terraform/acctest/dependencies_hcl.erb new file mode 100644 index 000000000000..a69944b35575 --- /dev/null +++ b/templates/azure/terraform/acctest/dependencies_hcl.erb @@ -0,0 +1,5 @@ +<% unless acctest_def.based_on.nil? -%> +<% parent_def = object.acctests[acctest_def.based_on] -%> +<%= build_acctest_dependencies_hcl(parent_def, object) -%> +<% end -%> +<%= acctest_def.custom_dependencies_code -%> \ No newline at end of file diff --git a/templates/azure/terraform/acctest/resource_test_hcl.erb b/templates/azure/terraform/acctest/resource_test_hcl.erb new file mode 100644 index 000000000000..bcf8d29eb171 --- /dev/null +++ b/templates/azure/terraform/acctest/resource_test_hcl.erb @@ -0,0 +1,20 @@ +<% + merged_props = Hash.new + cur_acctest_def = acctest_def + until cur_acctest_def.nil? do + cur_acctest_def.properties.each do |propName, prop| + merged_props[propName] = prop unless merged_props.has_key?(propName) + end + cur_acctest_def = cur_acctest_def.based_on.nil? ? nil : object.acctests[cur_acctest_def.based_on] + end + + longest_prop_name = merged_props.keys.max_by{|pn| pn.underscore.length} + prop_len = longest_prop_name.nil? ? 0 : longest_prop_name.underscore.length +-%> +"<%= "azurerm_" + object.name.underscore -%>" "<%= resource_id -%>" { +<% object.properties.each do |prop| -%> +<% if merged_props.has_key?(prop.name) -%> + <%= prop.name.underscore.ljust(prop_len) -%> = "<%= merged_props[prop.name] -%>" +<% end -%> +<% end -%> +} \ No newline at end of file diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 66dfa0c1a28f..d8bb676a44e0 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -6,8 +6,9 @@ import ( "fmt" "testing" - "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) <% @@ -16,43 +17,63 @@ import ( azure_client_name = "#{object.api_name}Client".camelcase(:lower) properties = object.all_user_properties %> -<% object.example.reject(&:skip_test).each do |example| -%> +<% if object.instance_variable_defined?(:@acctests) -%> +<% object.acctests.each do |testName, test| -%> +func TestAcc<%= resource_name -%>_<%= testName -%>(t *testing.T) { + resourceName := "<%= terraform_name -%>.test" +<% test.steps.map{|step| object.acctests[step.hcl_reference].hcl_parameters}.flatten.uniq(&:variable_name).each do |param| -%> + <%= param.variable_name -%> := <%= param.create_expression -%> + +<% end -%> +<% test.steps.uniq(&:config_name).each do |step| -%> <% - # {Compute}{Address}_{addressBasic} - test_slug = "#{resource_name}_#{example.name.camelize(:lower)}Example" - ignore_read = data[:object].all_user_properties - .select(&:ignore_read) - .map { |p| p.name.underscore } - .concat(example.ignore_read_extra) + hcl_params = object.acctests[step.hcl_reference].hcl_parameters + uniq_params = hcl_params.uniq(&:variable_name).map(&:variable_name) -%> - -func TestAcc<%= test_slug -%>(t *testing.T) { - t.Parallel() - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheck<%= "#{resource_name}" -%>Destroy, - Steps: []resource.TestStep{ - { - Config: testAcc<%= test_slug -%>(acctest.RandString(10)), - }, - { - ResourceName: "<%= terraform_name -%>.<%= example.primary_resource_id -%>", - ImportState: true, - ImportStateVerify: true, - <%- unless ignore_read.empty? -%> - ImportStateVerifyIgnore: <%= go_literal(ignore_read) %>, - <%- end -%> - }, - }, - }) + <%= step.config_name -%> := testAcc<%= resource_name -%>_<%= step.hcl_reference -%>(<%= uniq_params.join(", ") -%>) +<% end -%> +<% -%> + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheck<%= resource_name -%>Destroy, + Steps: []resource.TestStep{ +<% test.steps.each do |step| -%> +<% + hcl = object.acctests[step.hcl_reference] + props_to_check = Hash.new + until hcl.nil? do + hcl.properties.each do |propName, prop| + props_to_check[propName] = prop unless props_to_check.has_key?(propName) + end + hcl = hcl.based_on.nil? ? nil : object.acctests[hcl.based_on] + end + props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.properties.find{|p| p.name == pn}.azure_api_path) } +-%> + { + Config: <%= step.config_name -%>, + Check: resource.ComposeTestCheckFunc( + testCheck<%= resource_name -%>Exists(resourceName), +<% props_to_check.each do |propName, propValue| -%> + resource.TestCheckResourceAttr(resourceName, "<%= propName.underscore -%>", "<%= propValue -%>"), +<% end -%> + ), + }, +<% end -%> +<% if test.check_import -%> + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, +<% end -%> + }, + }) } -func testAcc<%= test_slug -%>(val string) string { -<%= example.config_test -%> -} -<%- end %> +<% end -%> +<% end -%> func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -61,7 +82,7 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec return fmt.Errorf("<%= object.name.titlecase -%> not found: %s", resourceName) } -<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object, true, 8)) -%> +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object, true)) -%> client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> @@ -93,7 +114,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return err + return fmt.Errorf("Bad: Get on <%= azure_client_name -%>: %+v", err) } } @@ -102,3 +123,19 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { return nil } + +<% if object.instance_variable_defined?(:@acctests) -%> +<% object.acctests.each do |testName, test| -%> +<% uniq_params = test.hcl_parameters.uniq(&:variable_name).map{|p| "#{p.variable_name} #{p.go_type}"} -%> +func testAcc<%= resource_name -%>_<%= testName -%>(<%= uniq_params.join(", ") -%>) string { + return fmt.Sprintf(` +<%= build_acctest_dependencies_hcl(test, object) -%> + + +<%= build_acctest_resource_test_hcl(test, object) -%> + +`, <%= test.hcl_parameters.map(&:variable_name).join(", ") -%>) +} + +<% end -%> +<% end -%> \ No newline at end of file From edda1f676a36846a9be4ff68b8a6f93f97528065 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 25 Feb 2019 23:33:07 +0800 Subject: [PATCH 030/175] Rename azure_api_path to azure_sdk_references. --- api/type.rb | 5 +- .../resource_arm_container_registry_test.go | 2 +- google/yaml_validator.rb | 6 +++ products/azcontainerregistry/api.yaml | 20 ++++---- products/azresourcegroup/api.yaml | 8 ++-- provider/azure/terraform/schema.rb | 5 +- provider/azure/terraform/sub_template.rb | 16 ++----- .../acctest/parameters_from_schema.erb | 4 +- .../sdk/errorf_with_resource_name.erb | 4 +- .../terraform/sdk/parameters_schema_set.erb | 4 -- .../sdktypes/property_to_sdkenum.erb | 2 +- .../sdktypes/property_to_sdkobject.erb | 4 +- .../sdktypes/property_to_sdkprimitive.erb | 2 +- .../sdktypes/sdkenum_to_property.erb | 3 +- .../sdktypes/sdkobject_to_property.erb | 47 ++++++++++--------- .../sdktypes/sdkprimitive_to_property.erb | 4 +- .../azure/terraform/sdktypes/unsupport.erb | 2 +- .../examples/base_configs/test_file.go.erb | 4 +- templates/terraform/resource.erb | 6 +-- 19 files changed, 76 insertions(+), 72 deletions(-) delete mode 100644 templates/azure/terraform/sdk/parameters_schema_set.erb diff --git a/api/type.rb b/api/type.rb index 79f37e1c6639..a4ce740a9340 100644 --- a/api/type.rb +++ b/api/type.rb @@ -42,7 +42,7 @@ module Fields # Can only be overriden - we should never set this ourselves. attr_reader :new_type - attr_reader :azure_api_path + attr_reader :azure_sdk_references attr_reader :custom_schema_get attr_reader :custom_schema_set attr_reader :custom_expand_func @@ -74,7 +74,8 @@ def validate :update_verb, %i[POST PUT PATCH NONE], @__resource&.update_verb, Symbol check_optional_property :update_url, ::String - check_optional_property :azure_api_path, ::String + check_property :azure_sdk_references, ::Array + check_property_non_empty_list :azure_sdk_references, ::String check_optional_property :custom_schema_get, ::String check_optional_property :custom_schema_set, ::String check_optional_property :custom_expand_func, ::String diff --git a/build/azterraform/azurerm/resource_arm_container_registry_test.go b/build/azterraform/azurerm/resource_arm_container_registry_test.go index d30cf034c8fe..5c70ae8d74f5 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry_test.go +++ b/build/azterraform/azurerm/resource_arm_container_registry_test.go @@ -18,8 +18,8 @@ import ( "fmt" "testing" - "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 53aac00142da..3e01ca1e343e 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -115,6 +115,12 @@ def check_property_list(name, type = nil) end end + def check_property_non_empty_list(name, type = nil) + check_property_list(name, type) + obj_list = instance_variable_get("@#{name}") + raise "Property #{name} is empty" if obj_list.empty? + end + def check_optional_property_list(name, type = nil) obj_list = instance_variable_get("@#{name}") return if obj_list.nil? diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index d6c48827bd12..d01aee61828c 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -62,8 +62,12 @@ objects: id_portion: registries go_variable_name: name response: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: resourceGroup '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Registry + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -143,19 +147,19 @@ objects: description: 'Specifies the name of the Container Registry.' required: true input: true - azure_api_path: 'registryName' + azure_sdk_references: ['registryName', '/name'] - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Container Registry.' required: true input: true - azure_api_path: 'resourceGroupName' + azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'Specifies the supported Azure location where the resource exists.' required: true input: true - azure_api_path: '/location' + azure_sdk_references: ['/location'] - !ruby/object:Api::Type::Enum name: 'sku' values: @@ -165,22 +169,22 @@ objects: - :Premium description: 'The SKU name of the the container registry.' default_value: :Classic - azure_api_path: '/sku/name' + azure_sdk_references: ['/sku/name'] - !ruby/object:Api::Type::Boolean name: 'adminEnabled' description: 'Specifies whether the admin user is enabled.' default_value: false - azure_api_path: '/properties/adminUserEnabled' + azure_sdk_references: ['/properties/adminUserEnabled'] - !ruby/object:Api::Type::String name: 'storageAccountId' description: 'The ID of a Storage Account which must be located in the same Azure Region as the Container Registry.' - azure_api_path: '/properties/storageAccount/id' + azure_sdk_references: ['/properties/storageAccount/id'] - !ruby/object:Api::Type::String name: 'loginServer' description: 'The URL that can be used to log into the container registry.' output: true - azure_api_path: '/loginServer' + azure_sdk_references: ['/loginServer'] - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the container registry.' - azure_api_path: '/tags' + azure_sdk_references: ['/tags'] diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index df5f214faae6..e0ba29ac3357 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -38,6 +38,8 @@ objects: response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Group + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -71,14 +73,14 @@ objects: description: 'The name of the resource group.' required: true input: true - azure_api_path: 'name' + azure_sdk_references: ['name', '/name'] - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'The location where the resource group should be created.' required: true input: true - azure_api_path: '/location' + azure_sdk_references: ['/location'] - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the resource group.' - azure_api_path: '/tags' + azure_sdk_references: ['/tags'] diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index eb7fe68e4bfe..b0c884b2a181 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -81,8 +81,9 @@ def property_to_sdk_object_template(sdktype) end end - def sdk_object_to_property_template(sdktype) - case sdktype + def sdk_object_to_property_template(sdk_type_defs, api_path) + return 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' if api_path == "" + case sdk_type_defs[api_path] when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' when Api::Azure::SDKTypeDefinition::EnumObject diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 0e25d520f971..78ee1c45eb94 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -35,14 +35,13 @@ def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, re object: object end - def build_sdk_object_to_property(input, sdk_path, sdk_type_def, properties, sdk_type_defs, object, indentation = 4) - compile_template sdk_object_to_property_template(sdk_type_def), + def build_sdk_object_to_property(input, api_path, property, sdk_type_defs, object, indentation = 4) + compile_template sdk_object_to_property_template(sdk_type_defs, api_path), indentation: indentation, input_statement: input, - sdk_obj_path: sdk_path, - sdk_type_def: sdk_type_def, + api_path: api_path, + property: property, sdk_type_defs: sdk_type_defs, - properties: properties, object: object end @@ -58,13 +57,6 @@ def build_azure_id_parser(sdk_op_def, object, indentation = 4) object: object end - def build_parameters_schema_property_set(sdk_op_def, properties, indentation = 4) - compile_template 'templates/azure/terraform/sdk/parameters_schema_set.erb', - indentation: indentation, - sdk_op_def: sdk_op_def, - properties: properties - end - def build_errorf_with_resource_name(format_string, include_error, sdk_op_def, properties, object) compile_template 'templates/azure/terraform/sdk/errorf_with_resource_name.erb', format_string: format_string, diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb index e56bfe329a0e..34a6e39ae732 100644 --- a/templates/azure/terraform/acctest/parameters_from_schema.erb +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -1,5 +1,5 @@ -<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) }.each do |prop| -%> -<% var_name = sdk_op_def.request[prop.azure_api_path].go_variable_name -%> +<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) }.each do |prop| -%> +<% var_name = sdk_op_def.request[prop.azure_sdk_references[0]].go_variable_name -%> <% if check_existence && var_name != "name" -%> <%= var_name -%>, has<%= var_name.camelcase(:upper) -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] if !has<%= var_name.camelcase(:upper) -%> { diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index 64d442df9835..c33cb35b68b5 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -2,8 +2,8 @@ res_name = "" depends = [] param_vars = [] - properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) && !p.azure_api_path.start_with?("/") }.each do |prop| - param = sdk_op_def.request[prop.azure_api_path] + properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) && !p.azure_sdk_references[0].start_with?("/") }.each do |prop| + param = sdk_op_def.request[prop.azure_sdk_references[0]] param_vars += [param.go_variable_name] case prop.name when "name" diff --git a/templates/azure/terraform/sdk/parameters_schema_set.erb b/templates/azure/terraform/sdk/parameters_schema_set.erb deleted file mode 100644 index a48231905461..000000000000 --- a/templates/azure/terraform/sdk/parameters_schema_set.erb +++ /dev/null @@ -1,4 +0,0 @@ -<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_api_path) }.each do |prop| -%> -<% var_name = sdk_op_def.request[prop.azure_api_path].go_variable_name -%> -<%= lines(build_schema_property_set(var_name == "name" ? "resp.Name" : var_name, "d", prop)) -%> -<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb index 89e55108c555..3511b9b39220 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb @@ -1,2 +1,2 @@ -<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<% property = properties.find { |p| p.azure_sdk_references[0] == sdk_obj_path[0..-2] } -%> <%= output_statement -%><%= sdk_package_name -%>.<%= sdk_type_def.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 5d697045dc9d..1619788ec09c 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -1,8 +1,8 @@ <%= output_statement -%><%= sdk_obj_path == "/" ? "" : "&" -%><%= sdk_package_name -%>.<%= sdk_type_def.go_type_name -%>{ <% one_level_props = Hash.new - properties.select { |p| p.azure_api_path.start_with?(sdk_obj_path) }.each do |prop| - prop_key = prop.azure_api_path[sdk_obj_path.length..-1].split("/")[0] + properties.select { |p| p.azure_sdk_references[0].start_with?(sdk_obj_path) }.each do |prop| + prop_key = prop.azure_sdk_references[0][sdk_obj_path.length..-1].split("/")[0] prop_list = one_level_props[prop_key] || Array.new one_level_props[prop_key] = prop_list << prop end diff --git a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb b/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb index 760100656c7e..46235c01244f 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb @@ -1,4 +1,4 @@ -<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> +<% property = properties.find { |p| p.azure_sdk_references[0] == sdk_obj_path[0..-2] } -%> <% if expand_funcs.include?(property.class) -%> <%= output_statement -%><%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb index 8a9a1e7cc1ed..b27725ccd044 100644 --- a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb @@ -1,3 +1,2 @@ -<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> -<% input_var = "string(" + input_statement + "." + sdk_type_def.go_field_name + ")" -%> +<% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> <%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 5fc26b93988e..b8c8b79b64e4 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -1,27 +1,32 @@ <% - temp_var_name = input_statement - if sdk_obj_path != "/" - temp_var_name = sdk_type_def.go_variable_name || sdk_type_def.go_field_name.camelcase(:lower) - end + temp_var = input_statement + unless api_path == "" + sdk_type = sdk_type_defs[api_path] + temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) -%> -<% if sdk_obj_path != "/" -%> -if <%= temp_var_name -%> := <%= input_statement -%>.<%= sdk_type_def.go_field_name -%>; <%= temp_var_name -%> != nil { -<% end -%> +if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { <% - one_level_props = Hash.new - properties.select{|p| p.azure_api_path.start_with?(sdk_obj_path)}.each do |prop| - prop_key = prop.azure_api_path[sdk_obj_path.length..-1].split("/")[0] - prop_list = one_level_props[prop_key] || Array.new - one_level_props[prop_key] = prop_list << prop end + + direct_children = Hash.new + object.properties.each do |prop| + prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| + if api_path == "" + sub_paths = child_api_path.split("/") + direct_children[child_api_path] = prop if sub_paths.length == 1 + elsif child_api_path.start_with?(api_path + "/") && + sub_paths = child_api_path[api_path.length..-1].split("/") + end + if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" + sub_api_path = api_path + "/" + sub_paths[1] + direct_children[sub_api_path] = (direct_children[sub_api_path] || nil) if sub_paths.length > 2 + direct_children[child_api_path] = prop if sub_paths.length == 2 + end + end + end + + direct_children.each do |child_api_path, prop| -%> -<% - one_level_props.each do |prop_name, prop_list| - sdk_path = sdk_obj_path + prop_name - sdk_type_def = sdk_type_defs[sdk_path] --%> -<%= lines(build_sdk_object_to_property(temp_var_name, sdk_path + "/", sdk_type_def, properties, sdk_type_defs, object, (sdk_obj_path == "/" ? 0 : 4))) -%> +<%= lines(build_sdk_object_to_property(temp_var, child_api_path, prop, sdk_type_defs, object)) -%> <% end -%> -<% if sdk_obj_path != "/" -%> -} -<% end -%> \ No newline at end of file +<%= "}" unless api_path == "" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb index 79d9495e2a35..6d1ca08edc04 100644 --- a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb @@ -1,3 +1,3 @@ -<% property = properties.find { |p| p.azure_api_path == sdk_obj_path[0..-2] } -%> -<% input_var = input_statement + "." + sdk_type_def.go_field_name -%> +<% sdk_type = sdk_type_defs[api_path] -%> +<% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> <%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/unsupport.erb b/templates/azure/terraform/sdktypes/unsupport.erb index f7d2348f5a8b..3357632e69d5 100644 --- a/templates/azure/terraform/sdktypes/unsupport.erb +++ b/templates/azure/terraform/sdktypes/unsupport.erb @@ -1 +1 @@ -// TODO: field <%= sdk_obj_path -%> with type <%= sdk_type_def -%> is not supported \ No newline at end of file +// TODO: property <%= property.name -%> (SDK Reference <%= api_path -%>) with type <%= sdk_type_defs[api_path] -%> is not supported \ No newline at end of file diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index d8bb676a44e0..244730df576f 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -49,7 +49,7 @@ func TestAcc<%= resource_name -%>_<%= testName -%>(t *testing.T) { end hcl = hcl.based_on.nil? ? nil : object.acctests[hcl.based_on] end - props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.properties.find{|p| p.name == pn}.azure_api_path) } + props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.properties.find{|p| p.name == pn}.azure_sdk_references[0]) } -%> { Config: <%= step.config_name -%>, @@ -125,7 +125,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { } <% if object.instance_variable_defined?(:@acctests) -%> -<% object.acctests.each do |testName, test| -%> +<% object.acctests.reject{|n, t| t.based_on.nil? && t.properties.empty?}.each do |testName, test| -%> <% uniq_params = test.hcl_parameters.uniq(&:variable_name).map{|p| "#{p.variable_name} #{p.go_type}"} -%> func testAcc<%= resource_name -%>_<%= testName -%>(<%= uniq_params.join(", ") -%>) string { return fmt.Sprintf(` diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 5fbae378c093..5d863b622f4d 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -102,7 +102,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext <% settable_properties.each do |prop| -%> -<% var_name = object.azure_sdk_definition.create.request[prop.azure_api_path].go_variable_name -%> +<% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> <% output_var = var_name.nil? ? prop.name.camelcase(:lower) : var_name -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> @@ -191,9 +191,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% end -%> -<%= lines(build_parameters_schema_property_set(object.azure_sdk_definition.read, properties)) -%> -<% sdk_type_def = object.azure_sdk_definition.read.response["/"] -%> -<%= lines(build_sdk_object_to_property("resp", "/", sdk_type_def, properties, object.azure_sdk_definition.read.response, object)) -%> +<%= lines(build_sdk_object_to_property("resp", "", nil, object.azure_sdk_definition.read.response, object, 0)) -%> return nil } From 571ca7c1345a5bfbbc866e64299e06743b2a59a9 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 26 Feb 2019 14:09:32 +0800 Subject: [PATCH 031/175] Refactor schema-to-SDK logic. --- .../api.yaml | 20 ++++++--- .../terraform.yaml | 19 +++++++++ products/azcontainerregistry/api.yaml | 4 -- provider/azure/terraform/schema.rb | 4 +- provider/azure/terraform/sub_template.rb | 11 ++--- .../sdktypes/property_to_sdkenum.erb | 7 +++- .../sdktypes/property_to_sdkobject.erb | 41 +++++++++++++------ .../sdktypes/property_to_sdkprimitive.erb | 6 +-- .../sdktypes/sdkobject_to_property.erb | 4 +- templates/terraform/resource.erb | 9 +--- 10 files changed, 79 insertions(+), 46 deletions(-) rename products/{azautomationvariable => azautomationstringvariable}/api.yaml (88%) rename products/{azautomationvariable => azautomationstringvariable}/terraform.yaml (65%) diff --git a/products/azautomationvariable/api.yaml b/products/azautomationstringvariable/api.yaml similarity index 88% rename from products/azautomationvariable/api.yaml rename to products/azautomationstringvariable/api.yaml index 34c6d1320e2b..52a05cbffd40 100644 --- a/products/azautomationvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -32,6 +32,8 @@ objects: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: VariableCreateOrUpdateProperties go_type_name: VariableCreateOrUpdateProperties @@ -54,8 +56,14 @@ objects: id_portion: variables go_variable_name: name response: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: accountName '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: VariableProperties go_type_name: VariableProperties @@ -111,29 +119,29 @@ objects: description: 'The name of the Automation Variable.' required: true input: true - azure_api_path: 'variableName' + azure_sdk_references: ['variableName', '/name'] - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Automation Variable.' required: true input: true - azure_api_path: 'resourceGroupName' + azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: 'automationAccountName' description: 'The name of the automation account in which the Variable is created.' required: true input: true - azure_api_path: 'automationAccountName' + azure_sdk_references: ['automationAccountName'] - !ruby/object:Api::Type::String name: 'description' description: 'The description of the Automation Variable.' - azure_api_path: '/properties/description' + azure_sdk_references: ['/properties/description'] - !ruby/object:Api::Type::String name: 'value' description: 'The value of the Automation Variable.' - azure_api_path: '/properties/value' + azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' description: 'The encrypted flag of the Automation Variable.' default_value: false - azure_api_path: '/properties/isEncrypted' + azure_sdk_references: ['/properties/isEncrypted'] diff --git a/products/azautomationvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml similarity index 65% rename from products/azautomationvariable/terraform.yaml rename to products/azautomationstringvariable/terraform.yaml index f44eab28f299..a20870602359 100644 --- a/products/azautomationvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -2,6 +2,14 @@ name: Arm overrides: !ruby/object:Provider::ResourceOverrides AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationStringVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings acctests: basic: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition custom_dependencies_code: | @@ -42,6 +50,17 @@ overrides: !ruby/object:Provider::ResourceOverrides - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition config_name: config hcl_reference: complete + basicCompleteUpdate: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + steps: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition + config_name: basicConfig + hcl_reference: basic + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition + config_name: completeConfig + hcl_reference: complete + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition + config_name: basicConfig + hcl_reference: basic example: - !ruby/object:Provider::Terraform::Examples name: "container_registry" diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index d01aee61828c..16f25553cf7c 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -104,10 +104,6 @@ objects: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: RegistryUpdateParameters - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoginServer '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: RegistryPropertiesUpdateParameters go_type_name: RegistryPropertiesUpdateParameters diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index b0c884b2a181..d6daa943dc5c 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -68,8 +68,8 @@ def schema_property_set_template(property) end end - def property_to_sdk_object_template(sdktype) - case sdktype + def property_to_sdk_object_template(sdk_type_defs, api_path) + case sdk_type_defs[api_path] when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject 'templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb' when Api::Azure::SDKTypeDefinition::EnumObject diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 78ee1c45eb94..37ea7abab52b 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -22,16 +22,13 @@ def build_schema_property_set(input, output, property, indentation = 0) property: property end - def build_property_to_sdk_object(output, sdk_path, sdk_type_def, sdk_package, resource_name, properties, sdk_type_defs, object, indentation = 4) - compile_template property_to_sdk_object_template(sdk_type_def), + def build_property_to_sdk_object(api_path, property, resource_name, sdk_type_defs, object, indentation = 4) + compile_template property_to_sdk_object_template(sdk_type_defs, api_path), indentation: indentation, - output_statement: output, - sdk_package_name: sdk_package, resource_name: resource_name, - sdk_obj_path: sdk_path, - sdk_type_def: sdk_type_def, + api_path: api_path, + property: property, sdk_type_defs: sdk_type_defs, - properties: properties, object: object end diff --git a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb index 3511b9b39220..1506fb51de27 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkenum.erb @@ -1,2 +1,5 @@ -<% property = properties.find { |p| p.azure_sdk_references[0] == sdk_obj_path[0..-2] } -%> -<%= output_statement -%><%= sdk_package_name -%>.<%= sdk_type_def.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file +<% + sdk_package = azure_resource_go_package(object.__product) + sdk_type = sdk_type_defs[api_path] +-%> +<%= sdk_type.go_field_name -%>: <%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 1619788ec09c..dbcf42e6cac3 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -1,18 +1,33 @@ -<%= output_statement -%><%= sdk_obj_path == "/" ? "" : "&" -%><%= sdk_package_name -%>.<%= sdk_type_def.go_type_name -%>{ <% - one_level_props = Hash.new - properties.select { |p| p.azure_sdk_references[0].start_with?(sdk_obj_path) }.each do |prop| - prop_key = prop.azure_sdk_references[0][sdk_obj_path.length..-1].split("/")[0] - prop_list = one_level_props[prop_key] || Array.new - one_level_props[prop_key] = prop_list << prop - end + sdk_package = azure_resource_go_package(object.__product) + sdk_type = sdk_type_defs[api_path] + if api_path == "/" -%> +<%= sdk_type.go_variable_name -%> := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ +<% else -%> +<%= sdk_type.go_field_name -%>: &<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ <% - one_level_props.each do |prop_name, prop_list| - sdk_path = sdk_obj_path + prop_name - sdk_type_def = sdk_type_defs[sdk_path] - output = sdk_type_def.go_field_name + ": " + end + + direct_children = Hash.new + object.all_user_properties.each do |prop| + prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| + if api_path == "/" && child_api_path.start_with?(api_path) + sub_paths = child_api_path.split("/") + api_path = "" + elsif child_api_path.start_with?(api_path + "/") + sub_paths = child_api_path[api_path.length..-1].split("/") + end + if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" + sub_api_path = api_path + "/" + sub_paths[1] + direct_children[sub_api_path] = (direct_children[sub_api_path] || nil) if sub_paths.length > 2 + direct_children[child_api_path] = prop if sub_paths.length == 2 + end + end + end + + direct_children.each do |child_api_path, prop| -%> -<%= lines(build_property_to_sdk_object(output, sdk_path + "/", sdk_type_def, sdk_package_name, resource_name, properties, sdk_type_defs, object)) -%> +<%= lines(build_property_to_sdk_object(child_api_path, prop, resource_name, sdk_type_defs, object)) -%> <% end -%> -}<%= "," unless sdk_obj_path == "/" -%> \ No newline at end of file +}<%= "," unless api_path == "" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb b/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb index 46235c01244f..e1f8bc0249b6 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb @@ -1,6 +1,6 @@ -<% property = properties.find { |p| p.azure_sdk_references[0] == sdk_obj_path[0..-2] } -%> +<% sdk_type = sdk_type_defs[api_path] -%> <% if expand_funcs.include?(property.class) -%> -<%= output_statement -%><%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), +<%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> -<%= output_statement -%>expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), +<%= sdk_type.go_field_name -%>: expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index b8c8b79b64e4..914d10ae2f50 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -9,12 +9,12 @@ if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; < end direct_children = Hash.new - object.properties.each do |prop| + object.all_user_properties.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "" sub_paths = child_api_path.split("/") direct_children[child_api_path] = prop if sub_paths.length == 1 - elsif child_api_path.start_with?(api_path + "/") && + elsif child_api_path.start_with?(api_path + "/") sub_paths = child_api_path[api_path.length..-1].split("/") end if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 5d863b622f4d..0860a81ec1a7 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -107,8 +107,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<% sdk_type_def = object.azure_sdk_definition.create.request["/"] -%> -<%= lines(build_property_to_sdk_object("#{sdk_type_def.go_variable_name} := ", "/", sdk_type_def, sdk_package, resource_name, settable_properties, object.azure_sdk_definition.create.request, object)) -%> +<%= lines(build_property_to_sdk_object("/", nil, resource_name, object.azure_sdk_definition.create.request, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -212,11 +211,7 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <% end -%> -<% - sdk_type_def = object.azure_sdk_definition.update.request["/"] - updatable_properties = settable_properties.reject { |p| p.name == "location" } --%> -<%= lines(build_property_to_sdk_object("parameters := ", "/", sdk_type_def, sdk_package, resource_name, updatable_properties, object.azure_sdk_definition.update.request, object)) -%> +<%= lines(build_property_to_sdk_object("/", nil, resource_name, object.azure_sdk_definition.update.request, object)) -%> future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.update) -%> From 1580eba24ca8d1d7a134b22cf94961fc6664ccd2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 26 Feb 2019 18:17:16 +0800 Subject: [PATCH 032/175] Implement full version of automation string variable. --- api/type.rb | 6 -- ...esource_arm_automation_string_variable.go} | 50 +++++++----- ...ce_arm_automation_string_variable_test.go} | 80 ++++++++++++++----- ... automation_string_variable.html.markdown} | 12 +-- .../check_type_after_read.erb | 3 + .../azautomationstringvariable/terraform.yaml | 5 ++ .../terraform_get_value.erb | 5 ++ .../terraform_set_value.erb | 9 +++ provider/azure/terraform.rb | 7 ++ provider/azure/terraform/property_override.rb | 30 +++++++ provider/azure/terraform/resource_override.rb | 6 +- provider/azure/terraform/schema.rb | 1 + provider/terraform.rb | 9 --- provider/terraform/custom_code.rb | 4 + templates/terraform/resource.erb | 9 +-- 15 files changed, 162 insertions(+), 74 deletions(-) rename build/azterraform/azurerm/{resource_arm_automation_variable.go => resource_arm_automation_string_variable.go} (62%) rename build/azterraform/azurerm/{resource_arm_automation_variable_test.go => resource_arm_automation_string_variable_test.go} (61%) rename build/azterraform/website/docs/r/{automation_variable.html.markdown => automation_string_variable.html.markdown} (82%) create mode 100644 products/azautomationstringvariable/check_type_after_read.erb create mode 100644 products/azautomationstringvariable/terraform_get_value.erb create mode 100644 products/azautomationstringvariable/terraform_set_value.erb create mode 100644 provider/azure/terraform/property_override.rb diff --git a/api/type.rb b/api/type.rb index a4ce740a9340..4b3a0bb4c0aa 100644 --- a/api/type.rb +++ b/api/type.rb @@ -43,9 +43,6 @@ module Fields attr_reader :new_type attr_reader :azure_sdk_references - attr_reader :custom_schema_get - attr_reader :custom_schema_set - attr_reader :custom_expand_func end include Fields @@ -76,9 +73,6 @@ def validate check_property :azure_sdk_references, ::Array check_property_non_empty_list :azure_sdk_references, ::String - check_optional_property :custom_schema_get, ::String - check_optional_property :custom_schema_set, ::String - check_optional_property :custom_expand_func, ::String check_default_value_property end diff --git a/build/azterraform/azurerm/resource_arm_automation_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go similarity index 62% rename from build/azterraform/azurerm/resource_arm_automation_variable.go rename to build/azterraform/azurerm/resource_arm_automation_string_variable.go index 9e4bf504b431..27132729eb5d 100644 --- a/build/azterraform/azurerm/resource_arm_automation_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -16,12 +16,12 @@ package azurerm -func resourceArmAutomationVariable() *schema.Resource { +func resourceArmAutomationStringVariable() *schema.Resource { return &schema.Resource{ - Create: resourceArmAutomationVariableCreateUpdate, - Read: resourceArmAutomationVariableRead, - Update: resourceArmAutomationVariableCreateUpdate, - Delete: resourceArmAutomationVariableDelete, + Create: resourceArmAutomationStringVariableCreateUpdate, + Read: resourceArmAutomationStringVariableRead, + Update: resourceArmAutomationStringVariableCreateUpdate, + Delete: resourceArmAutomationStringVariableDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, @@ -33,7 +33,8 @@ func resourceArmAutomationVariable() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - }, + ValidateFunc: validate.NoEmptyStrings, + }, "resource_group_name": resourceGroupNameSchema(), @@ -41,7 +42,8 @@ func resourceArmAutomationVariable() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - }, + ValidateFunc: validate.NoEmptyStrings, + }, "description": { Type: schema.TypeString, @@ -62,7 +64,7 @@ func resourceArmAutomationVariable() *schema.Resource { } } -func resourceArmAutomationVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceArmAutomationStringVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).automationVariableClient ctx := meta.(*ArmClient).StopContext @@ -74,6 +76,7 @@ func resourceArmAutomationVariableCreateUpdate(d *schema.ResourceData, meta inte encrypted := d.Get("encrypted").(bool) parameters := automation.VariableCreateOrUpdateParameters{ + Name: utils.String(name), VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ Description: utils.String(description), Value: utils.String(value), @@ -83,29 +86,29 @@ func resourceArmAutomationVariableCreateUpdate(d *schema.ResourceData, meta inte if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { - return fmt.Errorf("Error creating Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error creating Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } resp, err := client.Get(ctx, resourceGroup, accountName, name) if err != nil { - return fmt.Errorf("Error retrieving Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error retrieving Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Automation Variable %q (Resource Group %q, Automation Account Name %q) ID", name, resourceGroup, accountName) + return fmt.Errorf("Cannot read Automation String Variable %q (Resource Group %q, Automation Account Name %q) ID", name, resourceGroup, accountName) } d.SetId(*resp.ID) - return resourceArmAutomationVariableRead(d, meta) + return resourceArmAutomationStringVariableRead(d, meta) } -func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) error { +func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).automationVariableClient ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Automation Variable ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Automation String Variable ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] @@ -114,13 +117,16 @@ func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) resp, err := client.Get(ctx, resourceGroup, accountName, name) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Automation Variable %q does not exist - removing from state", d.Id()) + log.Printf("[INFO] Automation String Variable %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error reading Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } + if err := ensureAutomationVariableType("azurerm_automation_string_variable"); err != nil { + return err + } d.Set("name", resp.Name) @@ -128,7 +134,11 @@ func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) d.Set("automation_account_name", accountName) if properties := resp.VariableProperties; properties != nil { d.Set("description", properties.Description) - d.Set("value", properties.Value) + if properties.IsEncrypted == nil || *properties.IsEncrypted == false { + if value := properties.Value; value != nil { + d.Set("value", strconv.Unquote(*value)) + } + } d.Set("encrypted", properties.IsEncrypted) } @@ -136,21 +146,21 @@ func resourceArmAutomationVariableRead(d *schema.ResourceData, meta interface{}) } -func resourceArmAutomationVariableDelete(d *schema.ResourceData, meta interface{}) error { +func resourceArmAutomationStringVariableDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).automationVariableClient ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Automation Variable ID %q: %+v", d.Id(), err) + return fmt.Errorf("Error parsing Automation String Variable ID %q: %+v", d.Id(), err) } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] name := id.Path["variables"] if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { - return fmt.Errorf("Error deleting Automation Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error deleting Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_automation_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go similarity index 61% rename from build/azterraform/azurerm/resource_arm_automation_variable_test.go rename to build/azterraform/azurerm/resource_arm_automation_string_variable_test.go index edd97753f271..19defd0634cb 100644 --- a/build/azterraform/azurerm/resource_arm_automation_variable_test.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go @@ -24,21 +24,21 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func TestAccAzureRMAutomationVariable_basic(t *testing.T) { - resourceName := "azurerm_automation_variable.test" +func TestAccAzureRMAutomationStringVariable_basic(t *testing.T) { + resourceName := "azurerm_automation_string_variable.test" rInt := tf.AccRandTimeInt() location := testLocation() - config := testAccAzureRMAutomationVariable_basic(rInt, location) + config := testAccAzureRMAutomationStringVariable_basic(rInt, location) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationVariableDestroy, + CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, Steps: []resource.TestStep{ { Config: config, Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationVariableExists(resourceName), + testCheckAzureRMAutomationStringVariableExists(resourceName), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), ), }, @@ -51,21 +51,21 @@ func TestAccAzureRMAutomationVariable_basic(t *testing.T) { }) } -func TestAccAzureRMAutomationVariable_complete(t *testing.T) { - resourceName := "azurerm_automation_variable.test" +func TestAccAzureRMAutomationStringVariable_complete(t *testing.T) { + resourceName := "azurerm_automation_string_variable.test" rInt := tf.AccRandTimeInt() location := testLocation() - config := testAccAzureRMAutomationVariable_complete(rInt, location) + config := testAccAzureRMAutomationStringVariable_complete(rInt, location) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationVariableDestroy, + CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, Steps: []resource.TestStep{ { Config: config, Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationVariableExists(resourceName), + testCheckAzureRMAutomationStringVariableExists(resourceName), resource.TestCheckResourceAttr(resourceName, "description", "This is a variable created by Terraform acceptance test."), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), ), @@ -79,22 +79,60 @@ func TestAccAzureRMAutomationVariable_complete(t *testing.T) { }) } +func TestAccAzureRMAutomationStringVariable_basicCompleteUpdate(t *testing.T) { + resourceName := "azurerm_automation_string_variable.test" + rInt := tf.AccRandTimeInt() + location := testLocation() + basicConfig := testAccAzureRMAutomationStringVariable_basic(rInt, location) + completeConfig := testAccAzureRMAutomationStringVariable_complete(rInt, location) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, + Steps: []resource.TestStep{ + { + Config: basicConfig, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationStringVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), + ), + }, + { + Config: completeConfig, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationStringVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "description", "This is a variable created by Terraform acceptance test."), + resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), + ), + }, + { + Config: basicConfig, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationStringVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), + ), + }, + }, + }) +} + -func testCheckAzureRMAutomationVariableExists(resourceName string) resource.TestCheckFunc { +func testCheckAzureRMAutomationStringVariableExists(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[resourceName] if !ok { - return fmt.Errorf("Automation Variable not found: %s", resourceName) + return fmt.Errorf("Automation String Variable not found: %s", resourceName) } name := rs.Primary.Attributes["name"] resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group name found in state for Automation Variable: %q", name) + return fmt.Errorf("Bad: no resource group name found in state for Automation String Variable: %q", name) } accountName, hasAccountName := rs.Primary.Attributes["automation_account_name"] if !hasAccountName { - return fmt.Errorf("Bad: no automation account name found in state for Automation Variable: %q", name) + return fmt.Errorf("Bad: no automation account name found in state for Automation String Variable: %q", name) } client := testAccProvider.Meta().(*ArmClient).automationVariableClient @@ -102,7 +140,7 @@ func testCheckAzureRMAutomationVariableExists(resourceName string) resource.Test if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Automation Variable %q (Resource Group %q, Automation Account Name %q) does not exist", name, resourceGroup, accountName) + return fmt.Errorf("Bad: Automation String Variable %q (Resource Group %q, Automation Account Name %q) does not exist", name, resourceGroup, accountName) } return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) } @@ -111,12 +149,12 @@ func testCheckAzureRMAutomationVariableExists(resourceName string) resource.Test } } -func testCheckAzureRMAutomationVariableDestroy(s *terraform.State) error { +func testCheckAzureRMAutomationStringVariableDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*ArmClient).automationVariableClient ctx := testAccProvider.Meta().(*ArmClient).StopContext for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_automation_variable" { + if rs.Type != "azurerm_automation_string_variable" { continue } @@ -136,7 +174,7 @@ func testCheckAzureRMAutomationVariableDestroy(s *terraform.State) error { return nil } -func testAccAzureRMAutomationVariable_basic(rInt int, location string) string { +func testAccAzureRMAutomationStringVariable_basic(rInt int, location string) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestRG-%d" @@ -153,7 +191,7 @@ resource "azurerm_automation_account" "test" { } } -"azurerm_automation_variable" "test" { +"azurerm_automation_string_variable" "test" { name = "acctestAutoVar-%d" resource_group_name = "${azurerm_resource_group.test.name}" automation_account_name = "${azurerm_automation_account.test.name}" @@ -162,7 +200,7 @@ resource "azurerm_automation_account" "test" { `, rInt, location, rInt, rInt) } -func testAccAzureRMAutomationVariable_complete(rInt int, location string) string { +func testAccAzureRMAutomationStringVariable_complete(rInt int, location string) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestRG-%d" @@ -179,7 +217,7 @@ resource "azurerm_automation_account" "test" { } } -"azurerm_automation_variable" "test" { +"azurerm_automation_string_variable" "test" { name = "acctestAutoVar-%d" resource_group_name = "${azurerm_resource_group.test.name}" automation_account_name = "${azurerm_automation_account.test.name}" diff --git a/build/azterraform/website/docs/r/automation_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown similarity index 82% rename from build/azterraform/website/docs/r/automation_variable.html.markdown rename to build/azterraform/website/docs/r/automation_string_variable.html.markdown index 6991b7231910..f67b9a9a4e46 100644 --- a/build/azterraform/website/docs/r/automation_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -13,13 +13,13 @@ # # ---------------------------------------------------------------------------- layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_automation_variable" -sidebar_current: "docs-azurerm-resource-automation-variable" +page_title: "Azure Resource Manager: azurerm_automation_string_variable" +sidebar_current: "docs-azurerm-resource-automation-string-variable" description: |- Manages an automation variable on Azure. --- -# azurerm_automation_variable +# azurerm_automation_string_variable Manages an automation variable on Azure. @@ -72,12 +72,12 @@ The following arguments are supported: The following attributes are exported: -* `id` - The automation variable ID. +* `id` - The automation string variable ID. ## Import -AutomationVariable can be imported using the `resource id`, e.g. +AutomationStringVariable can be imported using the `resource id`, e.g. ```shell -$ terraform import azurerm_automation_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.Automation/TODO.ID_PORTION/example``` +$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.Automation/TODO.ID_PORTION/example``` diff --git a/products/azautomationstringvariable/check_type_after_read.erb b/products/azautomationstringvariable/check_type_after_read.erb new file mode 100644 index 000000000000..6dc1bf99bc2c --- /dev/null +++ b/products/azautomationstringvariable/check_type_after_read.erb @@ -0,0 +1,3 @@ +if err := ensureAutomationVariableType("azurerm_automation_string_variable"); err != nil { + return err +} \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index a20870602359..b884a2abebfa 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -10,6 +10,11 @@ overrides: !ruby/object:Provider::ResourceOverrides automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation function: validate.NoEmptyStrings + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb + custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb + custom_code: !ruby/object:Provider::Terraform::CustomCode + post_read: products/azautomationstringvariable/check_type_after_read.erb acctests: basic: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition custom_dependencies_code: | diff --git a/products/azautomationstringvariable/terraform_get_value.erb b/products/azautomationstringvariable/terraform_get_value.erb new file mode 100644 index 000000000000..ab5863db92fc --- /dev/null +++ b/products/azautomationstringvariable/terraform_get_value.erb @@ -0,0 +1,5 @@ +<% if input_var == 'd' -%> +<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) +<% else -%> +// Terraform_Get_Value is not supported. +<% end -%> \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb new file mode 100644 index 000000000000..a8acb03f5c9c --- /dev/null +++ b/products/azautomationstringvariable/terraform_set_value.erb @@ -0,0 +1,9 @@ +<% if output_var == 'd' -%> +if properties.IsEncrypted == nil || *properties.IsEncrypted == false { + if value := <%= input_var -%>; value != nil { + d.Set("<%= prop_name -%>", strconv.Unquote(*value)) + } +} +<% else -%> +// Terraform_Set_Value is not supported. +<% end -%> \ No newline at end of file diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 6ef659885aa3..0e0d3bb27d8f 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -2,6 +2,9 @@ require 'provider/azure/terraform/sub_template' require 'provider/azure/terraform/acctest/sub_template' +require 'provider/azure/terraform/resource_override' +require 'provider/azure/terraform/property_override' + module Provider module Azure module Terraform @@ -9,6 +12,10 @@ module Terraform include Provider::Azure::Terraform::SubTemplate include Provider::Azure::Terraform::AccTest::SubTemplate + def azure_resource_go_package(product) + product.azure_namespace.split('.').last.downcase + end + def order_azure_properties(properties) special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb new file mode 100644 index 000000000000..69d7838c01c1 --- /dev/null +++ b/provider/azure/terraform/property_override.rb @@ -0,0 +1,30 @@ +require 'provider/terraform/property_override' + +module Provider + module Azure + module Terraform + module OverrideFields + attr_reader :custom_schema_get + attr_reader :custom_schema_set + include Provider::Terraform::OverrideFields + end + + class PropertyOverride < Provider::Terraform::PropertyOverride + include Provider::Azure::Terraform::OverrideFields + + def validate + super + check_optional_property :custom_schema_get, String + check_optional_property :custom_schema_set, String + end + + private + + def overriden + Provider::Azure::Terraform::OverrideFields + end + + end + end + end +end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index efca32aea36a..a889aca009e5 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -18,10 +18,6 @@ def validate post_initialization end - def apply(resource) - super - end - class AccTestDefinition < Api::Object attr_reader :based_on attr_reader :steps @@ -39,7 +35,7 @@ def validate check_optional_property :based_on, String check_optional_property :check_import, :boolean - @check_import = true if @check_import.nil? + @check_import = (@steps.length == 1) if @check_import.nil? check_optional_property :custom_dependencies_code, String check_optional_property :properties, Hash diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index d6daa943dc5c..4b4b7e288f12 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -56,6 +56,7 @@ def schema_property_get_template(property) end def schema_property_set_template(property) + return property.custom_schema_set if property.instance_variable_defined?(:@custom_schema_set) && !property.custom_schema_set.nil? case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_set.erb' diff --git a/provider/terraform.rb b/provider/terraform.rb index f5e6339031ef..c84a7fefcdc2 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -21,7 +21,6 @@ require 'google/golang_utils' require 'provider/azure/terraform' -require 'provider/azure/terraform/resource_override' module Provider # Code generator for Terraform Resources that manage Google Cloud Platform @@ -66,14 +65,6 @@ def tf_types } end - # BEGIN Azure Specific Methods - - def azure_resource_go_package(product) - product.azure_namespace.split('.').last.downcase - end - - # END Azure Specific Methods - def updatable?(resource, properties) !resource.input || !properties.reject { |p| p.update_url.nil? }.empty? end diff --git a/provider/terraform/custom_code.rb b/provider/terraform/custom_code.rb index 0595f2bd3469..dee30f02fc5a 100644 --- a/provider/terraform/custom_code.rb +++ b/provider/terraform/custom_code.rb @@ -229,6 +229,10 @@ class CustomCode < Api::Object # This code is run after the Create call succeeds. It's placed # in the Create function directly without modification. attr_reader :post_create + # This code is run after the Read call succeeds and before setting + # schema attributes. It's placed in the Read function directly + # without modification. + attr_reader :post_read # This code is run before the Update call happens. It's placed # in the Update function, just after the encoder call, before # the Update call. Just like the encoder, it is only used if diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 0860a81ec1a7..5f8f5fc4e4f6 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -173,6 +173,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } +<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> + <% unless object.self_link_query.nil? -%> <%# This part of the template extracts the one resource we're interested in from the list that gets returned. self_link_query is a field which @@ -183,13 +185,6 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) resource_name: resource_name) -%> <% end -%> -<% if object.custom_code.decoder -%> - res, err = resource<%= resource_name -%>Decoder(d, meta, res) - if err != nil { - return err - } -<% end -%> - <%= lines(build_sdk_object_to_property("resp", "", nil, object.azure_sdk_definition.read.response, object, 0)) -%> return nil From 4614c7bd25cdab5b2099ad3d38ac69bfe92499f8 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 27 Feb 2019 13:49:33 +0800 Subject: [PATCH 033/175] Refine automation variable implementation. --- .../azurerm/resource_arm_automation_string_variable.go | 7 ++++--- .../azautomationstringvariable/check_type_after_read.erb | 2 +- .../azautomationstringvariable/terraform_set_value.erb | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go index 27132729eb5d..34fb8cfdc945 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -124,7 +124,7 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf return fmt.Errorf("Error reading Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) } - if err := ensureAutomationVariableType("azurerm_automation_string_variable"); err != nil { + if err := validateAzureRmAutomationVariableType("azurerm_automation_string_variable"); err != nil { return err } @@ -135,8 +135,9 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf if properties := resp.VariableProperties; properties != nil { d.Set("description", properties.Description) if properties.IsEncrypted == nil || *properties.IsEncrypted == false { - if value := properties.Value; value != nil { - d.Set("value", strconv.Unquote(*value)) + if escapedValue := properties.Value; escapedValue != nil { + value, _ := strconv.Unquote(*escapedValue) + d.Set("value", value) } } d.Set("encrypted", properties.IsEncrypted) diff --git a/products/azautomationstringvariable/check_type_after_read.erb b/products/azautomationstringvariable/check_type_after_read.erb index 6dc1bf99bc2c..2a87254ee872 100644 --- a/products/azautomationstringvariable/check_type_after_read.erb +++ b/products/azautomationstringvariable/check_type_after_read.erb @@ -1,3 +1,3 @@ -if err := ensureAutomationVariableType("azurerm_automation_string_variable"); err != nil { +if err := validateAzureRmAutomationVariableType("azurerm_automation_string_variable"); err != nil { return err } \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb index a8acb03f5c9c..75df656b2099 100644 --- a/products/azautomationstringvariable/terraform_set_value.erb +++ b/products/azautomationstringvariable/terraform_set_value.erb @@ -1,7 +1,8 @@ <% if output_var == 'd' -%> if properties.IsEncrypted == nil || *properties.IsEncrypted == false { - if value := <%= input_var -%>; value != nil { - d.Set("<%= prop_name -%>", strconv.Unquote(*value)) + if escapedValue := <%= input_var -%>; escapedValue != nil { + value, _ := strconv.Unquote(*escapedValue) + d.Set("<%= prop_name -%>", value) } } <% else -%> From 28fcf3790b287150436b9d4a59d395f4c81b7fe7 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 27 Feb 2019 15:00:55 +0800 Subject: [PATCH 034/175] Introduce Service Bus Disaster Recovery resource. --- ...rm_service_bus_disaster_recovery_config.go | 148 ++++++++++++++++++ ...rvice_bus_disaster_recovery_config_test.go | 82 ++++++++++ ...bus_disaster_recovery_config.html.markdown | 68 ++++++++ products/azservicebusrecovery/api.yaml | 134 ++++++++++++++++ products/azservicebusrecovery/terraform.yaml | 10 ++ 5 files changed, 442 insertions(+) create mode 100644 build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go create mode 100644 build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go create mode 100644 build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown create mode 100644 products/azservicebusrecovery/api.yaml create mode 100644 products/azservicebusrecovery/terraform.yaml diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go new file mode 100644 index 000000000000..d9693bdfdaad --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go @@ -0,0 +1,148 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmServiceBusDisasterRecoveryConfig() *schema.Resource { + return &schema.Resource{ + Create: resourceArmServiceBusDisasterRecoveryConfigCreateUpdate, + Read: resourceArmServiceBusDisasterRecoveryConfigRead, + Update: resourceArmServiceBusDisasterRecoveryConfigCreateUpdate, + Delete: resourceArmServiceBusDisasterRecoveryConfigDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "namespace_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "alternate_name": { + Type: schema.TypeString, + Optional: true, + }, + + "partner_namespace": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).serviceBusRecoveryClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + servicebusName := d.Get("namespace_name").(string) + partnerNamespace := d.Get("partner_namespace").(string) + alternateName := d.Get("alternate_name").(string) + + parameters := servicebus.ArmDisasterRecovery{ + ArmDisasterRecoveryProperties: &servicebus.ArmDisasterRecoveryProperties{ + PartnerNamespace: utils.String(partnerNamespace), + AlternateName: utils.String(alternateName), + }, + } + + + if _, err := client.CreateOrUpdate(ctx, resourceGroup, servicebusName, name, parameters); err != nil { + return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + } + + + resp, err := client.Get(ctx, resourceGroup, servicebusName, name) + if err != nil { + return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q) ID", name, resourceGroup, servicebusName) + } + d.SetId(*resp.ID) + + return resourceArmServiceBusDisasterRecoveryConfigRead(d, meta) +} + +func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).serviceBusRecoveryClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing Service Bus Disaster Recovery Config ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + servicebusName := id.Path["namespaces"] + name := id.Path["disasterRecoveryConfigs"] + + resp, err := client.Get(ctx, resourceGroup, servicebusName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Service Bus Disaster Recovery Config %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + } + + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("namespace_name", servicebusName) + if armDisasterRecoveryProperties := resp.ArmDisasterRecoveryProperties; armDisasterRecoveryProperties != nil { + d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) + d.Set("alternate_name", armDisasterRecoveryProperties.AlternateName) + } + + return nil +} + + +func resourceArmServiceBusDisasterRecoveryConfigDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).serviceBusRecoveryClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing Service Bus Disaster Recovery Config ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + servicebusName := id.Path["namespaces"] + name := id.Path["disasterRecoveryConfigs"] + + if _, err := client.Delete(ctx, resourceGroup, servicebusName, name); err != nil { + return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go new file mode 100644 index 000000000000..7565d9b38ed5 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go @@ -0,0 +1,82 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMServiceBusDisasterRecoveryConfigExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Service Bus Disaster Recovery Config not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] + if !hasResourceGroup { + return fmt.Errorf("Bad: no resource group name found in state for Service Bus Disaster Recovery Config: %q", name) + } + servicebusName, hasServicebusName := rs.Primary.Attributes["namespace_name"] + if !hasServicebusName { + return fmt.Errorf("Bad: no namespace name found in state for Service Bus Disaster Recovery Config: %q", name) + } + + client := testAccProvider.Meta().(*ArmClient).serviceBusRecoveryClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q) does not exist", name, resourceGroup, servicebusName) + } + return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMServiceBusDisasterRecoveryConfigDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).serviceBusRecoveryClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_service_bus_disaster_recovery_config" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + servicebusName := rs.Primary.Attributes["namespace_name"] + + if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown new file mode 100644 index 000000000000..e1fc2bf4869d --- /dev/null +++ b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown @@ -0,0 +1,68 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_service_bus_disaster_recovery_config" +sidebar_current: "docs-azurerm-resource-service-bus-disaster-recovery-config" +description: |- + Manages a service bus disaster recovery config on Azure. +--- + +# azurerm_service_bus_disaster_recovery_config + +Manages a service bus disaster recovery config on Azure. + + + +## Example Usage - Resource Group + + +```hcl +resource "azurerm_resource_group" "example" { + name = "ExampleRG" + location = "West US" + + tags { + environment = "Production" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the service bus disaster recovery. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which to create the service bus disaster recovery. Changing this forces a new resource to be created. + +* `namespace_name` - (Required) The name of the service bus namespace in which the config is created. Changing this forces a new resource to be created. + +* `partner_namespace` - (Optional) The description of the service bus disaster recovery. + +* `alternate_name` - (Optional) The value of the service bus disaster recovery. + +## Attributes Reference + +The following attributes are exported: + +* `id` - The service bus disaster recovery config ID. + + + +## Import + +ServiceBusDisasterRecoveryConfig can be imported using the `resource id`, e.g. +```shell +$ terraform import azurerm_service_bus_disaster_recovery_config.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/servicebus/TODO.ID_PORTION/example``` diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml new file mode 100644 index 000000000000..46b758799ce4 --- /dev/null +++ b/products/azservicebusrecovery/api.yaml @@ -0,0 +1,134 @@ +--- !ruby/object:Api::Product +name: Azure Service Bus Disaster Recovery Config +prefix: arm +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'servicebus' +azure_version: '2017-04-01' +objects: + - !ruby/object:Api::Resource + name: ServiceBusDisasterRecoveryConfig + api_name: ServiceBusRecovery + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: servicebus + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: namespaces + go_variable_name: servicebusName + 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: disasterRecoveryConfigs + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: ArmDisasterRecovery + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: ArmDisasterRecoveryProperties + go_type_name: ArmDisasterRecoveryProperties + '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: AlternateName + '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: PartnerNamespace + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: namespaces + go_variable_name: servicebusName + 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: disasterRecoveryConfigs + go_variable_name: name + response: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: servicebusName + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: ArmDisasterRecovery + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: ArmDisasterRecoveryProperties + go_type_name: ArmDisasterRecoveryProperties + '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: AlternateName + '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: PartnerNamespace + update: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: namespaces + go_variable_name: servicebusName + 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: disasterRecoveryConfigs + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: ArmDisasterRecovery + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: ArmDisasterRecoveryProperties + go_type_name: ArmDisasterRecoveryProperties + '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: AlternateName + '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: PartnerNamespace + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: namespaces + go_variable_name: servicebusName + 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: disasterRecoveryConfigs + go_variable_name: name + + description: | + Manages a service bus disaster recovery config on Azure. + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the service bus disaster recovery.' + required: true + input: true + azure_sdk_references: ['alias', '/name'] + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the service bus disaster recovery.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'namespaceName' + description: 'The name of the service bus namespace in which the config is created.' + required: true + input: true + azure_sdk_references: ['namespaceName'] + - !ruby/object:Api::Type::String + name: 'partnerNamespace' + description: 'The description of the service bus disaster recovery.' + azure_sdk_references: ['/properties/partnerNamespace'] + - !ruby/object:Api::Type::String + name: 'AlternateName' + description: 'The value of the service bus disaster recovery.' + azure_sdk_references: ['/properties/alternateName'] diff --git a/products/azservicebusrecovery/terraform.yaml b/products/azservicebusrecovery/terraform.yaml new file mode 100644 index 000000000000..2af7686284ce --- /dev/null +++ b/products/azservicebusrecovery/terraform.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Terraform::Config +name: Arm +overrides: !ruby/object:Provider::ResourceOverrides + ServiceBusDisasterRecoveryConfig: !ruby/object:Provider::Terraform::ResourceOverride + example: + - !ruby/object:Provider::Terraform::Examples + name: "resource_group" + primary_resource_id: "example" + vars: + rg_name: "ExampleRG" From 7f9193cef80afc0caaf6f7ea92e716e0988b337e Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 4 Mar 2019 17:24:01 +0800 Subject: [PATCH 035/175] Add customizable properties order. --- api/type.rb | 4 ++++ .../resource_arm_automation_string_variable.go | 12 ++++++------ ...arm_service_bus_disaster_recovery_config.go | 6 +++--- products/azautomationstringvariable/api.yaml | 18 +++++++++++------- .../terraform_set_value.erb | 6 +++--- products/azcontainerregistry/api.yaml | 4 ++++ products/azresourcegroup/api.yaml | 2 ++ products/azservicebusrecovery/api.yaml | 3 +++ provider/azure/terraform/schema.rb | 1 + .../terraform/acctest/resource_test_hcl.erb | 2 +- .../sdktypes/property_to_sdkobject.erb | 2 +- .../sdktypes/sdkobject_to_property.erb | 2 +- .../examples/base_configs/test_file.go.erb | 2 +- templates/terraform/resource.erb | 4 ++-- 14 files changed, 43 insertions(+), 25 deletions(-) diff --git a/api/type.rb b/api/type.rb index 4b3a0bb4c0aa..9923efb50e72 100644 --- a/api/type.rb +++ b/api/type.rb @@ -42,6 +42,7 @@ module Fields # Can only be overriden - we should never set this ourselves. attr_reader :new_type + attr_reader :order attr_reader :azure_sdk_references end @@ -71,6 +72,9 @@ def validate :update_verb, %i[POST PUT PATCH NONE], @__resource&.update_verb, Symbol check_optional_property :update_url, ::String + check_optional_property :order, ::Integer + @order ||= 1000 + check_property :azure_sdk_references, ::Array check_property_non_empty_list :azure_sdk_references, ::String diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go index 34fb8cfdc945..4366fd2ff95a 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -72,15 +72,15 @@ func resourceArmAutomationStringVariableCreateUpdate(d *schema.ResourceData, met resourceGroup := d.Get("resource_group_name").(string) accountName := d.Get("automation_account_name").(string) description := d.Get("description").(string) - value := d.Get("value").(string) encrypted := d.Get("encrypted").(bool) + value := strconv.Quote(d.Get("value").(string)) parameters := automation.VariableCreateOrUpdateParameters{ Name: utils.String(name), VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ Description: utils.String(description), - Value: utils.String(value), IsEncrypted: utils.Bool(encrypted), + Value: utils.String(value), }, } @@ -134,13 +134,13 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf d.Set("automation_account_name", accountName) if properties := resp.VariableProperties; properties != nil { d.Set("description", properties.Description) - if properties.IsEncrypted == nil || *properties.IsEncrypted == false { - if escapedValue := properties.Value; escapedValue != nil { - value, _ := strconv.Unquote(*escapedValue) + d.Set("encrypted", properties.IsEncrypted) + if !d.Get("encrypted").(bool) { + if quotedValue := properties.Value; quotedValue != nil { + value, _ := strconv.Unquote(*quotedValue) d.Set("value", value) } } - d.Set("encrypted", properties.IsEncrypted) } return nil diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go index d9693bdfdaad..9495884f6ec9 100644 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go @@ -63,13 +63,13 @@ func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceD name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) servicebusName := d.Get("namespace_name").(string) - partnerNamespace := d.Get("partner_namespace").(string) alternateName := d.Get("alternate_name").(string) + partnerNamespace := d.Get("partner_namespace").(string) parameters := servicebus.ArmDisasterRecovery{ ArmDisasterRecoveryProperties: &servicebus.ArmDisasterRecoveryProperties{ - PartnerNamespace: utils.String(partnerNamespace), AlternateName: utils.String(alternateName), + PartnerNamespace: utils.String(partnerNamespace), }, } @@ -119,8 +119,8 @@ func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, met d.Set("resource_group_name", resourceGroup) d.Set("namespace_name", servicebusName) if armDisasterRecoveryProperties := resp.ArmDisasterRecoveryProperties; armDisasterRecoveryProperties != nil { - d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) d.Set("alternate_name", armDisasterRecoveryProperties.AlternateName) + d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) } return nil diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 52a05cbffd40..e57e51aa8c19 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -113,25 +113,29 @@ objects: description: | Manages an automation variable on Azure. - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] + parameters: - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Automation Variable.' required: true input: true + order: 991 azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: 'automationAccountName' description: 'The name of the automation account in which the Variable is created.' required: true input: true + order: 992 azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + order: 990 + azure_sdk_references: ['variableName', '/name'] - !ruby/object:Api::Type::String name: 'description' description: 'The description of the Automation Variable.' diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb index 75df656b2099..b255691894d9 100644 --- a/products/azautomationstringvariable/terraform_set_value.erb +++ b/products/azautomationstringvariable/terraform_set_value.erb @@ -1,7 +1,7 @@ <% if output_var == 'd' -%> -if properties.IsEncrypted == nil || *properties.IsEncrypted == false { - if escapedValue := <%= input_var -%>; escapedValue != nil { - value, _ := strconv.Unquote(*escapedValue) +if !d.Get("encrypted").(bool) { + if quotedValue := <%= input_var -%>; quotedValue != nil { + value, _ := strconv.Unquote(*quotedValue) d.Set("<%= prop_name -%>", value) } } diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 16f25553cf7c..7ece3d5983b4 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -144,18 +144,21 @@ objects: required: true input: true azure_sdk_references: ['registryName', '/name'] + order: 800 - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Container Registry.' required: true input: true azure_sdk_references: ['resourceGroupName'] + order: 810 - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'Specifies the supported Azure location where the resource exists.' required: true input: true azure_sdk_references: ['/location'] + order: 820 - !ruby/object:Api::Type::Enum name: 'sku' values: @@ -166,6 +169,7 @@ objects: description: 'The SKU name of the the container registry.' default_value: :Classic azure_sdk_references: ['/sku/name'] + order: 830 - !ruby/object:Api::Type::Boolean name: 'adminEnabled' description: 'Specifies whether the admin user is enabled.' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index e0ba29ac3357..867ae606af87 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -74,12 +74,14 @@ objects: required: true input: true azure_sdk_references: ['name', '/name'] + order: 800 - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'The location where the resource group should be created.' required: true input: true azure_sdk_references: ['/location'] + order: 900 - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the resource group.' diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index 46b758799ce4..f5cf63a4d270 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -111,18 +111,21 @@ objects: description: 'The name of the service bus disaster recovery.' required: true input: true + order: 800 azure_sdk_references: ['alias', '/name'] - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the service bus disaster recovery.' required: true input: true + order: 810 azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: 'namespaceName' description: 'The name of the service bus namespace in which the config is created.' required: true input: true + order: 820 azure_sdk_references: ['namespaceName'] - !ruby/object:Api::Type::String name: 'partnerNamespace' diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 4b4b7e288f12..2b473ac4b828 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -45,6 +45,7 @@ def schema_property_template(property) end def schema_property_get_template(property) + return property.custom_schema_get if property.instance_variable_defined?(:@custom_schema_get) && !property.custom_schema_get.nil? case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' diff --git a/templates/azure/terraform/acctest/resource_test_hcl.erb b/templates/azure/terraform/acctest/resource_test_hcl.erb index bcf8d29eb171..c073513f0c68 100644 --- a/templates/azure/terraform/acctest/resource_test_hcl.erb +++ b/templates/azure/terraform/acctest/resource_test_hcl.erb @@ -12,7 +12,7 @@ prop_len = longest_prop_name.nil? ? 0 : longest_prop_name.underscore.length -%> "<%= "azurerm_" + object.name.underscore -%>" "<%= resource_id -%>" { -<% object.properties.each do |prop| -%> +<% object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% if merged_props.has_key?(prop.name) -%> <%= prop.name.underscore.ljust(prop_len) -%> = "<%= merged_props[prop.name] -%>" <% end -%> diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index dbcf42e6cac3..5b78c6ac12fb 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -10,7 +10,7 @@ end direct_children = Hash.new - object.all_user_properties.each do |prop| + object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "/" && child_api_path.start_with?(api_path) sub_paths = child_api_path.split("/") diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 914d10ae2f50..3182193136a2 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -9,7 +9,7 @@ if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; < end direct_children = Hash.new - object.all_user_properties.each do |prop| + object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "" sub_paths = child_api_path.split("/") diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 244730df576f..0a7a05a781a8 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -49,7 +49,7 @@ func TestAcc<%= resource_name -%>_<%= testName -%>(t *testing.T) { end hcl = hcl.based_on.nil? ? nil : object.acctests[hcl.based_on] end - props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.properties.find{|p| p.name == pn}.azure_sdk_references[0]) } + props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.all_user_properties.find{|p| p.name == pn}.azure_sdk_references[0]) } -%> { Config: <%= step.config_name -%>, diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 5f8f5fc4e4f6..3478e15992ba 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -101,9 +101,9 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext -<% settable_properties.each do |prop| -%> +<% settable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> -<% output_var = var_name.nil? ? prop.name.camelcase(:lower) : var_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> From cd914a5fd0df0ecb2ef4fdddecc5885f56b87498 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 5 Mar 2019 01:05:36 +0800 Subject: [PATCH 036/175] Add StringMap SDK Type. --- api/azure/sdk_type_definition.rb | 3 +++ provider/azure/terraform/property_override.rb | 2 ++ provider/azure/terraform/resource_override.rb | 1 + provider/azure/terraform/schema.rb | 9 +++++++-- provider/terraform/property_override.rb | 5 ----- templates/azure/terraform/schemas/location.erb | 2 +- templates/azure/terraform/schemas/tags.erb | 2 +- .../terraform/sdktypes/property_to_sdkstringmap.erb | 1 + .../terraform/sdktypes/sdkstringmap_to_property.erb | 2 ++ templates/terraform/schemas/primitive.erb | 12 ++++++------ 10 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb create mode 100644 templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 0043e814dd31..8a5dc161c6f4 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -29,6 +29,9 @@ def validate end end + class StringMapObject < SDKTypeDefinition + end + class ComplexObject < SDKTypeDefinition attr_reader :go_type_name diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 69d7838c01c1..dfe4221a23c0 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -4,6 +4,7 @@ module Provider module Azure module Terraform module OverrideFields + attr_reader :custom_schema_definition attr_reader :custom_schema_get attr_reader :custom_schema_set include Provider::Terraform::OverrideFields @@ -14,6 +15,7 @@ class PropertyOverride < Provider::Terraform::PropertyOverride def validate super + check_optional_property :custom_schema_definition, String check_optional_property :custom_schema_get, String check_optional_property :custom_schema_set, String end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index a889aca009e5..f2512f8773af 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -13,6 +13,7 @@ class ResourceOverride < Provider::Terraform::ResourceOverride def validate super + @acctests ||= Hash.new check_optional_property :acctests, Hash check_optional_property_hash :acctests, String, AccTestDefinition post_initialization diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 2b473ac4b828..26fc63bbd7e5 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -30,6 +30,7 @@ def expand_funcs end def schema_property_template(property) + return property.custom_schema_definition if property.instance_variable_defined?(:@custom_schema_definition) && !property.custom_schema_definition.nil? case property when Api::Azure::Type::ResourceGroupName 'templates/azure/terraform/schemas/resource_group_name.erb' @@ -37,7 +38,7 @@ def schema_property_template(property) 'templates/azure/terraform/schemas/location.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs 'templates/terraform/schemas/primitive.erb' else 'templates/terraform/schemas/unsupport.erb' @@ -63,7 +64,7 @@ def schema_property_set_template(property) 'templates/azure/terraform/schemas/location_set.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags_set.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs 'templates/terraform/schemas/basic_set.erb' else 'templates/terraform/schemas/unsupport.erb' @@ -76,6 +77,8 @@ def property_to_sdk_object_template(sdk_type_defs, api_path) 'templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/property_to_sdkenum.erb' + when Api::Azure::SDKTypeDefinition::StringMapObject + 'templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb' when Api::Azure::SDKTypeDefinition::ComplexObject 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' else @@ -90,6 +93,8 @@ def sdk_object_to_property_template(sdk_type_defs, api_path) 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/sdkenum_to_property.erb' + when Api::Azure::SDKTypeDefinition::StringMapObject + 'templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb' when Api::Azure::SDKTypeDefinition::ComplexObject 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' else diff --git a/provider/terraform/property_override.rb b/provider/terraform/property_override.rb index 4a00125d2e73..881257ad51e1 100644 --- a/provider/terraform/property_override.rb +++ b/provider/terraform/property_override.rb @@ -75,9 +75,6 @@ module OverrideFields # so the function header *is* part of the custom code template. # As with flatten, `property` and `prefix` are available. attr_reader :custom_expand - - # Azure Specific Properties - attr_reader :custom_schema end # Support for schema ValidateFunc functionality. @@ -121,8 +118,6 @@ def validate check_optional_property :custom_flatten, String check_optional_property :custom_expand, String - check_optional_property :custom_schema, String - raise "'default_value' and 'default_from_api' cannot be both set" \ if default_from_api && !default_value.nil? end diff --git a/templates/azure/terraform/schemas/location.erb b/templates/azure/terraform/schemas/location.erb index 387cb2a3f14b..16b413623d14 100644 --- a/templates/azure/terraform/schemas/location.erb +++ b/templates/azure/terraform/schemas/location.erb @@ -1 +1 @@ -"<%= prop_name -%>": locationSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": locationSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/tags.erb b/templates/azure/terraform/schemas/tags.erb index 4345628cb937..857afa535730 100644 --- a/templates/azure/terraform/schemas/tags.erb +++ b/templates/azure/terraform/schemas/tags.erb @@ -1 +1 @@ -"<%= prop_name -%>": tagsSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": tagsSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb b/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb new file mode 100644 index 000000000000..1375fb9257c8 --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb @@ -0,0 +1 @@ +<%= sdk_type_defs[api_path].go_field_name -%>: utils.ExpandStringMap(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb b/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb new file mode 100644 index 000000000000..df64e2f010a6 --- /dev/null +++ b/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb @@ -0,0 +1,2 @@ +<% input_var = "utils.FlattenStringMap(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> +<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index 1756ef2748cb..be792a182cc1 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -1,6 +1,3 @@ -<% if property.custom_schema -%> -"<%= property.name.underscore -%>": <%= compile_template(property.custom_schema, property: property) -%>, -<% else -%> <% if tf_types.include?(property.class) -%> "<%= property.name.underscore -%>": { <% if property.is_set -%> @@ -31,9 +28,13 @@ <% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> <% enum_values = property.values - enum_values.push "" unless property.required + # enum_values.push "" unless property.required -%> - ValidateFunc: validation.StringInSlice([]string{"<%= enum_values.join '","' -%>"}, false), + ValidateFunc: validation.StringInSlice([]string{ +<% enum_values.each do |val| -%> + string(<%= azure_resource_go_package(object.__product) -%>.<%= val -%>), +<% end -%> + }, false), <% end -%> <% if !property.diff_suppress_func.nil? -%> DiffSuppressFunc: <%= property.diff_suppress_func %>, @@ -125,4 +126,3 @@ <% else -%> // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> -<% end # property.custom_schema -%> From ca6b5f5c0cbfb3f76f478fb5a7437d25a74463ab Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Sat, 9 Mar 2019 02:02:19 +0800 Subject: [PATCH 037/175] Generate Ansible documentation part. --- .gitignore | 1 + api/azure/sdk_definition.rb | 4 + ...ure_rm_servicebusdisasterrecoveryconfig.py | 300 ++++++++++++++++++ .../tasks/main.yml | 107 +++++++ ...bus_disaster_recovery_config.html.markdown | 4 +- products/azservicebusrecovery/ansible.yaml | 19 ++ products/azservicebusrecovery/api.yaml | 8 +- .../service_bus_disaster_recovery_config.yaml | 10 + provider/ansible.rb | 3 +- provider/ansible/documentation.rb | 6 +- provider/ansible/example.rb | 4 +- provider/terraform.rb | 4 +- templates/ansible/resource.erb | 137 ++++---- templates/ansible/tasks/task.yaml.erb | 13 +- 14 files changed, 540 insertions(+), 80 deletions(-) create mode 100644 build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py create mode 100644 build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml create mode 100644 products/azservicebusrecovery/ansible.yaml create mode 100644 products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml diff --git a/.gitignore b/.gitignore index ee23455f777a..84cc36a031ce 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ coverage/* ehthumbs.db Thumbs.db +.vscode/ diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 0cb7a3954743..791446e464c1 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -5,6 +5,8 @@ module Api module Azure class SDKDefinition < Api::Object attr_reader :provider_name + attr_reader :python_client_namespace + attr_reader :python_client attr_reader :create attr_reader :read attr_reader :update @@ -13,6 +15,8 @@ class SDKDefinition < Api::Object def validate super check_optional_property :provider_name, String + check_optional_property :python_client_namespace, String + check_optional_property :python_client, String check_property :create, Api::Azure::SDKOperationDefinition check_property :read, Api::Azure::SDKOperationDefinition check_property :update, Api::Azure::SDKOperationDefinition diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py new file mode 100644 index 000000000000..921b20201c76 --- /dev/null +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py @@ -0,0 +1,300 @@ +#!/usr/bin/python +# +# Copyright (C) 2019 Zim Kalinowski (@zikalino)# +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ["preview"], + 'supported_by': 'community'} + + +DOCUMENTATION = ''' +--- +module: azure_rm_servicebusdisasterrecoveryconfig +version_added: "2.6" + +short_description: Manages a service bus disaster recovery config on Azure. + +description: + - Create, update and delete instance of Azure Service Bus Disaster Recovery Config. + +options: + name: + description: + - The name of the service bus disaster recovery. + required: true + resource_group_name: + description: + - The name of the resource group in which to create the service bus disaster + recovery. + required: true + namespace_name: + description: + - The name of the service bus namespace in which the config is created. + required: true + partner_namespace: + description: + - The parter namespace of the service bus disaster recovery. + required: false + alternate_name: + description: + - The alternative name of the service bus disaster recovery. + required: false + state: + description: + - Assert the state of the Service Bus Disaster Recovery Config. + - Use 'present' to create or update a Service Bus Disaster Recovery Config + and 'absent' to delete it. + default: present + choices: + - present + - absent + +extends_documentation_fragment: + - azure + +author: + - "Zim Kalinowski (@zikalino)" +''' + +EXAMPLES = ''' + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "test_object" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: present +''' + +RETURN = ''' +id: + description: + - The identifier of the DTL Virtual Machine resource. + returned: always + type: str +''' + +import time +from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.common.dict_transformations import _snake_to_camel + +try: + from msrestazure.azure_exceptions import CloudError + from msrest.polling import LROPoller + from msrestazure.azure_operation import AzureOperationPoller + from msrest.serialization import Model + from azure.mgmt.servicebus import ServiceBusManagementClient +except ImportError: + # This is handled in azure_rm_common + pass + + +class Actions: + NoAction, Create, Update, Delete = range(4) + +class AzureRMServiceBusDisasterRecoveryConfig(AzureRMModuleBase): + """Configuration class for an Azure RM Service Bus Disaster Recovery Config resource""" + + def __init__(self): + self.module_arg_spec = dict( + # TODO: Finish type declaration + ) + # TODO: Required If + # TODO: Argument Properties + # TODO: Module State + # TODO: Base Class Initialization + + # TODO: Main Module Execution + # TODO: Parameters -> Class Properties + # TODO: Parameters -> SDK + # TODO: Create Client Instance + # TODO: Response & Idempotency Check + # TODO: Perform Desired Action + # TODO: Format Response + + # TODO: Create/Update Function + + # TODO: Delete Function + + # TODO: Read Function + +''' + + module = GcpModule( + argument_spec=dict( + state=dict(default='present', choices=['present', 'absent'], type='str'), + name=dict(required=True, type='str'), + resource_group_name=dict(required=True, type='str'), + namespace_name=dict(required=True, type='str'), + partner_namespace=dict(type='str'), + alternate_name=dict(type='str') + ) + ) + + if not module.params['scopes']: + module.params['scopes'] = ['NotUsedInAzure'] + + state = module.params['state'] + + fetch = fetch_resource(module, self_link(module)) + changed = False + + if fetch: + if state == 'present': + if is_different(module, fetch): + update(module, self_link(module)) + fetch = fetch_resource(module, self_link(module)) + changed = True + else: + delete(module, self_link(module)) + fetch = {} + changed = True + else: + if state == 'present': + fetch = create(module, collection(module)) + changed = True + else: + fetch = {} + + fetch.update({'changed': changed}) + + module.exit_json(**fetch) + + +def create(module, link): + auth = GcpSession(module, 'zservicebusrecovery') + return return_if_object(module, auth.post(link, resource_to_request(module))) + + +def update(module, link): + auth = GcpSession(module, 'zservicebusrecovery') + return return_if_object(module, auth.put(link, resource_to_request(module))) + + +def delete(module, link): + auth = GcpSession(module, 'zservicebusrecovery') + return return_if_object(module, auth.delete(link)) + + +def resource_to_request(module): + request = { + u'name': module.params.get('name'), + u'resourceGroupName': module.params.get('resource_group_name'), + u'namespaceName': module.params.get('namespace_name'), + u'partnerNamespace': module.params.get('partner_namespace'), + u'AlternateName': module.params.get('alternate_name') + } + request = encode_request(request, module) + return_vals = {} + for k, v in request.items(): + if v: + return_vals[k] = v + + return return_vals + + +def fetch_resource(module, link, allow_not_found=True): + auth = GcpSession(module, 'zservicebusrecovery') + return return_if_object(module, auth.get(link), allow_not_found) + + +def self_link(module): + return "NotUsedInAzureNotUsedInAzure/{name}".format(**module.params) + + +def collection(module): + return "NotUsedInAzureNotUsedInAzure".format(**module.params) + + +def return_if_object(module, response, allow_not_found=False): + # If not found, return nothing. + if allow_not_found and response.status_code == 404: + return None + + # If no content, return nothing. + if response.status_code == 204: + return None + + try: + module.raise_for_status(response) + result = response.json() + except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: + module.fail_json(msg="Invalid JSON response with error: %s" % inst) + + result = decode_request(result, module) + + if navigate_hash(result, ['error', 'errors']): + module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) + + return result + + +def is_different(module, response): + request = resource_to_request(module) + response = response_to_hash(module, response) + request = decode_request(request, module) + + # Remove all output-only from response. + response_vals = {} + for k, v in response.items(): + if k in request: + response_vals[k] = v + + request_vals = {} + for k, v in request.items(): + if k in response: + request_vals[k] = v + + return GcpRequest(request_vals) != GcpRequest(response_vals) + + +# Remove unnecessary properties from the response. +# This is for doing comparisons with Ansible's current parameters. +def response_to_hash(module, response): + return { + u'name': module.params.get('name'), + u'resourceGroupName': module.params.get('resource_group_name'), + u'namespaceName': module.params.get('namespace_name'), + u'partnerNamespace': response.get(u'partnerNamespace'), + u'AlternateName': response.get(u'AlternateName') + } + + +def decode_request(response, module): + if 'name' in response: + response['name'] = response['name'].split('/')[-1] + return response + + +def encode_request(request, module): + request['name'] = '/'.join(['projects', module.params['project'], + 'topics', module.params['name']]) + return request + +''' + +def main(): + """Main execution""" + AzureRMServiceBusDisasterRecoveryConfig() + +if __name__ == '__main__': + main() diff --git a/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml new file mode 100644 index 000000000000..7459250b6b01 --- /dev/null +++ b/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml @@ -0,0 +1,107 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- +# Pre-test setup + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "{{ resource_name }}" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: absent +#---------------------------------------------------------- + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "{{ resource_name }}" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: present + register: result +- name: assert changed is true + assert: + that: + - result.changed == true +- name: verify that service_bus_disaster_recovery_config was created + gcp_zservicebusrecovery_service_bus_disaster_recovery_config_facts: + filters: + - name = {{ resource_name }} + project: "{{ gcp_project }}" + auth_kind: "{{ gcp_cred_kind }}" + service_account_file: "{{ gcp_cred_file }}" + scopes: + - NotUsedInAzure + register: results +- name: verify that command succeeded + assert: + that: + - results['items'] | length == 1 +# ---------------------------------------------------------------------------- + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "{{ resource_name }}" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: present + register: result +- name: assert changed is false + assert: + that: + - result.changed == false +#---------------------------------------------------------- + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "{{ resource_name }}" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: absent + register: result +- name: assert changed is true + assert: + that: + - result.changed == true +- name: verify that service_bus_disaster_recovery_config was deleted + gcp_zservicebusrecovery_service_bus_disaster_recovery_config_facts: + filters: + - name = {{ resource_name }} + project: "{{ gcp_project }}" + auth_kind: "{{ gcp_cred_kind }}" + service_account_file: "{{ gcp_cred_file }}" + scopes: + - NotUsedInAzure + register: results +- name: verify that command succeeded + assert: + that: + - results['items'] | length == 0 +# ---------------------------------------------------------------------------- + - name: Create (or update) Service Bus Disaster Recovery Config + azure_rm_servicebusdisasterrecoveryconfig: + resource_group: myResourceGroup + name: "{{ resource_name }}" + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy + state: absent + register: result +- name: assert changed is false + assert: + that: + - result.changed == false diff --git a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown index e1fc2bf4869d..1c3747643ca7 100644 --- a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown +++ b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown @@ -49,9 +49,9 @@ The following arguments are supported: * `namespace_name` - (Required) The name of the service bus namespace in which the config is created. Changing this forces a new resource to be created. -* `partner_namespace` - (Optional) The description of the service bus disaster recovery. +* `partner_namespace` - (Optional) The parter namespace of the service bus disaster recovery. -* `alternate_name` - (Optional) The value of the service bus disaster recovery. +* `alternate_name` - (Optional) The alternative name of the service bus disaster recovery. ## Attributes Reference diff --git a/products/azservicebusrecovery/ansible.yaml b/products/azservicebusrecovery/ansible.yaml new file mode 100644 index 000000000000..ea1548931ecf --- /dev/null +++ b/products/azservicebusrecovery/ansible.yaml @@ -0,0 +1,19 @@ +--- !ruby/object:Provider::Ansible::Config +manifest: !ruby/object:Provider::Ansible::Manifest + metadata_version: '1.1' + status: + - preview + supported_by: 'community' + requirements: + - python >= 2.6 + - requests >= 2.18.4 + - google-auth >= 1.3.0 + version_added: '2.6' + author: Zim Kalinowski (@zikalino) +overrides: !ruby/object:Provider::ResourceOverrides + ServiceBusDisasterRecoveryConfig: !ruby/object:Provider::Ansible::ResourceOverride + transport: !ruby/object:Api::Resource::Transport + encoder: encode_request + decoder: decode_request + provider_helpers: + - 'products/pubsub/helpers/python/provider_topic.py' diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index f5cf63a4d270..b893cc088334 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Service Bus Disaster Recovery Config -prefix: arm +prefix: azservicebusrecovery versions: - !ruby/object:Api::Product::Version name: ga @@ -17,6 +17,8 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: servicebus + python_client_namespace: azure.mgmt.servicebus + python_client: ServiceBusManagementClient create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate request: @@ -129,9 +131,9 @@ objects: azure_sdk_references: ['namespaceName'] - !ruby/object:Api::Type::String name: 'partnerNamespace' - description: 'The description of the service bus disaster recovery.' + description: 'The parter namespace of the service bus disaster recovery.' azure_sdk_references: ['/properties/partnerNamespace'] - !ruby/object:Api::Type::String name: 'AlternateName' - description: 'The value of the service bus disaster recovery.' + description: 'The alternative name of the service bus disaster recovery.' azure_sdk_references: ['/properties/alternateName'] diff --git a/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml b/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml new file mode 100644 index 000000000000..c7b01bec0f8c --- /dev/null +++ b/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Ansible::Example +task: !ruby/object:Provider::Ansible::Task + name: azure_rm_servicebusdisasterrecoveryconfig + description: Create (or update) Service Bus Disaster Recovery Config + code: + resource_group: myResourceGroup + name: <%= ctx[:name] %> + namespace_name: test.somewild2.example.com. + partner_namespace: xxx + alternate_name: yyy diff --git a/provider/ansible.rb b/provider/ansible.rb index 6e794b97cb66..3c16c0657be0 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -80,8 +80,7 @@ def build_url(url_parts, _extra = false) # Returns the name of the module according to Ansible naming standards. # Example: gcp_dns_managed_zone def module_name(object) - ["gcp_#{object.__product.prefix[1..-1]}", - object.name.underscore].join('_') + "azure_rm_#{object.name.downcase}" end def build_object_data(object, output_folder, version) diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index a4c08768e415..2e972f7ad3b6 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -24,9 +24,9 @@ module Ansible module Documentation def to_yaml(obj) if obj.is_a?(::Hash) - obj.reject { |_, v| v.nil? }.to_yaml.sub("---\n", '') + obj.reject { |_, v| v.nil? }.to_yaml(:indentation => 4).sub("---\n", '') else - obj.to_yaml.sub("---\n", '') + obj.to_yaml(:indentation => 4).sub("---\n", '') end end @@ -73,7 +73,7 @@ def returns_for_property(prop) { prop.name => { 'description' => format_description(prop.description), - 'returned' => 'success', + 'returned' => 'always', 'type' => type, 'contains' => ( if prop.is_a?(Api::Type::NestedObject) diff --git a/provider/ansible/example.rb b/provider/ansible/example.rb index 64d72cdb16a7..fbd10c18e59b 100644 --- a/provider/ansible/example.rb +++ b/provider/ansible/example.rb @@ -92,6 +92,7 @@ def validate class Task < Api::Object include Compile::Core attr_reader :name + attr_reader :description attr_reader :code attr_reader :scopes attr_reader :register @@ -100,6 +101,7 @@ def validate super check_property :name, String check_property :code, Hash + check_optional_property :description, String check_optional_property_list :scopes, ::String end @@ -122,7 +124,7 @@ def build_task(state, hash, object, noop = false) # rubocop:enable Lint/UnusedMethodArgument def object_name_from_module_name(mod_name) - product_name = mod_name.match(/gcp_[a-z]*_(.*)/).captures.first + product_name = mod_name product_name.tr('_', ' ') end diff --git a/provider/terraform.rb b/provider/terraform.rb index c84a7fefcdc2..3e4e732c1f8f 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -126,7 +126,7 @@ def generate_resource(data) FileUtils.mkpath target_folder name = data[:object].name.underscore product_name = data[:product_name].underscore - filepath = File.join(target_folder, "resource_#{product_name}_#{name}.go") + filepath = File.join(target_folder, "resource_arm_#{name}.go") generate_resource_file data.clone.merge( default_template: 'templates/terraform/resource.erb', out_file: filepath @@ -163,7 +163,7 @@ def generate_resource_tests(data) filepath = File.join( target_folder, - "resource_#{product_name}_#{name}_test.go" + "resource_arm_#{name}_test.go" ) generate_resource_file data.clone.merge( product: data[:product_name].camelize(:upper), diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 0f98afaf623d..5d013f274261 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -1,17 +1,14 @@ #!/usr/bin/python -# -*- coding: utf-8 -*- # -# Copyright (C) 2017 Google +# Copyright (C) 2019 <%= @config.manifest.get('author', object) -%> +# # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + <%= lines(autogen_notice :python) -%> from __future__ import absolute_import, division, print_function __metaclass__ = type -################################################################################ -# Documentation -################################################################################ - <% metadata_version = quote_string(@config.manifest.get('metadata_version', object)) @@ -22,26 +19,32 @@ ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, 'supported_by': <%= supported_by -%>} + DOCUMENTATION = ''' --- +module: <%= module_name(object) -%> + +version_added: "<%= @config.manifest.get('version_added', object).to_f -%>" + +short_description: <%= object.description -%> + +description: + - Create, update and delete instance of Azure <%= object.name.titlecase -%>. + <%= to_yaml({ - 'module' => module_name(object), - 'description' => format_description(object.description), - 'short_description' => "Creates a GCP #{object.name}", - 'version_added' => @config.manifest.get('version_added', object).to_f, - 'author' => @config.manifest.get('author', object), - 'requirements' => @config.manifest.get('requirements', object), 'options' => [ + object.all_user_properties.reject(&:output).map { |p| documentation_for_property(p) }, { 'state' => { - 'description' => ['Whether the given object should exist in GCP'], + 'description' => [ + "Assert the state of the #{object.name.titlecase}.", + "Use 'present' to create or update a #{object.name.titlecase} and 'absent' to delete it." + ], + 'default' => 'present', 'choices' => ['present', 'absent'], - 'default' => 'present' }, - }, - object.all_user_properties.reject(&:output).map { |p| documentation_for_property(p) } + } ].flatten.compact.reduce({}, :merge), - 'extends_documentation_fragment' => 'gcp', 'notes' => ( [ ("API Reference: U(#{object.references.api})" if object.references.api), @@ -49,6 +52,12 @@ DOCUMENTATION = ''' ].flatten.compact if object.references ) })-%> + +extends_documentation_fragment: + - azure + +author: + - "<%= @config.manifest.get('author', object) -%>" ''' <% if example -%> @@ -64,41 +73,61 @@ EXAMPLES = ''' <% end -%> RETURN = ''' -<%= to_yaml(object.all_user_properties.map { |p| returns_for_property(p) }.reduce({}, :merge)) -%> +<%= to_yaml(object.all_user_properties.select(&:output).map { |p| returns_for_property(p) }.reduce({ + 'id'=> { + 'description' => ['The identifier of the DTL Virtual Machine resource.'], + 'returned' => 'always', + 'type' => 'str', + } +}, :merge)) -%> ''' -################################################################################ -# Imports -################################################################################ -<% - readonly_selflink_rrefs = object.all_resourcerefs - .select { |prop| prop.resource_ref.readonly } - .select { |prop| prop.imports == 'selfLink' } - .map(&:resource_ref) - .uniq --%> +import time +from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.common.dict_transformations import _snake_to_camel -<% - import = 'from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest' - import += ', remove_nones_from_dict' unless properties_with_classes(object.all_user_properties).empty? - import += ', replace_resource_dict' if nonreadonly_rrefs(object) --%> -<%= lines(import) -%> -import json -<% - imports = object.imports || [] - imports << 'time' if object.async - imports << 're' unless readonly_selflink_rrefs.empty? --%> -<%= lines(imports.sort.uniq.map { |i| "import #{i}" }) -%> +try: + from msrestazure.azure_exceptions import CloudError + from msrest.polling import LROPoller + from msrestazure.azure_operation import AzureOperationPoller + from msrest.serialization import Model + from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= object.azure_sdk_definition.python_client -%> -################################################################################ -# Main -################################################################################ +except ImportError: + # This is handled in azure_rm_common + pass -def main(): - """Main function""" +class Actions: + NoAction, Create, Update, Delete = range(4) + +class AzureRM<%= object.name -%>(AzureRMModuleBase): + """Configuration class for an Azure RM <%= object.name.titleize -%> resource""" + + def __init__(self): + self.module_arg_spec = dict( + # TODO: Finish type declaration + ) + # TODO: Required If + # TODO: Argument Properties + # TODO: Module State + # TODO: Base Class Initialization + + # TODO: Main Module Execution + # TODO: Parameters -> Class Properties + # TODO: Parameters -> SDK + # TODO: Create Client Instance + # TODO: Response & Idempotency Check + # TODO: Perform Desired Action + # TODO: Format Response + + # TODO: Create/Update Function + + # TODO: Delete Function + + # TODO: Read Function + +''' <% mod_props = object.all_user_properties.reject(&:output).map do |prop| @@ -463,21 +492,15 @@ def response_to_hash(module, response): return { <%= lines(response_properties(object.properties, 8)) -%> } -<% readonly_selflink_rrefs.each do |resource| -%> - - -def <%= resource.name.underscore -%>_selflink(name, params): - if name is None: - return - url = r<%= lines(build_url(resource.regex_url)) -%> - if not re.match(url, name): - name = <%= build_url(resource.self_link_url).gsub('{name}', '%s') -%>.format(**params) % name - return name -<% end -%> <%= lines_before(compile('templates/ansible/async.erb'), 1) -%> <%= lines_before(compile('templates/ansible/provider_helpers.erb'), 1) -%> <%= lines_before(compile('templates/ansible/properties.erb'), 1) -%> +''' + +def main(): + """Main execution""" + AzureRM<%= object.name -%>() if __name__ == '__main__': main() diff --git a/templates/ansible/tasks/task.yaml.erb b/templates/ansible/tasks/task.yaml.erb index 55b04eb70946..8e7b617e7683 100644 --- a/templates/ansible/tasks/task.yaml.erb +++ b/templates/ansible/tasks/task.yaml.erb @@ -1,13 +1,6 @@ -<% - again = '' - if noop - again = ' that already exists' if state == 'present' - again = ' that does not exist' if state == 'absent' - end - verb = verbs[state.to_sym] --%> -- name: <%= verb -%> a <%= object_name_from_module_name(@name) -%><%= again %> - <%= @name -%>: + - name: <%= description -%> + + <%= @name -%>: <%= lines(indent(compile_string(hash, @code.to_yaml.sub('---', '').strip), 6)) -%> From 2cb57f21440d8c2bb6731b354501afead191d0e5 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 12 Mar 2019 00:37:13 +0800 Subject: [PATCH 038/175] Introduce the new examples strategy. --- .../automation_string_variable.html.markdown | 27 ++++---- .../examples/terraform/basic.yaml | 12 ++++ products/azautomationstringvariable/api.yaml | 2 +- .../examples/terraform/basic.yaml | 14 ++++ .../azautomationstringvariable/terraform.yaml | 12 ++-- .../examples/terraform/basic.yaml | 5 ++ provider/azure/terraform.rb | 2 + provider/azure/terraform/example.rb | 64 +++++++++++++++++++ provider/azure/terraform/resource_override.rb | 14 ++++ .../terraform/example/documentation_hcl.erb | 25 ++++++++ templates/terraform/resource.erb | 2 +- .../terraform/resource.html.markdown.erb | 12 ++++ 12 files changed, 168 insertions(+), 23 deletions(-) create mode 100644 products/azautomationaccount/examples/terraform/basic.yaml create mode 100644 products/azautomationstringvariable/examples/terraform/basic.yaml create mode 100644 products/azresourcegroup/examples/terraform/basic.yaml create mode 100644 provider/azure/terraform/example.rb create mode 100644 templates/azure/terraform/example/documentation_hcl.erb diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index f67b9a9a4e46..065e1ef69e49 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -25,8 +25,8 @@ Manages an automation variable on Azure. -## Example Usage - Container Registry +## Example Usage ```hcl resource "azurerm_resource_group" "example" { @@ -34,21 +34,20 @@ resource "azurerm_resource_group" "example" { location = "West US" } -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" +resource "azurerm_automation_account" "example" { + name = "example-account" + location = "${azurerm_resource_group.example.location}" + resource_group_name = "${azurerm_resource_group.example.name}" + sku = { + name = "Basic" + } } -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" +resource "azurerm_automation_string_variable" "example" { + name = "example-var" + resource_group_name = "${azurerm_resource_group.example.name}" + automation_account_name = "${azurerm_automation_account.example.name}" + value = "Hello, Terraform Basic Test." } ``` diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml new file mode 100644 index 000000000000..fb5da0bd4ec6 --- /dev/null +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -0,0 +1,12 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_automation_account +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic +properties: + name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-account' -%>" + location: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.location} + resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} + sku: + name: Basic \ No newline at end of file diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index e57e51aa8c19..03bc88c84458 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Automation Variable -prefix: arm +prefix: azautomationvariable versions: - !ruby/object:Api::Product::Version name: ga diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..3961fff8e45a --- /dev/null +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-var' -%>" + resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} + automation_account_name: ${azurerm_automation_account.<%= ctx[:resource_id_hint] -%>.name} + value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index b884a2abebfa..3abc0b5e9a43 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Terraform::Config -name: Arm +name: azautomationstringvariable overrides: !ruby/object:Provider::ResourceOverrides AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride name: AutomationStringVariable @@ -66,9 +66,7 @@ overrides: !ruby/object:Provider::ResourceOverrides - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition config_name: basicConfig hcl_reference: basic - example: - - !ruby/object:Provider::Terraform::Examples - name: "container_registry" - primary_resource_id: "example" - vars: - rg_name: "example-rg" + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: "basic" diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml new file mode 100644 index 000000000000..5db2f803d0ef --- /dev/null +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -0,0 +1,5 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_resource_group +properties: + name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-rg' -%>" + location: "<%= ctx[:is_acctest] ? '%s' : 'West US' -%>" \ No newline at end of file diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 0e0d3bb27d8f..2fe6474da00b 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,5 +1,6 @@ require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform/example' require 'provider/azure/terraform/acctest/sub_template' require 'provider/azure/terraform/resource_override' @@ -10,6 +11,7 @@ module Azure module Terraform include Provider::Azure::Terraform::Schema include Provider::Azure::Terraform::SubTemplate + include Provider::Azure::Terraform::Example::SubTemplate include Provider::Azure::Terraform::AccTest::SubTemplate def azure_resource_go_package(product) diff --git a/provider/azure/terraform/example.rb b/provider/azure/terraform/example.rb new file mode 100644 index 000000000000..6a84bdb349e4 --- /dev/null +++ b/provider/azure/terraform/example.rb @@ -0,0 +1,64 @@ +require 'provider/core' +require 'api/object' + +module Provider + module Azure + module Terraform + class ExampleReference < Api::Object + attr_reader :product + attr_reader :example + + def validate + super + check_property :product, String + check_property :example, String + end + end + + class Example < Api::Object + attr_reader :resource + attr_reader :name_in_documentation + attr_reader :name_in_test + attr_reader :prerequisites + attr_reader :properties + + def validate + super + check_property :resource, String + check_optional_property :name_in_documentation, String + check_optional_property :name_in_test, String + check_optional_property :prerequisites, Array + check_optional_property_list :prerequisites, ExampleReference + check_property :properties, Hash + end + + module SubTemplate + def build_test_hcl_from_example() + end + + def build_documentation_hcl_from_example(product_name, example_name, with_dependencies = true, id_hint = "example") + documentation_raw = compile_template 'templates/azure/terraform/example/documentation_hcl.erb', + example: get_example_from_file(product_name, example_name), + with_dependencies: with_dependencies, + resource_id_hint: id_hint + context = { + resource_id_hint: id_hint, + is_acctest: false + } + compile_string context, documentation_raw + end + + private + + def get_example_from_file(product_name, example_name) + example_yaml = "products/#{product_name}/examples/terraform/#{example_name}.yaml" + example = Google::YamlValidator.parse(File.read(example_yaml)) + raise "#{example_yaml}(#{example.class}) is not Provider::Azure::Terraform::Example" unless example.is_a?(Provider::Azure::Terraform::Example) + example.validate + example + end + end + end + end + end +end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index f2512f8773af..cd8404b49093 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -5,6 +5,7 @@ module Azure module Terraform module OverrideProperties attr_reader :acctests + attr_reader :document_examples include Provider::Terraform::OverrideProperties end @@ -16,9 +17,22 @@ def validate @acctests ||= Hash.new check_optional_property :acctests, Hash check_optional_property_hash :acctests, String, AccTestDefinition + check_optional_property :document_examples, Array + check_optional_property_list :document_examples, DocumentExampleReference post_initialization end + class DocumentExampleReference < Api::Object + attr_reader :title + attr_reader :example_name + + def validate + super + check_property :title, String + check_property :example_name, String + end + end + class AccTestDefinition < Api::Object attr_reader :based_on attr_reader :steps diff --git a/templates/azure/terraform/example/documentation_hcl.erb b/templates/azure/terraform/example/documentation_hcl.erb new file mode 100644 index 000000000000..77ee8d1932e2 --- /dev/null +++ b/templates/azure/terraform/example/documentation_hcl.erb @@ -0,0 +1,25 @@ +<% if with_dependencies && !example.prerequisites.nil? -%> +<% example.prerequisites.each do |pre_ex| -%> +<%= lines(build_documentation_hcl_from_example(pre_ex.product, pre_ex.example, false)) -%> + +<% end -%> +<% end -%> +resource "<%= example.resource -%>" "<%= resource_id_hint -%>" { +<% + longest_prop_name = example.properties.keys.max_by(&:length) + prop_alignment = longest_prop_name.length +-%> +<% example.properties.each do |prop_name, prop_value| -%> +<% if prop_value.is_a?(String) -%> + <%= prop_name.ljust(prop_alignment) -%> = "<%= prop_value -%>" +<% elsif prop_value.is_a?(Hash) -%> + <%= prop_name -%> = { +<% prop_value.each do |sub_prop_name, sub_prop_value| -%> + <%= sub_prop_name -%> = "<%= sub_prop_value -%>" +<% end -%> + } +<% else -%> + // TODO: Unsupported property value <%= prop_value -%> +<% end -%> +<% end -%> +} \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 3478e15992ba..e026446f1946 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -19,7 +19,7 @@ package azurerm <%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> <% - resource_name = product_ns + object.name + resource_name = "Arm" + object.name properties = object.all_user_properties # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index b0c8635cd3b3..dde5beb50d9a 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -85,6 +85,18 @@ To get more information about <%= object.name -%>, see: <%= example.config_documentation -%> <%- end %> <%- end -%> + +<% if object.instance_variable_defined?(:@document_examples) && !object.document_examples.nil? -%> +<% object.document_examples.each do |example_ref| -%> +## <%= example_ref.title -%> + + +```hcl +<%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name)) -%> +``` + +<% end -%> +<% end -%> ## Argument Reference The following arguments are supported: From cc485b531d12846aae3fc647ac12d2404bfae98f Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 13 Mar 2019 18:07:01 +0800 Subject: [PATCH 039/175] Complete Terraform documentation generation. --- .../resource_arm_container_registry.go | 7 ++++- .../automation_string_variable.html.markdown | 7 ++--- .../docs/r/container_registry.html.markdown | 9 ------ .../docs/r/resource_group.html.markdown | 9 ------ ...bus_disaster_recovery_config.html.markdown | 9 ------ .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/basic.yaml | 2 +- .../azautomationstringvariable/terraform.yaml | 4 +++ .../examples/terraform/basic.yaml | 2 +- provider/azure/terraform/example.rb | 21 +++++++++++--- provider/azure/terraform/resource_override.rb | 3 ++ .../terraform/example/documentation_hcl.erb | 20 ++----------- .../terraform/example/hcl_properties.erb | 29 +++++++++++++++++++ .../terraform/example/import_resource_id.erb | 13 +++++++++ .../terraform/resource.html.markdown.erb | 26 ++++------------- 15 files changed, 85 insertions(+), 78 deletions(-) create mode 100644 templates/azure/terraform/example/hcl_properties.erb create mode 100644 templates/azure/terraform/example/import_resource_id.erb diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 932e499a0662..2fadf8c2450e 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -48,7 +48,12 @@ func resourceArmContainerRegistry() *schema.Resource { "sku": { Type: schema.TypeString, Optional: true, - ValidateFunc: validation.StringInSlice([]string{"Classic","Basic","Standard","Premium",""}, false), + ValidateFunc: validation.StringInSlice([]string{ + string(containerregistry.Classic), + string(containerregistry.Basic), + string(containerregistry.Standard), + string(containerregistry.Premium), + }, false), Default: "Classic", }, diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index 065e1ef69e49..e4e7372a4133 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -24,8 +24,6 @@ description: |- Manages an automation variable on Azure. - - ## Example Usage ```hcl @@ -38,6 +36,7 @@ resource "azurerm_automation_account" "example" { name = "example-account" location = "${azurerm_resource_group.example.location}" resource_group_name = "${azurerm_resource_group.example.name}" + sku = { name = "Basic" } @@ -74,9 +73,9 @@ The following attributes are exported: * `id` - The automation string variable ID. - ## Import AutomationStringVariable can be imported using the `resource id`, e.g. ```shell -$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.Automation/TODO.ID_PORTION/example``` +$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/Microsoft.Automation/automationAccounts/example-account/variables/example-var +``` diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown index 5f535d29e906..edc193260a01 100644 --- a/build/azterraform/website/docs/r/container_registry.html.markdown +++ b/build/azterraform/website/docs/r/container_registry.html.markdown @@ -24,7 +24,6 @@ description: |- Manages a container registry on Azure. - ## Example Usage - Container Registry @@ -77,11 +76,3 @@ The following attributes are exported: * `id` - The container registry ID. * `login_server` - The URL that can be used to log into the container registry. - - - -## Import - -ContainerRegistry can be imported using the `resource id`, e.g. -```shell -$ terraform import azurerm_container_registry.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/Microsoft.ContainerRegistry/TODO.ID_PORTION/example``` diff --git a/build/azterraform/website/docs/r/resource_group.html.markdown b/build/azterraform/website/docs/r/resource_group.html.markdown index ee6a15f05281..666e237fb34f 100644 --- a/build/azterraform/website/docs/r/resource_group.html.markdown +++ b/build/azterraform/website/docs/r/resource_group.html.markdown @@ -24,7 +24,6 @@ description: |- Manages a resource group on Azure. - ## Example Usage - Resource Group @@ -54,11 +53,3 @@ The following arguments are supported: The following attributes are exported: * `id` - The resource group ID. - - - -## Import - -ResourceGroup can be imported using the `resource id`, e.g. -```shell -$ terraform import azurerm_resource_group.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg``` diff --git a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown index 1c3747643ca7..c3c83a826802 100644 --- a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown +++ b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown @@ -24,7 +24,6 @@ description: |- Manages a service bus disaster recovery config on Azure. - ## Example Usage - Resource Group @@ -58,11 +57,3 @@ The following arguments are supported: The following attributes are exported: * `id` - The service bus disaster recovery config ID. - - - -## Import - -ServiceBusDisasterRecoveryConfig can be imported using the `resource id`, e.g. -```shell -$ terraform import azurerm_service_bus_disaster_recovery_config.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg/servicebus/TODO.ID_PORTION/example``` diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index fb5da0bd4ec6..6c17c05a84da 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -5,7 +5,7 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-account' -%>" + name: "<%= ctx['automation_account_name_hint'] || 'acctest-%d' -%>" location: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.location} resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} sku: diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml index 3961fff8e45a..b0b8b7d0e949 100644 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -8,7 +8,7 @@ prerequisites: product: azautomationaccount example: basic properties: - name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-var' -%>" + name: "<%= ctx['variable_name_hint'] || 'acctest-%d' -%>" resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} automation_account_name: ${azurerm_automation_account.<%= ctx[:resource_id_hint] -%>.name} value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index 3abc0b5e9a43..bc02a90cb357 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -70,3 +70,7 @@ overrides: !ruby/object:Provider::ResourceOverrides - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference title: Example Usage example_name: "basic" + resource_name_hints: + resourceGroupName: example-rg + automationAccountName: example-account + variableName: example-var diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml index 5db2f803d0ef..bd1f02d9ea92 100644 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Terraform::Example resource: azurerm_resource_group properties: - name: "<%= ctx[:is_acctest] ? 'acctest-%d' : 'example-rg' -%>" + name: "<%= ctx['resource_group_name_hint'] || 'acctest-%d' -%>" location: "<%= ctx[:is_acctest] ? '%s' : 'West US' -%>" \ No newline at end of file diff --git a/provider/azure/terraform/example.rb b/provider/azure/terraform/example.rb index 6a84bdb349e4..cff64c812b8c 100644 --- a/provider/azure/terraform/example.rb +++ b/provider/azure/terraform/example.rb @@ -36,18 +36,31 @@ module SubTemplate def build_test_hcl_from_example() end - def build_documentation_hcl_from_example(product_name, example_name, with_dependencies = true, id_hint = "example") + def build_documentation_hcl_from_example(product_name, example_name, name_hints, with_dependencies = false) documentation_raw = compile_template 'templates/azure/terraform/example/documentation_hcl.erb', example: get_example_from_file(product_name, example_name), with_dependencies: with_dependencies, - resource_id_hint: id_hint + name_hints: name_hints, + resource_id_hint: "example" context = { - resource_id_hint: id_hint, + resource_id_hint: "example", is_acctest: false - } + }.merge(name_hints.transform_keys{|k| "#{k.underscore}_hint"}) compile_string context, documentation_raw end + def build_documentation_import_resource_id(object, example_reference) + compile_template 'templates/azure/terraform/example/import_resource_id.erb', + name_hints: example_reference.resource_name_hints, + object: object + end + + def build_hcl_properties(properties_hash, indentation = 2) + compile_template 'templates/azure/terraform/example/hcl_properties.erb', + properties: properties_hash, + indentation: indentation + end + private def get_example_from_file(product_name, example_name) diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index cd8404b49093..9d5a73f68844 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -25,11 +25,14 @@ def validate class DocumentExampleReference < Api::Object attr_reader :title attr_reader :example_name + attr_reader :resource_name_hints def validate super check_property :title, String check_property :example_name, String + check_optional_property :resource_name_hints, Hash + check_optional_property_hash :resource_name_hints, String, String end end diff --git a/templates/azure/terraform/example/documentation_hcl.erb b/templates/azure/terraform/example/documentation_hcl.erb index 77ee8d1932e2..6a713cb5c2a2 100644 --- a/templates/azure/terraform/example/documentation_hcl.erb +++ b/templates/azure/terraform/example/documentation_hcl.erb @@ -1,25 +1,9 @@ <% if with_dependencies && !example.prerequisites.nil? -%> <% example.prerequisites.each do |pre_ex| -%> -<%= lines(build_documentation_hcl_from_example(pre_ex.product, pre_ex.example, false)) -%> +<%= lines(build_documentation_hcl_from_example(pre_ex.product, pre_ex.example, name_hints)) -%> <% end -%> <% end -%> resource "<%= example.resource -%>" "<%= resource_id_hint -%>" { -<% - longest_prop_name = example.properties.keys.max_by(&:length) - prop_alignment = longest_prop_name.length --%> -<% example.properties.each do |prop_name, prop_value| -%> -<% if prop_value.is_a?(String) -%> - <%= prop_name.ljust(prop_alignment) -%> = "<%= prop_value -%>" -<% elsif prop_value.is_a?(Hash) -%> - <%= prop_name -%> = { -<% prop_value.each do |sub_prop_name, sub_prop_value| -%> - <%= sub_prop_name -%> = "<%= sub_prop_value -%>" -<% end -%> - } -<% else -%> - // TODO: Unsupported property value <%= prop_value -%> -<% end -%> -<% end -%> +<%= lines(build_hcl_properties(example.properties)) -%> } \ No newline at end of file diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb new file mode 100644 index 000000000000..574635540219 --- /dev/null +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -0,0 +1,29 @@ +<% + # props_left: [[name_1, val_1], [name_2, val_2], ...] + props_left = properties.to_a + begin + simple_props = props_left.take_while{|p| !p[1].is_a?(Hash)} + props_left = props_left.drop_while{|p| !p[1].is_a?(Hash)} + + prop_alignment = simple_props.map{|p| p[0].length}.max + simple_props.each do |prop| + if prop[1].is_a?(String) +-%> +<%= prop[0].ljust(prop_alignment) -%> = "<%= prop[1] -%>" +<% else -%> +// TODO: Unsupported property "<%= prop[0] -%>" value <%= prop[1] -%> +<% + end + end + complex_props = props_left.take_while{|p| p[1].is_a?(Hash)} + props_left = props_left.drop_while{|p| p[1].is_a?(Hash)} + complex_props.each do |prop| +-%> + +<%= prop[0] -%> = { +<%= lines(build_hcl_properties(prop[1])) -%> +} +<% + end + end until props_left.empty? +-%> \ No newline at end of file diff --git a/templates/azure/terraform/example/import_resource_id.erb b/templates/azure/terraform/example/import_resource_id.erb new file mode 100644 index 000000000000..ab13f5f1d5a0 --- /dev/null +++ b/templates/azure/terraform/example/import_resource_id.erb @@ -0,0 +1,13 @@ +<% + sdk = object.azure_sdk_definition + rg_name = "" + sub_ids = [sdk.provider_name] + sdk.read.request.reject {|k, v| v.id_portion.nil?}.each do |name, value| + if value.id_portion == "resourceGroups" + rg_name = name_hints[name] + else + sub_ids <<= "#{value.id_portion}/#{name_hints[name]}" + end + end +-%> +/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/<%= rg_name -%><%= sub_ids.length > 1 ? "/" : "" -%><%= sub_ids.join("/") -%> \ No newline at end of file diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index dde5beb50d9a..3ed675c16e9d 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -53,7 +53,6 @@ description: |- <%= lines(object.description) -%> - <% if !object.references.nil? -%> To get more information about <%= object.name -%>, see: @@ -85,14 +84,13 @@ To get more information about <%= object.name -%>, see: <%= example.config_documentation -%> <%- end %> <%- end -%> - <% if object.instance_variable_defined?(:@document_examples) && !object.document_examples.nil? -%> <% object.document_examples.each do |example_ref| -%> ## <%= example_ref.title -%> ```hcl -<%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name)) -%> +<%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name, example_ref.resource_name_hints, true)) -%> ``` <% end -%> @@ -132,26 +130,12 @@ The following attributes are exported: <%= "\n" + object.docs.attributes -%> <% end -%> -<% unless object.async.nil? -%> -## Timeouts - -This resource provides the following -[Timeouts](/docs/configuration/resources.html#timeouts) configuration options: - -- `create` - Default is <%= object.async.operation.timeouts.insert_sec / 60 -%> minutes. -<% if updatable?(object, properties) -%> -- `update` - Default is <%= object.async.operation.timeouts.update_sec / 60 -%> minutes. -<% end -%> -- `delete` - Default is <%= object.async.operation.timeouts.delete_sec / 60 -%> minutes. -<% end -%> - +<% if object.instance_variable_defined?(:@document_examples) && !object.document_examples.nil? && !object.document_examples.empty? -%> ## Import <%= object.name -%> can be imported using the `resource id`, e.g. -<% - resource_id_postfix = "" - resource_id_postfix = "/#{object.__product.azure_namespace}/TODO.ID_PORTION/example" unless object.name == "ResourceGroup" --%> ```shell -$ terraform import azurerm_<%= resource_name -%>.example /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/example-rg<%= resource_id_postfix -%> +$ terraform import azurerm_<%= resource_name -%>.example <%= build_documentation_import_resource_id(object, object.document_examples[0]) -%> + ``` +<% end -%> From 3fe6169523c635c3326ee028acd8a3fe81758e14 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 15 Mar 2019 18:26:06 +0800 Subject: [PATCH 040/175] Use Binding instead of Hash for example --- .../examples/terraform/basic.yaml | 6 +- .../examples/terraform/basic.yaml | 6 +- .../examples/terraform/basic.yaml | 4 +- provider/azure/terraform.rb | 3 +- provider/azure/terraform/example/example.rb | 37 ++++++++++++ .../{example.rb => example/sub_template.rb} | 57 ++++++++----------- 6 files changed, 71 insertions(+), 42 deletions(-) create mode 100644 provider/azure/terraform/example/example.rb rename provider/azure/terraform/{example.rb => example/sub_template.rb} (64%) diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index 6c17c05a84da..381b56377ba8 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -5,8 +5,8 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= ctx['automation_account_name_hint'] || 'acctest-%d' -%>" - location: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.location} - resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} + name: "<%= get_resource_name('automation_account_name') -%>" + location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} sku: name: Basic \ No newline at end of file diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml index b0b8b7d0e949..dcf93d4ff82d 100644 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -8,7 +8,7 @@ prerequisites: product: azautomationaccount example: basic properties: - name: "<%= ctx['variable_name_hint'] || 'acctest-%d' -%>" - resource_group_name: ${azurerm_resource_group.<%= ctx[:resource_id_hint] -%>.name} - automation_account_name: ${azurerm_automation_account.<%= ctx[:resource_id_hint] -%>.name} + name: "<%= get_resource_name('variable_name') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml index bd1f02d9ea92..39f1dc73467f 100644 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Terraform::Example resource: azurerm_resource_group properties: - name: "<%= ctx['resource_group_name_hint'] || 'acctest-%d' -%>" - location: "<%= ctx[:is_acctest] ? '%s' : 'West US' -%>" \ No newline at end of file + name: "<%= get_resource_name('resource_group_name') -%>" + location: "<%= is_acctest ? '%s' : 'West US' -%>" \ No newline at end of file diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 2fe6474da00b..cfbac0ad5113 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,6 +1,7 @@ require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' -require 'provider/azure/terraform/example' +require 'provider/azure/terraform/example/example' +require 'provider/azure/terraform/example/sub_template' require 'provider/azure/terraform/acctest/sub_template' require 'provider/azure/terraform/resource_override' diff --git a/provider/azure/terraform/example/example.rb b/provider/azure/terraform/example/example.rb new file mode 100644 index 000000000000..dab3b48a2196 --- /dev/null +++ b/provider/azure/terraform/example/example.rb @@ -0,0 +1,37 @@ +require 'provider/core' +require 'api/object' + +module Provider + module Azure + module Terraform + class ExampleReference < Api::Object + attr_reader :product + attr_reader :example + + def validate + super + check_property :product, String + check_property :example, String + end + end + + class Example < Api::Object + attr_reader :resource + attr_reader :name_in_documentation + attr_reader :name_in_test + attr_reader :prerequisites + attr_reader :properties + + def validate + super + check_property :resource, String + check_optional_property :name_in_documentation, String + check_optional_property :name_in_test, String + check_optional_property :prerequisites, Array + check_optional_property_list :prerequisites, ExampleReference + check_property :properties, Hash + end + end + end + end +end diff --git a/provider/azure/terraform/example.rb b/provider/azure/terraform/example/sub_template.rb similarity index 64% rename from provider/azure/terraform/example.rb rename to provider/azure/terraform/example/sub_template.rb index cff64c812b8c..600fcb40de22 100644 --- a/provider/azure/terraform/example.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -1,37 +1,9 @@ -require 'provider/core' require 'api/object' module Provider module Azure module Terraform - class ExampleReference < Api::Object - attr_reader :product - attr_reader :example - - def validate - super - check_property :product, String - check_property :example, String - end - end - class Example < Api::Object - attr_reader :resource - attr_reader :name_in_documentation - attr_reader :name_in_test - attr_reader :prerequisites - attr_reader :properties - - def validate - super - check_property :resource, String - check_optional_property :name_in_documentation, String - check_optional_property :name_in_test, String - check_optional_property :prerequisites, Array - check_optional_property_list :prerequisites, ExampleReference - check_property :properties, Hash - end - module SubTemplate def build_test_hcl_from_example() end @@ -42,11 +14,8 @@ def build_documentation_hcl_from_example(product_name, example_name, name_hints, with_dependencies: with_dependencies, name_hints: name_hints, resource_id_hint: "example" - context = { - resource_id_hint: "example", - is_acctest: false - }.merge(name_hints.transform_keys{|k| "#{k.underscore}_hint"}) - compile_string context, documentation_raw + context = ExampleContextBinding.new("example", false, name_hints) + compile_string context.get_binding, documentation_raw end def build_documentation_import_resource_id(object, example_reference) @@ -71,6 +40,28 @@ def get_example_from_file(product_name, example_name) example end end + + private + + class ExampleContextBinding + attr_reader :my_binding + attr_reader :name_hints + + def initialize(resource_id_hint, is_acctest, name_hints) + @my_binding = binding + @my_binding.local_variable_set(:resource_id_hint, resource_id_hint) + @my_binding.local_variable_set(:is_acctest, is_acctest) + @name_hints = name_hints.transform_keys(&:underscore) + end + + def get_binding() + @my_binding + end + + def get_resource_name(name_hint) + name_hints[name_hint] || "acctest-%d" + end + end end end end From 86a5856df005bfdbbd4c086efccb633adcaa3b9a Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 20 Mar 2019 18:47:29 -0700 Subject: [PATCH 041/175] Use examples in AccTest templates. --- Gemfile.lock | 2 +- ...rce_arm_automation_string_variable_test.go | 44 ++++----- .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/complete.yaml | 15 +++ .../azautomationstringvariable/terraform.yaml | 62 +++--------- .../examples/terraform/basic.yaml | 4 +- provider/azure/terraform.rb | 2 + .../azure/terraform/acctest/sub_template.rb | 19 +--- provider/azure/terraform/example/helpers.rb | 20 ++++ .../azure/terraform/example/sub_template.rb | 64 +++++++++--- provider/azure/terraform/resource_override.rb | 97 ++----------------- provider/terraform.rb | 2 - .../terraform/acctest/dependencies_hcl.erb | 5 - .../acctest/parameters_from_schema.erb | 9 +- .../terraform/acctest/resource_test_hcl.erb | 20 ---- ...{documentation_hcl.erb => example_hcl.erb} | 2 +- .../examples/base_configs/test_file.go.erb | 76 +++++++-------- 18 files changed, 166 insertions(+), 281 deletions(-) create mode 100644 products/azautomationstringvariable/examples/terraform/complete.yaml create mode 100644 provider/azure/terraform/example/helpers.rb delete mode 100644 templates/azure/terraform/acctest/dependencies_hcl.erb delete mode 100644 templates/azure/terraform/acctest/resource_test_hcl.erb rename templates/azure/terraform/example/{documentation_hcl.erb => example_hcl.erb} (67%) diff --git a/Gemfile.lock b/Gemfile.lock index b5b92ebc187c..c1217be203b5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -74,4 +74,4 @@ DEPENDENCIES simplecov BUNDLED WITH - 1.17.1 + 2.0.1 diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go index 19defd0634cb..758ea0fb2665 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go @@ -26,9 +26,8 @@ import ( func TestAccAzureRMAutomationStringVariable_basic(t *testing.T) { resourceName := "azurerm_automation_string_variable.test" - rInt := tf.AccRandTimeInt() + ri := tf.AccRandTimeInt() location := testLocation() - config := testAccAzureRMAutomationStringVariable_basic(rInt, location) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -36,7 +35,7 @@ func TestAccAzureRMAutomationStringVariable_basic(t *testing.T) { CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, Steps: []resource.TestStep{ { - Config: config, + Config: testAccAzureRMAutomationStringVariable_basic(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAutomationStringVariableExists(resourceName), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), @@ -53,9 +52,8 @@ func TestAccAzureRMAutomationStringVariable_basic(t *testing.T) { func TestAccAzureRMAutomationStringVariable_complete(t *testing.T) { resourceName := "azurerm_automation_string_variable.test" - rInt := tf.AccRandTimeInt() + ri := tf.AccRandTimeInt() location := testLocation() - config := testAccAzureRMAutomationStringVariable_complete(rInt, location) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -63,10 +61,10 @@ func TestAccAzureRMAutomationStringVariable_complete(t *testing.T) { CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, Steps: []resource.TestStep{ { - Config: config, + Config: testAccAzureRMAutomationStringVariable_complete(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This is a variable created by Terraform acceptance test."), + resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), ), }, @@ -81,10 +79,8 @@ func TestAccAzureRMAutomationStringVariable_complete(t *testing.T) { func TestAccAzureRMAutomationStringVariable_basicCompleteUpdate(t *testing.T) { resourceName := "azurerm_automation_string_variable.test" - rInt := tf.AccRandTimeInt() + ri := tf.AccRandTimeInt() location := testLocation() - basicConfig := testAccAzureRMAutomationStringVariable_basic(rInt, location) - completeConfig := testAccAzureRMAutomationStringVariable_complete(rInt, location) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -92,22 +88,22 @@ func TestAccAzureRMAutomationStringVariable_basicCompleteUpdate(t *testing.T) { CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, Steps: []resource.TestStep{ { - Config: basicConfig, + Config: testAccAzureRMAutomationStringVariable_basic(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAutomationStringVariableExists(resourceName), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), ), }, { - Config: completeConfig, + Config: testAccAzureRMAutomationStringVariable_complete(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This is a variable created by Terraform acceptance test."), + resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), ), }, { - Config: basicConfig, + Config: testAccAzureRMAutomationStringVariable_basic(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAutomationStringVariableExists(resourceName), resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), @@ -126,14 +122,8 @@ func testCheckAzureRMAutomationStringVariableExists(resourceName string) resourc } name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group name found in state for Automation String Variable: %q", name) - } - accountName, hasAccountName := rs.Primary.Attributes["automation_account_name"] - if !hasAccountName { - return fmt.Errorf("Bad: no automation account name found in state for Automation String Variable: %q", name) - } + resourceGroup := rs.Primary.Attributes["resource_group_name"] + accountName := rs.Primary.Attributes["automation_account_name"] client := testAccProvider.Meta().(*ArmClient).automationVariableClient ctx := testAccProvider.Meta().(*ArmClient).StopContext @@ -186,12 +176,12 @@ resource "azurerm_automation_account" "test" { location = "${azurerm_resource_group.test.location}" resource_group_name = "${azurerm_resource_group.test.name}" - sku { + sku = { name = "Basic" } } -"azurerm_automation_string_variable" "test" { +resource "azurerm_automation_string_variable" "test" { name = "acctestAutoVar-%d" resource_group_name = "${azurerm_resource_group.test.name}" automation_account_name = "${azurerm_automation_account.test.name}" @@ -212,16 +202,16 @@ resource "azurerm_automation_account" "test" { location = "${azurerm_resource_group.test.location}" resource_group_name = "${azurerm_resource_group.test.name}" - sku { + sku = { name = "Basic" } } -"azurerm_automation_string_variable" "test" { +resource "azurerm_automation_string_variable" "test" { name = "acctestAutoVar-%d" resource_group_name = "${azurerm_resource_group.test.name}" automation_account_name = "${azurerm_automation_account.test.name}" - description = "This is a variable created by Terraform acceptance test." + description = "This variable is created by Terraform acceptance test." value = "Hello, Terraform Complete Test." } `, rInt, location, rInt, rInt) diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index 381b56377ba8..6490fc838f42 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -5,7 +5,7 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= get_resource_name('automation_account_name') -%>" + name: "<%= get_resource_name('automation_account_name', 'AutoAcct') -%>" location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} sku: diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml index dcf93d4ff82d..be37e345077f 100644 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -8,7 +8,7 @@ prerequisites: product: azautomationaccount example: basic properties: - name: "<%= get_resource_name('variable_name') -%>" + name: "<%= get_resource_name('variable_name', 'AutoVar') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/examples/terraform/complete.yaml b/products/azautomationstringvariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..778b06ab222f --- /dev/null +++ b/products/azautomationstringvariable/examples/terraform/complete.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variable_name_hint', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. + value: Hello, Terraform Complete Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index bc02a90cb357..df65d4012edb 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -16,61 +16,21 @@ overrides: !ruby/object:Provider::ResourceOverrides custom_code: !ruby/object:Provider::Terraform::CustomCode post_read: products/azautomationstringvariable/check_type_after_read.erb acctests: - basic: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - custom_dependencies_code: | - resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" - } - - resource "azurerm_automation_account" "test" { - name = "acctestAutoAcct-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - - sku { - name = "Basic" - } - } - properties: - name: acctestAutoVar-%d - resourceGroupName: ${azurerm_resource_group.test.name} - automationAccountName: ${azurerm_automation_account.test.name} - value: Hello, Terraform Basic Test. - hcl_parameters: - - AccDefaultInt - - AccLocation - - AccDefaultInt - - AccDefaultInt - steps: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition - config_name: config - hcl_reference: basic - complete: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - based_on: basic - properties: - description: This is a variable created by Terraform acceptance test. - value: Hello, Terraform Complete Test. - steps: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition - config_name: config - hcl_reference: complete - basicCompleteUpdate: !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - steps: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition - config_name: basicConfig - hcl_reference: basic - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition - config_name: completeConfig - hcl_reference: complete - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestStepDefinition - config_name: basicConfig - hcl_reference: basic + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] document_examples: - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference title: Example Usage - example_name: "basic" + example_name: basic resource_name_hints: resourceGroupName: example-rg automationAccountName: example-account variableName: example-var + location: West US diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml index 39f1dc73467f..3331154430bb 100644 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Terraform::Example resource: azurerm_resource_group properties: - name: "<%= get_resource_name('resource_group_name') -%>" - location: "<%= is_acctest ? '%s' : 'West US' -%>" \ No newline at end of file + name: "<%= get_resource_name('resource_group_name', 'RG') -%>" + location: "<%= get_location() -%>" \ No newline at end of file diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index cfbac0ad5113..e902aa688eba 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -2,6 +2,7 @@ require 'provider/azure/terraform/sub_template' require 'provider/azure/terraform/example/example' require 'provider/azure/terraform/example/sub_template' +require 'provider/azure/terraform/example/helpers' require 'provider/azure/terraform/acctest/sub_template' require 'provider/azure/terraform/resource_override' @@ -13,6 +14,7 @@ module Terraform include Provider::Azure::Terraform::Schema include Provider::Azure::Terraform::SubTemplate include Provider::Azure::Terraform::Example::SubTemplate + include Provider::Azure::Terraform::Example::Helpers include Provider::Azure::Terraform::AccTest::SubTemplate def azure_resource_go_package(product) diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb index 5043ec1a918d..afc01eae52b3 100644 --- a/provider/azure/terraform/acctest/sub_template.rb +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -4,26 +4,11 @@ module Terraform module AccTest module SubTemplate - def build_acctest_parameters_from_schema(sdk_op_def, properties, object, check_existence = false, indentation = 8) + def build_acctest_parameters_from_schema(sdk_op_def, properties, indentation = 8) compile_template 'templates/azure/terraform/acctest/parameters_from_schema.erb', indentation: indentation, sdk_op_def: sdk_op_def, - check_existence: check_existence, - properties: properties, - object: object - end - - def build_acctest_dependencies_hcl(acctest_def, object) - compile_template 'templates/azure/terraform/acctest/dependencies_hcl.erb', - acctest_def: acctest_def, - object: object - end - - def build_acctest_resource_test_hcl(acctest_def, object, resource_id = "test") - compile_template 'templates/azure/terraform/acctest/resource_test_hcl.erb', - acctest_def: acctest_def, - resource_id: resource_id, - object: object + properties: properties end end diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb new file mode 100644 index 000000000000..9effd5026606 --- /dev/null +++ b/provider/azure/terraform/example/helpers.rb @@ -0,0 +1,20 @@ +require 'api/object' + +module Provider + module Azure + module Terraform + class Example < Api::Object + module Helpers + def get_example_properties_to_check(product_name, example_name, object) + request = object.azure_sdk_definition.read.request + param_props = object.all_user_properties.select{|p| request.has_key?(p.azure_sdk_references[0])} + params = param_props.map{|p| p.name.underscore}.to_set + + example = get_example_from_file(product_name, example_name) + example.properties.reject{|pn, pv| params.include?(pn)} + end + end + end + end + end +end diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index 600fcb40de22..4dfe2c4b8ee1 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -5,17 +5,23 @@ module Azure module Terraform class Example < Api::Object module SubTemplate - def build_test_hcl_from_example() + def build_test_hcl_from_example(product_name, example_name, random_vars, with_dependencies = false) + build_hcl_from_example(product_name, example_name, "test", {}, random_vars, true) end def build_documentation_hcl_from_example(product_name, example_name, name_hints, with_dependencies = false) - documentation_raw = compile_template 'templates/azure/terraform/example/documentation_hcl.erb', - example: get_example_from_file(product_name, example_name), - with_dependencies: with_dependencies, - name_hints: name_hints, - resource_id_hint: "example" - context = ExampleContextBinding.new("example", false, name_hints) - compile_string context.get_binding, documentation_raw + build_hcl_from_example(product_name, example_name, "example", name_hints, [], true) + end + + def build_hcl_from_example(product_name, example_name, id_hint, name_hints, random_vars, with_dependencies = false) + hcl_raw = compile_template 'templates/azure/terraform/example/example_hcl.erb', + example: get_example_from_file(product_name, example_name), + random_variables: random_vars, + resource_id_hint: id_hint, + name_hints: name_hints, + with_dependencies: with_dependencies + context = ExampleContextBinding.new(id_hint, name_hints, random_vars) + compile_string context.get_binding, hcl_raw end def build_documentation_import_resource_id(object, example_reference) @@ -46,22 +52,56 @@ def get_example_from_file(product_name, example_name) class ExampleContextBinding attr_reader :my_binding attr_reader :name_hints + attr_reader :random_variables - def initialize(resource_id_hint, is_acctest, name_hints) + def initialize(resource_id_hint, name_hints, random_vars) @my_binding = binding @my_binding.local_variable_set(:resource_id_hint, resource_id_hint) - @my_binding.local_variable_set(:is_acctest, is_acctest) @name_hints = name_hints.transform_keys(&:underscore) + @random_variables = random_vars end def get_binding() @my_binding end - def get_resource_name(name_hint) - name_hints[name_hint] || "acctest-%d" + def get_resource_name(name_hint, postfix) + return name_hints[name_hint] if name_hints.has_key?(name_hint) + @random_variables <<= RandomizedVariable.new(:AccDefaultInt) + "acctest#{postfix}-#{@random_variables.last.format_string}" + end + + def get_location() + return name_hints["location"] if name_hints.has_key?("location") + @random_variables <<= RandomizedVariable.new(:AccLocation) + @random_variables.last.format_string end end + + class RandomizedVariable + attr_reader :variable_name + attr_reader :parameter_name + attr_reader :go_type + attr_reader :create_expression + attr_reader :format_string + + def initialize(type) + case type + when :AccDefaultInt + @variable_name = "ri" + @parameter_name = "rInt" + @go_type = "int" + @create_expression = "tf.AccRandTimeInt()" + @format_string = "%d" + when :AccLocation + @variable_name = @parameter_name = "location" + @go_type = "string" + @create_expression = "testLocation()" + @format_string = "%s" + end + end + end + end end end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index 9d5a73f68844..564186aef8af 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -14,12 +14,11 @@ class ResourceOverride < Provider::Terraform::ResourceOverride def validate super - @acctests ||= Hash.new - check_optional_property :acctests, Hash - check_optional_property_hash :acctests, String, AccTestDefinition + @acctests ||= Array.new + check_optional_property :acctests, Array + check_optional_property_list :acctests, AccTestDefinition check_optional_property :document_examples, Array check_optional_property_list :document_examples, DocumentExampleReference - post_initialization end class DocumentExampleReference < Api::Object @@ -37,95 +36,16 @@ def validate end class AccTestDefinition < Api::Object - attr_reader :based_on + attr_reader :name attr_reader :steps - attr_reader :hcl_parameters - attr_reader :check_import - attr_reader :custom_dependencies_code - attr_reader :properties def validate super @initialized = false + check_property :name, String check_property :steps, Array - check_property_list :steps, AccTestStepDefinition - - check_optional_property :based_on, String - check_optional_property :check_import, :boolean - @check_import = (@steps.length == 1) if @check_import.nil? - check_optional_property :custom_dependencies_code, String - - check_optional_property :properties, Hash - @properties ||= Hash.new - check_optional_property_hash :properties, String, String - - check_optional_property :hcl_parameters, Array - @hcl_parameters ||= [] - convert_hcl_parameter_strings - check_optional_property_list :hcl_parameters, AccTestHCLParametersDefinition - end - - def post_initialization(resource) - merge_hcl_parameters(resource) unless @initialized - @initialized = true - end - - private - - def convert_hcl_parameter_strings() - @hcl_parameters.each_index do |i| - @hcl_parameters[i] = AccTestHCLParametersDefinition.new(@hcl_parameters[i]) if @hcl_parameters[i].instance_of? String - end - end - - def merge_hcl_parameters(resource) - parent_def_id = @based_on - until parent_def_id.nil? - parent_def = resource.acctests[parent_def_id] - parent_def.post_initialization(resource) - parent_def.hcl_parameters.reverse_each{|param| @hcl_parameters.insert(0, param)} - parent_def_id = parent_def.based_on - end - end - end - - class AccTestHCLParametersDefinition < Api::Object - attr_reader :variable_name - attr_reader :go_type - attr_reader :create_expression - - def validate - super - check_property :variable_name, String - check_property :go_type, String - check_property :create_expression, String - end - - def initialize(str) - case str - when "AccDefaultInt" - @variable_name = "rInt" - @go_type = "int" - @create_expression = "tf.AccRandTimeInt()" - when "AccLocation" - @variable_name = "location" - @go_type = "string" - @create_expression = "testLocation()" - else - raise "#{str} is not a valid pre-defined AccTestHCLParametersDefinition" - end - end - end - - class AccTestStepDefinition < Api::Object - attr_reader :config_name - attr_reader :hcl_reference - - def validate - super - check_property :config_name, String - check_property :hcl_reference, String + check_property_list :steps, String end end @@ -134,11 +54,6 @@ def validate def overriden Provider::Azure::Terraform::OverrideProperties end - - def post_initialization - @acctests.each_value{|acctest_def| acctest_def.post_initialization(self)} - end - end end end diff --git a/provider/terraform.rb b/provider/terraform.rb index 3e4e732c1f8f..8009ae0057fd 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -152,8 +152,6 @@ def generate_documentation(data) end def generate_resource_tests(data) - return if data[:object].example.reject(&:skip_test).empty? - # dir = data[:version] == 'beta' ? 'google-beta' : 'google' dir = 'azurerm' target_folder = File.join(data[:output_folder], dir) diff --git a/templates/azure/terraform/acctest/dependencies_hcl.erb b/templates/azure/terraform/acctest/dependencies_hcl.erb deleted file mode 100644 index a69944b35575..000000000000 --- a/templates/azure/terraform/acctest/dependencies_hcl.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% unless acctest_def.based_on.nil? -%> -<% parent_def = object.acctests[acctest_def.based_on] -%> -<%= build_acctest_dependencies_hcl(parent_def, object) -%> -<% end -%> -<%= acctest_def.custom_dependencies_code -%> \ No newline at end of file diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb index 34a6e39ae732..0f9622f7d528 100644 --- a/templates/azure/terraform/acctest/parameters_from_schema.erb +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -1,11 +1,4 @@ <% properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) }.each do |prop| -%> <% var_name = sdk_op_def.request[prop.azure_sdk_references[0]].go_variable_name -%> -<% if check_existence && var_name != "name" -%> -<%= var_name -%>, has<%= var_name.camelcase(:upper) -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] -if !has<%= var_name.camelcase(:upper) -%> { - return fmt.Errorf("Bad: no <%= prop.name.titlecase.downcase -%> found in state for <%= object.name.titlecase -%>: %q", name) -} -<% else -%> -<%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] -<% end -%> +<%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/acctest/resource_test_hcl.erb b/templates/azure/terraform/acctest/resource_test_hcl.erb deleted file mode 100644 index c073513f0c68..000000000000 --- a/templates/azure/terraform/acctest/resource_test_hcl.erb +++ /dev/null @@ -1,20 +0,0 @@ -<% - merged_props = Hash.new - cur_acctest_def = acctest_def - until cur_acctest_def.nil? do - cur_acctest_def.properties.each do |propName, prop| - merged_props[propName] = prop unless merged_props.has_key?(propName) - end - cur_acctest_def = cur_acctest_def.based_on.nil? ? nil : object.acctests[cur_acctest_def.based_on] - end - - longest_prop_name = merged_props.keys.max_by{|pn| pn.underscore.length} - prop_len = longest_prop_name.nil? ? 0 : longest_prop_name.underscore.length --%> -"<%= "azurerm_" + object.name.underscore -%>" "<%= resource_id -%>" { -<% object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<% if merged_props.has_key?(prop.name) -%> - <%= prop.name.underscore.ljust(prop_len) -%> = "<%= merged_props[prop.name] -%>" -<% end -%> -<% end -%> -} \ No newline at end of file diff --git a/templates/azure/terraform/example/documentation_hcl.erb b/templates/azure/terraform/example/example_hcl.erb similarity index 67% rename from templates/azure/terraform/example/documentation_hcl.erb rename to templates/azure/terraform/example/example_hcl.erb index 6a713cb5c2a2..c84f6db3bc70 100644 --- a/templates/azure/terraform/example/documentation_hcl.erb +++ b/templates/azure/terraform/example/example_hcl.erb @@ -1,6 +1,6 @@ <% if with_dependencies && !example.prerequisites.nil? -%> <% example.prerequisites.each do |pre_ex| -%> -<%= lines(build_documentation_hcl_from_example(pre_ex.product, pre_ex.example, name_hints)) -%> +<%= lines(build_hcl_from_example(pre_ex.product, pre_ex.example, resource_id_hint, name_hints, random_variables)) -%> <% end -%> <% end -%> diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 0a7a05a781a8..960dfe7d2aa4 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -16,23 +16,24 @@ import ( terraform_name = "azurerm_" + object.name.underscore azure_client_name = "#{object.api_name}Client".camelcase(:lower) properties = object.all_user_properties + contains_acctests = object.instance_variable_defined?(:@acctests) %> -<% if object.instance_variable_defined?(:@acctests) -%> -<% object.acctests.each do |testName, test| -%> -func TestAcc<%= resource_name -%>_<%= testName -%>(t *testing.T) { - resourceName := "<%= terraform_name -%>.test" -<% test.steps.map{|step| object.acctests[step.hcl_reference].hcl_parameters}.flatten.uniq(&:variable_name).each do |param| -%> - <%= param.variable_name -%> := <%= param.create_expression -%> - -<% end -%> -<% test.steps.uniq(&:config_name).each do |step| -%> <% - hcl_params = object.acctests[step.hcl_reference].hcl_parameters - uniq_params = hcl_params.uniq(&:variable_name).map(&:variable_name) + test_hcls = Hash.new + if contains_acctests + object.acctests.each do |test| + test.steps.uniq.each do |name| + random_vars = [] + test_hcl = build_test_hcl_from_example(product_ns, name, random_vars, true) + test_hcls[name] = { :hcl => test_hcl, :random_vars => random_vars } + end -%> - <%= step.config_name -%> := testAcc<%= resource_name -%>_<%= step.hcl_reference -%>(<%= uniq_params.join(", ") -%>) -<% end -%> -<% -%> +func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { + resourceName := "<%= terraform_name -%>.test" +<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).each do |param| -%> + <%= param.variable_name -%> := <%= param.create_expression -%> + +<% end -%> resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -40,28 +41,19 @@ func TestAcc<%= resource_name -%>_<%= testName -%>(t *testing.T) { CheckDestroy: testCheck<%= resource_name -%>Destroy, Steps: []resource.TestStep{ <% test.steps.each do |step| -%> -<% - hcl = object.acctests[step.hcl_reference] - props_to_check = Hash.new - until hcl.nil? do - hcl.properties.each do |propName, prop| - props_to_check[propName] = prop unless props_to_check.has_key?(propName) - end - hcl = hcl.based_on.nil? ? nil : object.acctests[hcl.based_on] - end - props_to_check.reject!{|pn, pv| object.azure_sdk_definition.read.request.has_key?(object.all_user_properties.find{|p| p.name == pn}.azure_sdk_references[0]) } --%> +<% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> +<% props_to_check = get_example_properties_to_check(product_ns, step, object) -%> { - Config: <%= step.config_name -%>, + Config: testAcc<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), Check: resource.ComposeTestCheckFunc( testCheck<%= resource_name -%>Exists(resourceName), <% props_to_check.each do |propName, propValue| -%> - resource.TestCheckResourceAttr(resourceName, "<%= propName.underscore -%>", "<%= propValue -%>"), + resource.TestCheckResourceAttr(resourceName, "<%= propName -%>", "<%= propValue -%>"), <% end -%> ), }, <% end -%> -<% if test.check_import -%> +<% if test.steps.count == 1 -%> { ResourceName: resourceName, ImportState: true, @@ -82,7 +74,7 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec return fmt.Errorf("<%= object.name.titlecase -%> not found: %s", resourceName) } -<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object, true)) -%> +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> @@ -110,7 +102,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { continue } -<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object)) -%> +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { if !utils.ResponseWasNotFound(resp.Response) { @@ -124,18 +116,18 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { return nil } -<% if object.instance_variable_defined?(:@acctests) -%> -<% object.acctests.reject{|n, t| t.based_on.nil? && t.properties.empty?}.each do |testName, test| -%> -<% uniq_params = test.hcl_parameters.uniq(&:variable_name).map{|p| "#{p.variable_name} #{p.go_type}"} -%> -func testAcc<%= resource_name -%>_<%= testName -%>(<%= uniq_params.join(", ") -%>) string { +<% + if contains_acctests + test_hcls.each do |name, test_hcl| + uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).map{|p| "#{p.parameter_name} #{p.go_type}"} +-%> +func testAcc<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { return fmt.Sprintf(` -<%= build_acctest_dependencies_hcl(test, object) -%> - - -<%= build_acctest_resource_test_hcl(test, object) -%> - -`, <%= test.hcl_parameters.map(&:variable_name).join(", ") -%>) +<%= lines(test_hcl[:hcl]) -%> +`, <%= test_hcl[:random_vars].map(&:parameter_name).join(", ") -%>) } -<% end -%> -<% end -%> \ No newline at end of file +<% + end + end +-%> \ No newline at end of file From 661ea3f1f7d2065ecfe87702a41bde617bc7cad3 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 27 Mar 2019 22:24:16 -0700 Subject: [PATCH 042/175] Refactor and introduce API Management Policy. --- api/azure/sdk_definition.rb | 2 +- api/azure/sdk_type_definition.rb | 3 - .../resource_arm_api_management_policy.go | 156 ++++++++++++++++++ ...resource_arm_api_management_policy_test.go | 76 +++++++++ .../r/api_management_policy.html.markdown | 61 +++++++ products/azapimngpolicy/api.yaml | 128 ++++++++++++++ .../api_management_name_schema.erb | 1 + .../api_management_policy_name_schema.erb | 1 + products/azapimngpolicy/terraform.yaml | 22 +++ .../azapimngpolicy/terraform_get_format.erb | 0 provider/azure/terraform.rb | 6 + provider/azure/terraform/helpers.rb | 12 ++ provider/azure/terraform/property_override.rb | 3 + provider/azure/terraform/schema.rb | 39 +---- provider/azure/terraform/sdk/helpers.rb | 50 ++++++ provider/azure/terraform/sdk/sub_template.rb | 58 +++++++ provider/azure/terraform/sub_template.rb | 46 ------ .../sdk/errorf_with_resource_name.erb | 11 +- ...y_to_sdkenum.erb => enum_field_assign.erb} | 5 +- ...itive.erb => expand_func_field_assign.erb} | 1 - .../sdktypes/property_to_sdkfield_assign.erb | 3 + .../sdktypes/property_to_sdkobject.erb | 12 +- .../sdktypes/property_to_sdkstringmap.erb | 1 - .../sdktypes/sdkenum_to_property.erb | 4 +- .../sdktypes/sdkobject_to_property.erb | 12 +- .../sdktypes/sdkprimitive_to_property.erb | 4 +- .../sdktypes/sdkstringmap_to_property.erb | 2 - .../azure/terraform/sdktypes/unsupport.erb | 2 +- templates/terraform/resource.erb | 33 +++- templates/terraform/schemas/empty.erb | 0 .../terraform/schemas/hide_from_schema.erb | 1 + 31 files changed, 638 insertions(+), 117 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_api_management_policy.go create mode 100644 build/azterraform/azurerm/resource_arm_api_management_policy_test.go create mode 100644 build/azterraform/website/docs/r/api_management_policy.html.markdown create mode 100644 products/azapimngpolicy/api.yaml create mode 100644 products/azapimngpolicy/api_management_name_schema.erb create mode 100644 products/azapimngpolicy/api_management_policy_name_schema.erb create mode 100644 products/azapimngpolicy/terraform.yaml create mode 100644 products/azapimngpolicy/terraform_get_format.erb create mode 100644 provider/azure/terraform/helpers.rb create mode 100644 provider/azure/terraform/sdk/helpers.rb create mode 100644 provider/azure/terraform/sdk/sub_template.rb rename templates/azure/terraform/sdktypes/{property_to_sdkenum.erb => enum_field_assign.erb} (54%) rename templates/azure/terraform/sdktypes/{property_to_sdkprimitive.erb => expand_func_field_assign.erb} (88%) create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb delete mode 100644 templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb delete mode 100644 templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb create mode 100644 templates/terraform/schemas/empty.erb create mode 100644 templates/terraform/schemas/hide_from_schema.erb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 791446e464c1..2801f757fd88 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -19,7 +19,7 @@ def validate check_optional_property :python_client, String check_property :create, Api::Azure::SDKOperationDefinition check_property :read, Api::Azure::SDKOperationDefinition - check_property :update, Api::Azure::SDKOperationDefinition + check_optional_property :update, Api::Azure::SDKOperationDefinition check_property :delete, Api::Azure::SDKOperationDefinition end end diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 8a5dc161c6f4..0043e814dd31 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -29,9 +29,6 @@ def validate end end - class StringMapObject < SDKTypeDefinition - end - class ComplexObject < SDKTypeDefinition attr_reader :go_type_name diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy.go b/build/azterraform/azurerm/resource_arm_api_management_policy.go new file mode 100644 index 000000000000..77f733efce0c --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_api_management_policy.go @@ -0,0 +1,156 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmApiManagementPolicy() *schema.Resource { + return &schema.Resource{ + Create: resourceArmApiManagementPolicyCreateUpdate, + Read: resourceArmApiManagementPolicyRead, + Update: resourceArmApiManagementPolicyCreateUpdate, + Delete: resourceArmApiManagementPolicyDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": azure.SchemaApiManagementChildName(), + + "resource_group_name": resourceGroupNameSchema(), + + "api_management_name": azure.SchemaApiManagementName(), + + "xml_content": { + Type: schema.TypeString, + Optional: true, + ConflictsWith: []string{"xml_link"}, + }, + + "xml_link": { + Type: schema.TypeString, + Optional: true, + ConflictsWith: []string{"xml_content"}, + }, + }, + } +} + +func resourceArmApiManagementPolicyCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).aPIManagementPolicyClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + serviceName := d.Get("api_management_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_api_management_policy", *resp.ID) + } + } + + xmlContent := d.Get("xml_content").(string) + xmlLink := d.Get("xml_link").(string) + // TODO: Implement customized logic for property 'format' since it is not included in schema + + parameters := apimanagement.PolicyContract{ + PolicyContractProperties: &apimanagement.PolicyContractProperties{ + // TODO: Implement customized logic for property 'format' since it is not included in schema + PolicyContent: utils.String(xmlContent), + PolicyContent: utils.String(xmlLink), + }, + } + + + if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, parameters); err != nil { + return fmt.Errorf("Error creating Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + return fmt.Errorf("Error retrieving Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Api Management Policy %q (Api Management Name %q / Resource Group %q) ID", name, serviceName, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmApiManagementPolicyRead(d, meta) +} + +func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).aPIManagementPolicyClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing Api Management Policy ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + serviceName := id.Path["service"] + name := id.Path["policies"] + + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Api Management Policy %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + } + + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + if properties := resp.PolicyContractProperties; properties != nil { + d.Set("xml_content", properties.PolicyContent) + d.Set("xml_link", properties.PolicyContent) + } + + return nil +} + + +func resourceArmApiManagementPolicyDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).aPIManagementPolicyClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing Api Management Policy ID %q: %+v", d.Id(), err) + } + resourceGroup := id.ResourceGroup + serviceName := id.Path["service"] + name := id.Path["policies"] + + if _, err := client.Delete(ctx, resourceGroup, serviceName, name); err != nil { + return fmt.Errorf("Error deleting Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go new file mode 100644 index 000000000000..2fd21873ac48 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go @@ -0,0 +1,76 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMApiManagementPolicyExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Api Management Policy not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + serviceName := rs.Primary.Attributes["api_management_name"] + + client := testAccProvider.Meta().(*ArmClient).aPIManagementPolicyClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Api Management Policy %q (Api Management Name %q / Resource Group %q) does not exist", name, serviceName, resourceGroup) + } + return fmt.Errorf("Bad: Get on aPIManagementPolicyClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMApiManagementPolicyDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).aPIManagementPolicyClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_api_management_policy" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + serviceName := rs.Primary.Attributes["api_management_name"] + + if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on aPIManagementPolicyClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown new file mode 100644 index 000000000000..dcae5379cf09 --- /dev/null +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -0,0 +1,61 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_api_management_policy" +sidebar_current: "docs-azurerm-resource-api-management-policy" +description: |- + Manages a policy within an API Management Service. +--- + +# azurerm_api_management_policy + +Manages a policy within an API Management Service. + + +## Example Usage - Resource Group + + +```hcl +resource "azurerm_resource_group" "example" { + name = "ExampleRG" + location = "West US" + + tags { + environment = "Production" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The Name of the Policy within the API Management Service. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the Resource Group in which the API Management Service exists. Changing this forces a new resource to be created. + +* `api_management_name` - (Required) The name of the API Management Service where this Policy should be created. Changing this forces a new resource to be created. + +* `xml_content` - (Optional) The alternative name of the service bus disaster recovery. + +* `xml_link` - (Optional) The alternative name of the service bus disaster recovery. + +* `format` - (Optional) The content format of the Policy. + +## Attributes Reference + +The following attributes are exported: + +* `id` - The api management policy ID. diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml new file mode 100644 index 000000000000..82ea4b855ffe --- /dev/null +++ b/products/azapimngpolicy/api.yaml @@ -0,0 +1,128 @@ +--- !ruby/object:Api::Product +name: Azure API Management Policy +prefix: azapimngpolicy +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'apimanagement' +azure_version: '2018-01-01' +objects: + - !ruby/object:Api::Resource + name: ApiManagementPolicy + api_name: APIManagementPolicy + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.ApiManagement + python_client_namespace: azure.mgmt.apimanagement + python_client: APIManagementClient + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: policies + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: PolicyContract + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: PolicyContractProperties + go_type_name: PolicyContractProperties + '/properties/contentFormat': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: ContentFormat + go_enum_type_name: PolicyContentFormat + '/properties/policyContent': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: PolicyContent + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: policies + go_variable_name: name + response: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: resourceGroup + 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: servicebusName + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: PolicyContract + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: PolicyContractProperties + go_type_name: PolicyContractProperties + go_variable_name: properties + '/properties/contentFormat': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: ContentFormat + go_enum_type_name: PolicyContentFormat + '/properties/policyContent': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: PolicyContent + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: policies + go_variable_name: name + + description: | + Manages a policy within an API Management Service. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: The name of the Resource Group in which the API Management Service exists. + required: true + input: true + order: 991 + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: apiManagementName + description: The name of the API Management Service where this Policy should be created. + required: true + input: true + order: 992 + azure_sdk_references: ['serviceName'] + properties: + - !ruby/object:Api::Type::String + name: name + description: The Name of the Policy within the API Management Service. + required: true + input: true + order: 800 + azure_sdk_references: ['policyId', '/name'] + - !ruby/object:Api::Type::String + name: xmlContent + description: 'The alternative name of the service bus disaster recovery.' + azure_sdk_references: ['/properties/policyContent'] + - !ruby/object:Api::Type::String + name: xmlLink + description: 'The alternative name of the service bus disaster recovery.' + azure_sdk_references: ['/properties/policyContent'] + - !ruby/object:Api::Type::Enum + name: format + values: + - :Xml + - :XmlLink + description: 'The content format of the Policy.' + order: 1100 + azure_sdk_references: ['/properties/contentFormat'] diff --git a/products/azapimngpolicy/api_management_name_schema.erb b/products/azapimngpolicy/api_management_name_schema.erb new file mode 100644 index 000000000000..aef793d33086 --- /dev/null +++ b/products/azapimngpolicy/api_management_name_schema.erb @@ -0,0 +1 @@ +"<%= property.name.underscore -%>": azure.SchemaApiManagementName(), \ No newline at end of file diff --git a/products/azapimngpolicy/api_management_policy_name_schema.erb b/products/azapimngpolicy/api_management_policy_name_schema.erb new file mode 100644 index 000000000000..5d001d5168aa --- /dev/null +++ b/products/azapimngpolicy/api_management_policy_name_schema.erb @@ -0,0 +1 @@ +"<%= property.name.underscore -%>": azure.SchemaApiManagementChildName(), \ No newline at end of file diff --git a/products/azapimngpolicy/terraform.yaml b/products/azapimngpolicy/terraform.yaml new file mode 100644 index 000000000000..ced2d9ca8717 --- /dev/null +++ b/products/azapimngpolicy/terraform.yaml @@ -0,0 +1,22 @@ +--- !ruby/object:Provider::Terraform::Config +name: Arm +overrides: !ruby/object:Provider::ResourceOverrides + ApiManagementPolicy: !ruby/object:Provider::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_definition: products/azapimngpolicy/api_management_policy_name_schema.erb + apiManagementName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_definition: products/azapimngpolicy/api_management_name_schema.erb + format: !ruby/object:Provider::Azure::Terraform::PropertyOverride + hide_from_schema: true + custom_schema_set: templates/terraform/schemas/empty.erb + xmlContent: !ruby/object:Provider::Azure::Terraform::PropertyOverride + conflicts_with: [xml_link] + xmlLink: !ruby/object:Provider::Azure::Terraform::PropertyOverride + conflicts_with: [xml_content] + example: + - !ruby/object:Provider::Terraform::Examples + name: "resource_group" + primary_resource_id: "example" + vars: + rg_name: "ExampleRG" diff --git a/products/azapimngpolicy/terraform_get_format.erb b/products/azapimngpolicy/terraform_get_format.erb new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index e902aa688eba..45b503aaf495 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,5 +1,8 @@ +require 'provider/azure/terraform/helpers' require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform/sdk/sub_template' +require 'provider/azure/terraform/sdk/helpers' require 'provider/azure/terraform/example/example' require 'provider/azure/terraform/example/sub_template' require 'provider/azure/terraform/example/helpers' @@ -11,8 +14,11 @@ module Provider module Azure module Terraform + include Provider::Azure::Terraform::Helpers include Provider::Azure::Terraform::Schema include Provider::Azure::Terraform::SubTemplate + include Provider::Azure::Terraform::SDK::SubTemplate + include Provider::Azure::Terraform::SDK::Helpers include Provider::Azure::Terraform::Example::SubTemplate include Provider::Azure::Terraform::Example::Helpers include Provider::Azure::Terraform::AccTest::SubTemplate diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb new file mode 100644 index 000000000000..4778aed98fc1 --- /dev/null +++ b/provider/azure/terraform/helpers.rb @@ -0,0 +1,12 @@ +module Provider + module Azure + module Terraform + module Helpers + def get_property_value(obj, prop_name, default_value) + return default_value unless obj.instance_variable_defined?("@#{prop_name}") + obj.instance_variable_get("@#{prop_name}") + end + end + end + end +end diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index dfe4221a23c0..dab8294aed25 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -4,6 +4,7 @@ module Provider module Azure module Terraform module OverrideFields + attr_reader :hide_from_schema attr_reader :custom_schema_definition attr_reader :custom_schema_get attr_reader :custom_schema_set @@ -15,6 +16,8 @@ class PropertyOverride < Provider::Terraform::PropertyOverride def validate super + @hide_from_schema ||= false + check_optional_property :hide_from_schema, :boolean check_optional_property :custom_schema_definition, String check_optional_property :custom_schema_get, String check_optional_property :custom_schema_set, String diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 26fc63bbd7e5..a7d9e28b2b44 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -30,7 +30,7 @@ def expand_funcs end def schema_property_template(property) - return property.custom_schema_definition if property.instance_variable_defined?(:@custom_schema_definition) && !property.custom_schema_definition.nil? + return property.custom_schema_definition unless get_property_value(property, "custom_schema_definition", nil).nil? case property when Api::Azure::Type::ResourceGroupName 'templates/azure/terraform/schemas/resource_group_name.erb' @@ -46,7 +46,8 @@ def schema_property_template(property) end def schema_property_get_template(property) - return property.custom_schema_get if property.instance_variable_defined?(:@custom_schema_get) && !property.custom_schema_get.nil? + return property.custom_schema_get unless get_property_value(property, "custom_schema_get", nil).nil? + return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' @@ -58,7 +59,8 @@ def schema_property_get_template(property) end def schema_property_set_template(property) - return property.custom_schema_set if property.instance_variable_defined?(:@custom_schema_set) && !property.custom_schema_set.nil? + return property.custom_schema_set unless get_property_value(property, "custom_schema_set", nil).nil? + return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_set.erb' @@ -71,37 +73,6 @@ def schema_property_set_template(property) end end - def property_to_sdk_object_template(sdk_type_defs, api_path) - case sdk_type_defs[api_path] - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject - 'templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb' - when Api::Azure::SDKTypeDefinition::EnumObject - 'templates/azure/terraform/sdktypes/property_to_sdkenum.erb' - when Api::Azure::SDKTypeDefinition::StringMapObject - 'templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb' - when Api::Azure::SDKTypeDefinition::ComplexObject - 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' - else - 'templates/azure/terraform/sdktypes/unsupport.erb' - end - end - - def sdk_object_to_property_template(sdk_type_defs, api_path) - return 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' if api_path == "" - case sdk_type_defs[api_path] - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject - 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' - when Api::Azure::SDKTypeDefinition::EnumObject - 'templates/azure/terraform/sdktypes/sdkenum_to_property.erb' - when Api::Azure::SDKTypeDefinition::StringMapObject - 'templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb' - when Api::Azure::SDKTypeDefinition::ComplexObject - 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' - else - 'templates/azure/terraform/sdktypes/unsupport.erb' - end - end - end end end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb new file mode 100644 index 000000000000..745bf8d9d367 --- /dev/null +++ b/provider/azure/terraform/sdk/helpers.rb @@ -0,0 +1,50 @@ +module Provider + module Azure + module Terraform + module SDK + module Helpers + def get_properties_matching_sdk_reference(sdk_reference, object) + object.all_user_properties + .select{|p| p.azure_sdk_references.include?(sdk_reference)} + .sort_by{|p| [p.order, p.name]} + end + + def property_to_sdk_field_assignment_template(property, sdk_type) + return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) + case sdk_type + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' + when Api::Azure::SDKTypeDefinition::EnumObject + 'templates/azure/terraform/sdktypes/enum_fiield_assign.erb' + else + 'templates/azure/terraform/sdktypes/unsupport.erb' + end + end + + def property_to_sdk_object_template(sdk_type_defs, api_path) + case sdk_type_defs[api_path] + when Api::Azure::SDKTypeDefinition::ComplexObject + 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' + else + 'templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb' + end + end + + def sdk_object_to_property_template(sdk_type_defs, api_path) + return 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' if api_path == "" + case sdk_type_defs[api_path] + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' + when Api::Azure::SDKTypeDefinition::EnumObject + 'templates/azure/terraform/sdktypes/sdkenum_to_property.erb' + when Api::Azure::SDKTypeDefinition::ComplexObject + 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' + else + 'templates/azure/terraform/sdktypes/unsupport.erb' + end + end + end + end + end + end +end diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb new file mode 100644 index 000000000000..02375da13b6f --- /dev/null +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -0,0 +1,58 @@ +module Provider + module Azure + module Terraform + module SDK + module SubTemplate + def build_schema_property_get(input, output, property, object, indentation = 0) + compile_template schema_property_get_template(property), + indentation: indentation, + input_var: input, + output_var: output, + prop_name: property.name.underscore, + property: property, + object: object + end + + def build_schema_property_set(input, output, property, indentation = 0) + compile_template schema_property_set_template(property), + indentation: indentation, + input_var: input, + output_var: output, + prop_name: property.name.underscore, + property: property + end + + def build_sdk_field_assignment(property, sdk_type, resource_name) + compile_template property_to_sdk_field_assignment_template(property, sdk_type), + property: property, + sdk_type: sdk_type, + resouce_name: resource_name + end + + def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object, indentation = 4) + compile_template property_to_sdk_object_template(sdk_type_defs, api_path), + indentation: indentation, + resource_name: resource_name, + api_path: api_path, + sdk_type_defs: sdk_type_defs, + object: object + end + + def build_sdk_object_to_property(input, api_path, sdk_type_defs, object, indentation = 4) + compile_template sdk_object_to_property_template(sdk_type_defs, api_path), + indentation: indentation, + input_statement: input, + api_path: api_path, + sdk_type_defs: sdk_type_defs, + object: object + end + + def build_sdk_func_invocation(sdk_op_def) + compile_template 'templates/azure/terraform/sdk/function_invocation.erb', + sdk_op_def: sdk_op_def + end + end + end + end + end +end diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 37ea7abab52b..9e1ff32d7dcf 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -2,51 +2,6 @@ module Provider module Azure module Terraform module SubTemplate - - def build_schema_property_get(input, output, property, object, indentation = 0) - compile_template schema_property_get_template(property), - indentation: indentation, - input_var: input, - output_var: output, - prop_name: property.name.underscore, - property: property, - object: object - end - - def build_schema_property_set(input, output, property, indentation = 0) - compile_template schema_property_set_template(property), - indentation: indentation, - input_var: input, - output_var: output, - prop_name: property.name.underscore, - property: property - end - - def build_property_to_sdk_object(api_path, property, resource_name, sdk_type_defs, object, indentation = 4) - compile_template property_to_sdk_object_template(sdk_type_defs, api_path), - indentation: indentation, - resource_name: resource_name, - api_path: api_path, - property: property, - sdk_type_defs: sdk_type_defs, - object: object - end - - def build_sdk_object_to_property(input, api_path, property, sdk_type_defs, object, indentation = 4) - compile_template sdk_object_to_property_template(sdk_type_defs, api_path), - indentation: indentation, - input_statement: input, - api_path: api_path, - property: property, - sdk_type_defs: sdk_type_defs, - object: object - end - - def build_sdk_func_invocation(sdk_op_def) - compile_template 'templates/azure/terraform/sdk/function_invocation.erb', - sdk_op_def: sdk_op_def - end - def build_azure_id_parser(sdk_op_def, object, indentation = 4) compile_template 'templates/azure/terraform/sdk/azure_id_parser.erb', indentation: indentation, @@ -62,7 +17,6 @@ def build_errorf_with_resource_name(format_string, include_error, sdk_op_def, pr properties: properties, object: object end - end end end diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index c33cb35b68b5..860f8ec8d9ac 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -1,19 +1,22 @@ <% res_name = "" + res_var = "" depends = [] - param_vars = [] + depends_vars = [] properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) && !p.azure_sdk_references[0].start_with?("/") }.each do |prop| param = sdk_op_def.request[prop.azure_sdk_references[0]] - param_vars += [param.go_variable_name] case prop.name when "name" res_name = "#{object.name.titlecase} %q" + res_var = param.go_variable_name when "resourceGroupName" depends += ["Resource Group %q"] + depends_vars += [param.go_variable_name] else depends += ["#{prop.name.titlecase} %q"] + depends_vars += [param.go_variable_name] end end - res_name += " (#{depends.join(', ')})" unless depends.empty? + res_name += " (#{depends.reverse.join(' / ')})" unless depends.empty? -%> -fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= param_vars.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file +fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= res_var -%>, <%= depends_vars.reverse.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb b/templates/azure/terraform/sdktypes/enum_field_assign.erb similarity index 54% rename from templates/azure/terraform/sdktypes/property_to_sdkenum.erb rename to templates/azure/terraform/sdktypes/enum_field_assign.erb index 1506fb51de27..9920e2c48819 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkenum.erb +++ b/templates/azure/terraform/sdktypes/enum_field_assign.erb @@ -1,5 +1,2 @@ -<% - sdk_package = azure_resource_go_package(object.__product) - sdk_type = sdk_type_defs[api_path] --%> +<% sdk_package = azure_resource_go_package(object.__product) -%> <%= sdk_type.go_field_name -%>: <%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb similarity index 88% rename from templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb rename to templates/azure/terraform/sdktypes/expand_func_field_assign.erb index e1f8bc0249b6..e35483681207 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkprimitive.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,4 +1,3 @@ -<% sdk_type = sdk_type_defs[api_path] -%> <% if expand_funcs.include?(property.class) -%> <%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> diff --git a/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb b/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb new file mode 100644 index 000000000000..e90e27806f62 --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb @@ -0,0 +1,3 @@ +<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> +<%= lines(build_sdk_field_assignment(property, sdk_type_defs[api_path], resource_name)) -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 5b78c6ac12fb..ed93ca6c6653 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -9,8 +9,8 @@ <% end - direct_children = Hash.new - object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| + direct_children = Set.new + object.all_user_properties.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "/" && child_api_path.start_with?(api_path) sub_paths = child_api_path.split("/") @@ -20,14 +20,14 @@ end if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" sub_api_path = api_path + "/" + sub_paths[1] - direct_children[sub_api_path] = (direct_children[sub_api_path] || nil) if sub_paths.length > 2 - direct_children[child_api_path] = prop if sub_paths.length == 2 + direct_children << sub_api_path if sub_paths.length > 2 + direct_children << child_api_path if sub_paths.length == 2 end end end - direct_children.each do |child_api_path, prop| + direct_children.to_a.sort.each do |child_api_path| -%> -<%= lines(build_property_to_sdk_object(child_api_path, prop, resource_name, sdk_type_defs, object)) -%> +<%= lines(build_property_to_sdk_object(child_api_path, resource_name, sdk_type_defs, object)) -%> <% end -%> }<%= "," unless api_path == "" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb b/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb deleted file mode 100644 index 1375fb9257c8..000000000000 --- a/templates/azure/terraform/sdktypes/property_to_sdkstringmap.erb +++ /dev/null @@ -1 +0,0 @@ -<%= sdk_type_defs[api_path].go_field_name -%>: utils.ExpandStringMap(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb index b27725ccd044..c8ece6725839 100644 --- a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb @@ -1,2 +1,4 @@ <% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> -<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file +<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> +<%= lines(build_schema_property_set(input_var, 'd', property)) -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 3182193136a2..36b4e8dd6c84 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -8,25 +8,25 @@ if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; < <% end - direct_children = Hash.new + direct_children = Set.new object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "" sub_paths = child_api_path.split("/") - direct_children[child_api_path] = prop if sub_paths.length == 1 + direct_children << child_api_path if sub_paths.length == 1 elsif child_api_path.start_with?(api_path + "/") sub_paths = child_api_path[api_path.length..-1].split("/") end if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" sub_api_path = api_path + "/" + sub_paths[1] - direct_children[sub_api_path] = (direct_children[sub_api_path] || nil) if sub_paths.length > 2 - direct_children[child_api_path] = prop if sub_paths.length == 2 + direct_children << sub_api_path if sub_paths.length > 2 + direct_children << child_api_path if sub_paths.length == 2 end end end - direct_children.each do |child_api_path, prop| + direct_children.each do |child_api_path| -%> -<%= lines(build_sdk_object_to_property(temp_var, child_api_path, prop, sdk_type_defs, object)) -%> +<%= lines(build_sdk_object_to_property(temp_var, child_api_path, sdk_type_defs, object)) -%> <% end -%> <%= "}" unless api_path == "" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb index 6d1ca08edc04..54faf0f435b0 100644 --- a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb @@ -1,3 +1,5 @@ <% sdk_type = sdk_type_defs[api_path] -%> <% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> -<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file +<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> +<%= lines(build_schema_property_set(input_var, 'd', property)) -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb b/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb deleted file mode 100644 index df64e2f010a6..000000000000 --- a/templates/azure/terraform/sdktypes/sdkstringmap_to_property.erb +++ /dev/null @@ -1,2 +0,0 @@ -<% input_var = "utils.FlattenStringMap(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> -<%= lines(build_schema_property_set(input_var, 'd', property)) -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/unsupport.erb b/templates/azure/terraform/sdktypes/unsupport.erb index 3357632e69d5..03fe6de36f4d 100644 --- a/templates/azure/terraform/sdktypes/unsupport.erb +++ b/templates/azure/terraform/sdktypes/unsupport.erb @@ -1 +1 @@ -// TODO: property <%= property.name -%> (SDK Reference <%= api_path -%>) with type <%= sdk_type_defs[api_path] -%> is not supported \ No newline at end of file +// TODO: SDK Reference <%= api_path -%> with type <%= sdk_type_defs[api_path] -%> is not supported \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e026446f1946..954affc85f72 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -20,6 +20,7 @@ package azurerm <% resource_name = "Arm" + object.name + terraform_name = "azurerm_" + object.name.underscore properties = object.all_user_properties # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. @@ -39,7 +40,7 @@ package azurerm sdk_package = azure_resource_go_package(object.__product) -%> <% - combine_create_update = (object.azure_sdk_definition.create.go_func_name == object.azure_sdk_definition.update.go_func_name) + combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.go_func_name == object.azure_sdk_definition.update.go_func_name) create_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Create") update_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Update") -%> @@ -78,7 +79,7 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(compile(object.custom_code.resource_definition)) if object.custom_code.resource_definition -%> Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> -<% order_azure_properties(properties).each do |prop| -%> +<% order_azure_properties(properties.reject(&:hide_from_schema)).each do |prop| -%> <%= lines_before(build_schema_property(prop, object, 12)) -%> <% end -%> @@ -101,13 +102,33 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext -<% settable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% settable_properties.reject{|p| p.azure_sdk_references[0].start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", nil, resource_name, object.azure_sdk_definition.create.request, object)) -%> + if requireResourcesToBeImported { + resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> + + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return <%= build_errorf_with_resource_name("Error checking for present of existing %s", true, object.azure_sdk_definition.read, properties, object) -%> + + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("<%= terraform_name -%>", *resp.ID) + } + } + +<% settable_properties.select{|p| p.azure_sdk_references[0].start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> +<% end -%> + +<%= lines(build_property_to_sdk_object("/", resource_name, object.azure_sdk_definition.create.request, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -185,7 +206,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) resource_name: resource_name) -%> <% end -%> -<%= lines(build_sdk_object_to_property("resp", "", nil, object.azure_sdk_definition.read.response, object, 0)) -%> +<%= lines(build_sdk_object_to_property("resp", "", object.azure_sdk_definition.read.response, object, 0)) -%> return nil } @@ -206,7 +227,7 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", nil, resource_name, object.azure_sdk_definition.update.request, object)) -%> +<%= lines(build_property_to_sdk_object("/", resource_name, object.azure_sdk_definition.update.request, object)) -%> future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.update) -%> diff --git a/templates/terraform/schemas/empty.erb b/templates/terraform/schemas/empty.erb new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/templates/terraform/schemas/hide_from_schema.erb b/templates/terraform/schemas/hide_from_schema.erb new file mode 100644 index 000000000000..06d187eff3ff --- /dev/null +++ b/templates/terraform/schemas/hide_from_schema.erb @@ -0,0 +1 @@ +// TODO: Implement customized logic for property '<%= property.name -%>' since it is not included in schema \ No newline at end of file From f4457b0f3d31cb6fc4deca4aae632dd2b22d9f2c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 28 Mar 2019 19:15:49 -0700 Subject: [PATCH 043/175] Refine API Management Policy resource. --- .../resource_arm_api_management_policy.go | 64 +++++++++++-------- ...resource_arm_api_management_policy_test.go | 16 ++--- .../r/api_management_policy.html.markdown | 46 +++++++++---- .../examples/terraform/basic.yaml | 15 +++++ products/azapimngpolicy/api.yaml | 26 ++------ .../api_management_policy_name_schema.erb | 1 - .../examples/terraform/basic.yaml | 13 ++++ products/azapimngpolicy/terraform.yaml | 31 +++++---- ...a.erb => terraform_apimng_name_schema.erb} | 0 .../terraform_content_field_assign.erb | 1 + .../terraform_format_content_set.erb | 7 ++ .../terraform_format_field_assign.erb | 1 + .../azapimngpolicy/terraform_format_get.erb | 10 +++ .../azapimngpolicy/terraform_get_format.erb | 0 provider/azure/terraform/property_override.rb | 4 ++ provider/azure/terraform/resource_override.rb | 2 + provider/azure/terraform/sdk/helpers.rb | 1 + .../terraform/example/hcl_properties.erb | 2 + .../azure/terraform/sdk/azure_id_parser.erb | 2 +- .../sdk/errorf_with_resource_name.erb | 7 +- .../terraform/resource.html.markdown.erb | 5 +- 21 files changed, 165 insertions(+), 89 deletions(-) create mode 100644 products/azapimanagement/examples/terraform/basic.yaml delete mode 100644 products/azapimngpolicy/api_management_policy_name_schema.erb create mode 100644 products/azapimngpolicy/examples/terraform/basic.yaml rename products/azapimngpolicy/{api_management_name_schema.erb => terraform_apimng_name_schema.erb} (100%) create mode 100644 products/azapimngpolicy/terraform_content_field_assign.erb create mode 100644 products/azapimngpolicy/terraform_format_content_set.erb create mode 100644 products/azapimngpolicy/terraform_format_field_assign.erb create mode 100644 products/azapimngpolicy/terraform_format_get.erb delete mode 100644 products/azapimngpolicy/terraform_get_format.erb diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy.go b/build/azterraform/azurerm/resource_arm_api_management_policy.go index 77f733efce0c..683dbe7d9d03 100644 --- a/build/azterraform/azurerm/resource_arm_api_management_policy.go +++ b/build/azterraform/azurerm/resource_arm_api_management_policy.go @@ -29,8 +29,6 @@ func resourceArmApiManagementPolicy() *schema.Resource { Schema: map[string]*schema.Schema{ - "name": azure.SchemaApiManagementChildName(), - "resource_group_name": resourceGroupNameSchema(), "api_management_name": azure.SchemaApiManagementName(), @@ -38,6 +36,7 @@ func resourceArmApiManagementPolicy() *schema.Resource { "xml_content": { Type: schema.TypeString, Optional: true, + DiffSuppressFunc: suppress.SuppressXmlDiff, ConflictsWith: []string{"xml_link"}, }, @@ -51,18 +50,17 @@ func resourceArmApiManagementPolicy() *schema.Resource { } func resourceArmApiManagementPolicyCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).aPIManagementPolicyClient + client := meta.(*ArmClient).apiManagementPolicyClient ctx := meta.(*ArmClient).StopContext - name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) serviceName := d.Get("api_management_name").(string) if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, serviceName, name) + resp, err := client.Get(ctx, resourceGroup, serviceName) if err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + return fmt.Errorf("Error checking for present of existing Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) } } if !utils.ResponseWasNotFound(resp.Response) { @@ -72,28 +70,36 @@ func resourceArmApiManagementPolicyCreateUpdate(d *schema.ResourceData, meta int xmlContent := d.Get("xml_content").(string) xmlLink := d.Get("xml_link").(string) - // TODO: Implement customized logic for property 'format' since it is not included in schema + if xmlContent == "" && xmlLink == "" { + return fmt.Errorf("Either `xml_content` or `xml_link` is required") + } + + content := xmlContent + format := apimanagement.XML + if xmlLink != "" { + content = xmlLink + format = apimanagement.XMLLink + } parameters := apimanagement.PolicyContract{ PolicyContractProperties: &apimanagement.PolicyContractProperties{ - // TODO: Implement customized logic for property 'format' since it is not included in schema - PolicyContent: utils.String(xmlContent), - PolicyContent: utils.String(xmlLink), + ContentFormat: format, + PolicyContent: utils.String(content), }, } - if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, parameters); err != nil { - return fmt.Errorf("Error creating Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, parameters); err != nil { + return fmt.Errorf("Error creating Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) } - resp, err := client.Get(ctx, resourceGroup, serviceName, name) + resp, err := client.Get(ctx, resourceGroup, serviceName) if err != nil { - return fmt.Errorf("Error retrieving Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + return fmt.Errorf("Error retrieving Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Api Management Policy %q (Api Management Name %q / Resource Group %q) ID", name, serviceName, resourceGroup) + return fmt.Errorf("Cannot read Global Policy (API Management Service %q / Resource Group %q) ID", serviceName, resourceGroup) } d.SetId(*resp.ID) @@ -101,34 +107,37 @@ func resourceArmApiManagementPolicyCreateUpdate(d *schema.ResourceData, meta int } func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).aPIManagementPolicyClient + client := meta.(*ArmClient).apiManagementPolicyClient ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Api Management Policy ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup serviceName := id.Path["service"] - name := id.Path["policies"] - resp, err := client.Get(ctx, resourceGroup, serviceName, name) + resp, err := client.Get(ctx, resourceGroup, serviceName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] Api Management Policy %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return fmt.Errorf("Error reading Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + return fmt.Errorf("Error reading Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) } - d.Set("name", resp.Name) d.Set("resource_group_name", resourceGroup) if properties := resp.PolicyContractProperties; properties != nil { - d.Set("xml_content", properties.PolicyContent) - d.Set("xml_link", properties.PolicyContent) + d.Set("xml_content", "") + d.Set("xml_link", "") + if properties.ContentFormat == apimanagement.XML { + d.Set("xml_content", properties.PolicyContent) + } else if properties.ContentFormat == apimanagement.XMLLink { + d.Set("xml_link", properties.PolicyContent) + } } return nil @@ -136,20 +145,19 @@ func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{} func resourceArmApiManagementPolicyDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).aPIManagementPolicyClient + client := meta.(*ArmClient).apiManagementPolicyClient ctx := meta.(*ArmClient).StopContext id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Api Management Policy ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup serviceName := id.Path["service"] - name := id.Path["policies"] - if _, err := client.Delete(ctx, resourceGroup, serviceName, name); err != nil { - return fmt.Errorf("Error deleting Api Management Policy %q (Api Management Name %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err) + if _, err := client.Delete(ctx, resourceGroup, serviceName, ""); err != nil { + return fmt.Errorf("Error deleting Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go index 2fd21873ac48..7430fd576341 100644 --- a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go +++ b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go @@ -32,18 +32,17 @@ func testCheckAzureRMApiManagementPolicyExists(resourceName string) resource.Tes return fmt.Errorf("Api Management Policy not found: %s", resourceName) } - name := rs.Primary.Attributes["name"] resourceGroup := rs.Primary.Attributes["resource_group_name"] serviceName := rs.Primary.Attributes["api_management_name"] - client := testAccProvider.Meta().(*ArmClient).aPIManagementPolicyClient + client := testAccProvider.Meta().(*ArmClient).apiManagementPolicyClient ctx := testAccProvider.Meta().(*ArmClient).StopContext - if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if resp, err := client.Get(ctx, resourceGroup, serviceName); err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Api Management Policy %q (Api Management Name %q / Resource Group %q) does not exist", name, serviceName, resourceGroup) + return fmt.Errorf("Bad: Global Policy (API Management Service %q / Resource Group %q) does not exist", serviceName, resourceGroup) } - return fmt.Errorf("Bad: Get on aPIManagementPolicyClient: %+v", err) + return fmt.Errorf("Bad: Get on apiManagementPolicyClient: %+v", err) } return nil @@ -51,7 +50,7 @@ func testCheckAzureRMApiManagementPolicyExists(resourceName string) resource.Tes } func testCheckAzureRMApiManagementPolicyDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).aPIManagementPolicyClient + client := testAccProvider.Meta().(*ArmClient).apiManagementPolicyClient ctx := testAccProvider.Meta().(*ArmClient).StopContext for _, rs := range s.RootModule().Resources { @@ -59,13 +58,12 @@ func testCheckAzureRMApiManagementPolicyDestroy(s *terraform.State) error { continue } - name := rs.Primary.Attributes["name"] resourceGroup := rs.Primary.Attributes["resource_group_name"] serviceName := rs.Primary.Attributes["api_management_name"] - if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if resp, err := client.Get(ctx, resourceGroup, serviceName); err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on aPIManagementPolicyClient: %+v", err) + return fmt.Errorf("Bad: Get on apiManagementPolicyClient: %+v", err) } } diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown index dcae5379cf09..48cec65ca71d 100644 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -16,46 +16,64 @@ layout: "azurerm" page_title: "Azure Resource Manager: azurerm_api_management_policy" sidebar_current: "docs-azurerm-resource-api-management-policy" description: |- - Manages a policy within an API Management Service. + Manages a global Policy within an API Management Service. --- # azurerm_api_management_policy -Manages a policy within an API Management Service. +Manages a global Policy within an API Management Service. -## Example Usage - Resource Group - +## Example Usage ```hcl resource "azurerm_resource_group" "example" { - name = "ExampleRG" + name = "example-rg" location = "West US" +} + +resource "azurerm_api_management" "example" { + name = "example-apim" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + publisher_name = "pub1" + publisher_email = "pub1@email.com" - tags { - environment = "Production" + sku = { + name = "Developer" + capacity = 1 } } + +resource "azurerm_api_management_policy" "example" { + resource_group_name = "${azurerm_resource_group.example.name}" + api_management_name = "${azurerm_api_management.example.name}" + xml_content = "" +} ``` ## Argument Reference The following arguments are supported: -* `name` - (Required) The Name of the Policy within the API Management Service. Changing this forces a new resource to be created. - * `resource_group_name` - (Required) The name of the Resource Group in which the API Management Service exists. Changing this forces a new resource to be created. * `api_management_name` - (Required) The name of the API Management Service where this Policy should be created. Changing this forces a new resource to be created. -* `xml_content` - (Optional) The alternative name of the service bus disaster recovery. +* `xml_content` - (Optional) The XML configuration of this Policy. -* `xml_link` - (Optional) The alternative name of the service bus disaster recovery. - -* `format` - (Optional) The content format of the Policy. +* `xml_link` - (Optional) The HTTP endpoint of the XML configuration accessible from the API Management Service. ## Attributes Reference The following attributes are exported: -* `id` - The api management policy ID. +* `id` - The ID of the Api Management Policy. + + +## Import + +ApiManagementPolicy can be imported using the `resource id`, e.g. +```shell +$ terraform import azurerm_api_management_policy.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/Microsoft.ApiManagement/service/ +``` diff --git a/products/azapimanagement/examples/terraform/basic.yaml b/products/azapimanagement/examples/terraform/basic.yaml new file mode 100644 index 000000000000..48abbd80787c --- /dev/null +++ b/products/azapimanagement/examples/terraform/basic.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_api_management +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic +properties: + name: "<%= get_resource_name('api_management_name', 'AM') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} + publisher_name: pub1 + publisher_email: pub1@email.com + sku: + name: Developer + capacity: 1 \ No newline at end of file diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml index 82ea4b855ffe..6f21589e6cce 100644 --- a/products/azapimngpolicy/api.yaml +++ b/products/azapimngpolicy/api.yaml @@ -12,7 +12,7 @@ azure_version: '2018-01-01' objects: - !ruby/object:Api::Resource name: ApiManagementPolicy - api_name: APIManagementPolicy + api_name: ApiManagementPolicy base_url: NotUsedInAzure azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition @@ -28,9 +28,6 @@ objects: 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: service go_variable_name: serviceName - 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: policies - go_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: PolicyContract @@ -51,9 +48,6 @@ objects: 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: service go_variable_name: serviceName - 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: policies - go_variable_name: name response: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_variable_name: resourceGroup @@ -81,12 +75,11 @@ objects: 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: service go_variable_name: serviceName - 'policyId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: policies - go_variable_name: name + 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: '""' description: | - Manages a policy within an API Management Service. + Manages a global Policy within an API Management Service. parameters: - !ruby/object:Api::Azure::Type::ResourceGroupName name: resourceGroupName @@ -103,20 +96,13 @@ objects: order: 992 azure_sdk_references: ['serviceName'] properties: - - !ruby/object:Api::Type::String - name: name - description: The Name of the Policy within the API Management Service. - required: true - input: true - order: 800 - azure_sdk_references: ['policyId', '/name'] - !ruby/object:Api::Type::String name: xmlContent - description: 'The alternative name of the service bus disaster recovery.' + description: The XML configuration of this Policy. azure_sdk_references: ['/properties/policyContent'] - !ruby/object:Api::Type::String name: xmlLink - description: 'The alternative name of the service bus disaster recovery.' + description: The HTTP endpoint of the XML configuration accessible from the API Management Service. azure_sdk_references: ['/properties/policyContent'] - !ruby/object:Api::Type::Enum name: format diff --git a/products/azapimngpolicy/api_management_policy_name_schema.erb b/products/azapimngpolicy/api_management_policy_name_schema.erb deleted file mode 100644 index 5d001d5168aa..000000000000 --- a/products/azapimngpolicy/api_management_policy_name_schema.erb +++ /dev/null @@ -1 +0,0 @@ -"<%= property.name.underscore -%>": azure.SchemaApiManagementChildName(), \ No newline at end of file diff --git a/products/azapimngpolicy/examples/terraform/basic.yaml b/products/azapimngpolicy/examples/terraform/basic.yaml new file mode 100644 index 000000000000..665865c22b2e --- /dev/null +++ b/products/azapimngpolicy/examples/terraform/basic.yaml @@ -0,0 +1,13 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_api_management_policy +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azapimanagement + example: basic +properties: + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + api_management_name: ${azurerm_api_management.<%= resource_id_hint -%>.name} + xml_content: \ No newline at end of file diff --git a/products/azapimngpolicy/terraform.yaml b/products/azapimngpolicy/terraform.yaml index ced2d9ca8717..25e3adb4d8b5 100644 --- a/products/azapimngpolicy/terraform.yaml +++ b/products/azapimngpolicy/terraform.yaml @@ -1,22 +1,31 @@ --- !ruby/object:Provider::Terraform::Config -name: Arm +name: azapimngpolicy overrides: !ruby/object:Provider::ResourceOverrides - ApiManagementPolicy: !ruby/object:Provider::Terraform::ResourceOverride + ApiManagementPolicy: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name_in_logs: Global Policy properties: - name: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_definition: products/azapimngpolicy/api_management_policy_name_schema.erb apiManagementName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_definition: products/azapimngpolicy/api_management_name_schema.erb + name_in_logs: API Management Service + custom_schema_definition: products/azapimngpolicy/terraform_apimng_name_schema.erb format: !ruby/object:Provider::Azure::Terraform::PropertyOverride hide_from_schema: true + custom_schema_get: products/azapimngpolicy/terraform_format_get.erb custom_schema_set: templates/terraform/schemas/empty.erb + custom_sdkfield_assign: products/azapimngpolicy/terraform_format_field_assign.erb xmlContent: !ruby/object:Provider::Azure::Terraform::PropertyOverride conflicts_with: [xml_link] + diff_suppress_func: 'suppress.SuppressXmlDiff' + custom_schema_set: products/azapimngpolicy/terraform_format_content_set.erb + custom_sdkfield_assign: products/azapimngpolicy/terraform_content_field_assign.erb xmlLink: !ruby/object:Provider::Azure::Terraform::PropertyOverride conflicts_with: [xml_content] - example: - - !ruby/object:Provider::Terraform::Examples - name: "resource_group" - primary_resource_id: "example" - vars: - rg_name: "ExampleRG" + custom_schema_set: templates/terraform/schemas/empty.erb + custom_sdkfield_assign: templates/terraform/schemas/empty.erb + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroupName: example-rg + apiManagementName: example-apim + location: West US diff --git a/products/azapimngpolicy/api_management_name_schema.erb b/products/azapimngpolicy/terraform_apimng_name_schema.erb similarity index 100% rename from products/azapimngpolicy/api_management_name_schema.erb rename to products/azapimngpolicy/terraform_apimng_name_schema.erb diff --git a/products/azapimngpolicy/terraform_content_field_assign.erb b/products/azapimngpolicy/terraform_content_field_assign.erb new file mode 100644 index 000000000000..12ba86d032d5 --- /dev/null +++ b/products/azapimngpolicy/terraform_content_field_assign.erb @@ -0,0 +1 @@ +PolicyContent: utils.String(content), \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_content_set.erb b/products/azapimngpolicy/terraform_format_content_set.erb new file mode 100644 index 000000000000..cb3e270a4a1b --- /dev/null +++ b/products/azapimngpolicy/terraform_format_content_set.erb @@ -0,0 +1,7 @@ +d.Set("xml_content", "") +d.Set("xml_link", "") +if properties.ContentFormat == apimanagement.XML { + d.Set("xml_content", properties.PolicyContent) +} else if properties.ContentFormat == apimanagement.XMLLink { + d.Set("xml_link", properties.PolicyContent) +} \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_field_assign.erb b/products/azapimngpolicy/terraform_format_field_assign.erb new file mode 100644 index 000000000000..c1dafcd773c1 --- /dev/null +++ b/products/azapimngpolicy/terraform_format_field_assign.erb @@ -0,0 +1 @@ +ContentFormat: format, \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_get.erb b/products/azapimngpolicy/terraform_format_get.erb new file mode 100644 index 000000000000..d1724d7bd80e --- /dev/null +++ b/products/azapimngpolicy/terraform_format_get.erb @@ -0,0 +1,10 @@ +if xmlContent == "" && xmlLink == "" { + return fmt.Errorf("Either `xml_content` or `xml_link` is required") +} + +content := xmlContent +format := apimanagement.XML +if xmlLink != "" { + content = xmlLink + format = apimanagement.XMLLink +} \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_get_format.erb b/products/azapimngpolicy/terraform_get_format.erb deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index dab8294aed25..6a9277f7df29 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -4,10 +4,12 @@ module Provider module Azure module Terraform module OverrideFields + attr_reader :name_in_logs attr_reader :hide_from_schema attr_reader :custom_schema_definition attr_reader :custom_schema_get attr_reader :custom_schema_set + attr_reader :custom_sdkfield_assign include Provider::Terraform::OverrideFields end @@ -17,10 +19,12 @@ class PropertyOverride < Provider::Terraform::PropertyOverride def validate super @hide_from_schema ||= false + check_optional_property :name_in_logs, String check_optional_property :hide_from_schema, :boolean check_optional_property :custom_schema_definition, String check_optional_property :custom_schema_get, String check_optional_property :custom_schema_set, String + check_optional_property :custom_sdkfield_assign, String end private diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index 564186aef8af..74a07b3a4b22 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -4,6 +4,7 @@ module Provider module Azure module Terraform module OverrideProperties + attr_reader :name_in_logs attr_reader :acctests attr_reader :document_examples include Provider::Terraform::OverrideProperties @@ -15,6 +16,7 @@ class ResourceOverride < Provider::Terraform::ResourceOverride def validate super @acctests ||= Array.new + check_optional_property :name_in_logs, String check_optional_property :acctests, Array check_optional_property_list :acctests, AccTestDefinition check_optional_property :document_examples, Array diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 745bf8d9d367..8b0b14d5a4b4 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -10,6 +10,7 @@ def get_properties_matching_sdk_reference(sdk_reference, object) end def property_to_sdk_field_assignment_template(property, sdk_type) + return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb index 574635540219..98f756a6f54f 100644 --- a/templates/azure/terraform/example/hcl_properties.erb +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -10,6 +10,8 @@ if prop[1].is_a?(String) -%> <%= prop[0].ljust(prop_alignment) -%> = "<%= prop[1] -%>" +<% elsif prop[1].is_a?(Integer) -%> +<%= prop[0].ljust(prop_alignment) -%> = <%= prop[1] -%> <% else -%> // TODO: Unsupported property "<%= prop[0] -%>" value <%= prop[1] -%> <% diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb index 36f8021b37a3..8e0dbb62a4d1 100644 --- a/templates/azure/terraform/sdk/azure_id_parser.erb +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -1,6 +1,6 @@ id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing <%= object.name.titlecase -%> ID %q: %+v", d.Id(), err) + return err } <% sdk_op_def.request.reject {|k, v| v.id_portion.nil?}.each_value do |param| -%> <%= param.go_variable_name -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index 860f8ec8d9ac..fb6e1b3507b1 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -7,16 +7,17 @@ param = sdk_op_def.request[prop.azure_sdk_references[0]] case prop.name when "name" - res_name = "#{object.name.titlecase} %q" + res_name = "#{get_property_value(prop, "name_in_logs", nil) || object.name.titlecase} %q" res_var = param.go_variable_name when "resourceGroupName" depends += ["Resource Group %q"] depends_vars += [param.go_variable_name] else - depends += ["#{prop.name.titlecase} %q"] + depends += ["#{get_property_value(prop, "name_in_logs", nil) || prop.name.titlecase} %q"] depends_vars += [param.go_variable_name] end end + res_name = "#{get_property_value(object, "name_in_logs", nil) || object.name.titlecase}" if res_name == "" res_name += " (#{depends.reverse.join(' / ')})" unless depends.empty? -%> -fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= res_var -%>, <%= depends_vars.reverse.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file +fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= res_var != "" ? "#{res_var}, " : "" -%><%= depends_vars.reverse.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 3ed675c16e9d..5380463bca09 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -37,7 +37,7 @@ -%> <% resource_name = object.name.underscore - properties = object.all_user_properties + properties = object.all_user_properties.reject(&:hide_from_schema) -%> --- <%= lines(autogen_notice :yaml) -%> @@ -90,6 +90,7 @@ To get more information about <%= object.name -%>, see: ```hcl +<% print product_ns -%> <%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name, example_ref.resource_name_hints, true)) -%> ``` @@ -115,7 +116,7 @@ The following arguments are supported: The following attributes are exported: -* `id` - The <%= resource_name.gsub("_", " ") -%> ID. +* `id` - The ID of the <%= resource_name.titlecase -%>. <% properties.select(&:output).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> From 1d632ecefd1e4d36932227c11391ce6c06d96ebc Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 28 Mar 2019 19:52:50 -0700 Subject: [PATCH 044/175] Add acceptance tests for API Management Policy. --- ...resource_arm_api_management_policy_test.go | 143 ++++++++++++++++++ .../r/api_management_policy.html.markdown | 2 +- .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/findReplace.yaml | 13 ++ products/azapimngpolicy/terraform.yaml | 12 +- 5 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 products/azapimngpolicy/examples/terraform/findReplace.yaml diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go index 7430fd576341..ab17ffae8e59 100644 --- a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go +++ b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go @@ -24,6 +24,93 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) +func TestAccAzureRMApiManagementPolicy_basic(t *testing.T) { + resourceName := "azurerm_api_management_policy.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMApiManagementPolicy_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementPolicyExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "xml_content", ""), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMApiManagementPolicy_findReplace(t *testing.T) { + resourceName := "azurerm_api_management_policy.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMApiManagementPolicy_findReplace(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementPolicyExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "xml_content", ""), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMApiManagementPolicy_update(t *testing.T) { + resourceName := "azurerm_api_management_policy.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMApiManagementPolicy_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementPolicyExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "xml_content", ""), + ), + }, + { + Config: testAccAzureRMApiManagementPolicy_findReplace(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementPolicyExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "xml_content", ""), + ), + }, + { + Config: testAccAzureRMApiManagementPolicy_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementPolicyExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "xml_content", ""), + ), + }, + }, + }) +} + func testCheckAzureRMApiManagementPolicyExists(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -72,3 +159,59 @@ func testCheckAzureRMApiManagementPolicyDestroy(s *terraform.State) error { return nil } + +func testAccAzureRMApiManagementPolicy_basic(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_api_management" "test" { + name = "acctestAM-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + location = "${azurerm_resource_group.test.location}" + publisher_name = "pub1" + publisher_email = "pub1@email.com" + + sku = { + name = "Developer" + capacity = 1 + } +} + +resource "azurerm_api_management_policy" "test" { + resource_group_name = "${azurerm_resource_group.test.name}" + api_management_name = "${azurerm_api_management.test.name}" + xml_content = "" +} +`, rInt, location, rInt) +} + +func testAccAzureRMApiManagementPolicy_findReplace(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_api_management" "test" { + name = "acctestAM-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + location = "${azurerm_resource_group.test.location}" + publisher_name = "pub1" + publisher_email = "pub1@email.com" + + sku = { + name = "Developer" + capacity = 1 + } +} + +resource "azurerm_api_management_policy" "test" { + resource_group_name = "${azurerm_resource_group.test.name}" + api_management_name = "${azurerm_api_management.test.name}" + xml_content = "" +} +`, rInt, location, rInt) +} diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown index 48cec65ca71d..0580a2a56b42 100644 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -48,7 +48,7 @@ resource "azurerm_api_management" "example" { resource "azurerm_api_management_policy" "example" { resource_group_name = "${azurerm_resource_group.example.name}" api_management_name = "${azurerm_api_management.example.name}" - xml_content = "" + xml_content = "" } ``` diff --git a/products/azapimngpolicy/examples/terraform/basic.yaml b/products/azapimngpolicy/examples/terraform/basic.yaml index 665865c22b2e..9a7e0a929b89 100644 --- a/products/azapimngpolicy/examples/terraform/basic.yaml +++ b/products/azapimngpolicy/examples/terraform/basic.yaml @@ -10,4 +10,4 @@ prerequisites: properties: resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} api_management_name: ${azurerm_api_management.<%= resource_id_hint -%>.name} - xml_content: \ No newline at end of file + xml_content: \ No newline at end of file diff --git a/products/azapimngpolicy/examples/terraform/findReplace.yaml b/products/azapimngpolicy/examples/terraform/findReplace.yaml new file mode 100644 index 000000000000..0f3cdeac25e2 --- /dev/null +++ b/products/azapimngpolicy/examples/terraform/findReplace.yaml @@ -0,0 +1,13 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_api_management_policy +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azapimanagement + example: basic +properties: + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + api_management_name: ${azurerm_api_management.<%= resource_id_hint -%>.name} + xml_content: \ No newline at end of file diff --git a/products/azapimngpolicy/terraform.yaml b/products/azapimngpolicy/terraform.yaml index 25e3adb4d8b5..497c78b24cf0 100644 --- a/products/azapimngpolicy/terraform.yaml +++ b/products/azapimngpolicy/terraform.yaml @@ -21,10 +21,20 @@ overrides: !ruby/object:Provider::ResourceOverrides conflicts_with: [xml_content] custom_schema_set: templates/terraform/schemas/empty.erb custom_sdkfield_assign: templates/terraform/schemas/empty.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: findReplace + steps: [findReplace] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: update + steps: [basic, findReplace, basic] document_examples: - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference title: Example Usage - example_name: basic + example_name: findReplace resource_name_hints: resourceGroupName: example-rg apiManagementName: example-apim From e27e9c0c3bd28131d40696ca1c9092f426f2dd54 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 29 Mar 2019 11:30:21 -0700 Subject: [PATCH 045/175] Fix ERB trim warnings. --- compile/core.rb | 6 +++--- templates/terraform/resource.html.markdown.erb | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/compile/core.rb b/compile/core.rb index 383472f00a81..655666263160 100644 --- a/compile/core.rb +++ b/compile/core.rb @@ -143,7 +143,7 @@ def compile(file, caller_frame = 1) content = ctx.local_variable_get(:_erbout) if has_erbout # save code ctx.local_variable_set(:compiler, compiler) Google::LOGGER.debug "Compiling #{file}" - input = ERB.new get_helper_file(file), nil, '-%>' + input = ERB.new get_helper_file(file), nil, '->' compiled = input.result(ctx) ctx.local_variable_set(:_erbout, content) if has_erbout # restore code compiled @@ -243,9 +243,9 @@ def lines_before(code, number = 0) # The key-value pair may be a Hash or a Binding def compile_string(ctx, source) if ctx.is_a? Binding - ERB.new(source, nil, '-%>').result(ctx).split("\n") + ERB.new(source, nil, '->').result(ctx).split("\n") elsif ctx.is_a? Hash - ERB.new(source, nil, '-%>').result( + ERB.new(source, nil, '->').result( OpenStruct.new(ctx).instance_eval { binding.of_caller(1) } ).split("\n") else diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 5380463bca09..9bdac0bd31e9 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -90,7 +90,6 @@ To get more information about <%= object.name -%>, see: ```hcl -<% print product_ns -%> <%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name, example_ref.resource_name_hints, true)) -%> ``` From 4e095e7ea893b62f943b498b3478967075125925 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 29 Mar 2019 17:49:03 -0700 Subject: [PATCH 046/175] Implement CRUD operations for Ansible. --- api/azure/sdk_operation_definition.rb | 2 + api/azure/sdk_type_definition.rb | 2 + ...ure_rm_servicebusdisasterrecoveryconfig.py | 255 ++++------ products/azservicebusrecovery/api.yaml | 37 +- provider/ansible.rb | 4 + provider/azure/ansible.rb | 11 + provider/azure/ansible/sdk/sub_template.rb | 14 + provider/azure/ansible/sub_template.rb | 13 + provider/azure/terraform.rb | 10 - provider/azure/terraform/helpers.rb | 10 + templates/ansible/resource.erb | 475 ++++-------------- .../azure/ansible/sdk/method_invocation.erb | 3 + 12 files changed, 275 insertions(+), 561 deletions(-) create mode 100644 provider/azure/ansible.rb create mode 100644 provider/azure/ansible/sdk/sub_template.rb create mode 100644 provider/azure/ansible/sub_template.rb create mode 100644 templates/azure/ansible/sdk/method_invocation.erb diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb index e0053aa164f9..51f3bcc8a4f6 100644 --- a/api/azure/sdk_operation_definition.rb +++ b/api/azure/sdk_operation_definition.rb @@ -5,6 +5,7 @@ module Api module Azure class SDKOperationDefinition < Api::Object attr_reader :go_func_name + attr_reader :python_func_name attr_reader :async attr_reader :request attr_reader :response @@ -12,6 +13,7 @@ class SDKOperationDefinition < Api::Object def validate super check_property :go_func_name, String + check_property :python_func_name, String check_optional_property :async, :boolean check_property :request, Hash check_property_hash :request, String, Api::Azure::SDKTypeDefinition diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 0043e814dd31..a0f5bc23c33b 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -6,12 +6,14 @@ class SDKTypeDefinition < Api::Object attr_reader :id_portion attr_reader :go_variable_name attr_reader :go_field_name + attr_reader :python_variable_name def validate super check_optional_property :id_portion check_optional_property :go_variable_name check_optional_property :go_field_name + check_optional_property :python_variable_name end class BooleanObject < SDKTypeDefinition diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py index 921b20201c76..5b41080d3937 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py @@ -1,6 +1,7 @@ #!/usr/bin/python # -# Copyright (C) 2019 Zim Kalinowski (@zikalino)# +# Copyright (C) 2019 Zim Kalinowski (@zikalino) +# # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # ---------------------------------------------------------------------------- @@ -118,179 +119,121 @@ def __init__(self): self.module_arg_spec = dict( # TODO: Finish type declaration ) - # TODO: Required If # TODO: Argument Properties - # TODO: Module State - # TODO: Base Class Initialization - - # TODO: Main Module Execution - # TODO: Parameters -> Class Properties - # TODO: Parameters -> SDK - # TODO: Create Client Instance - # TODO: Response & Idempotency Check - # TODO: Perform Desired Action - # TODO: Format Response - - # TODO: Create/Update Function - - # TODO: Delete Function - - # TODO: Read Function - -''' - - module = GcpModule( - argument_spec=dict( - state=dict(default='present', choices=['present', 'absent'], type='str'), - name=dict(required=True, type='str'), - resource_group_name=dict(required=True, type='str'), - namespace_name=dict(required=True, type='str'), - partner_namespace=dict(type='str'), - alternate_name=dict(type='str') - ) - ) - - if not module.params['scopes']: - module.params['scopes'] = ['NotUsedInAzure'] - - state = module.params['state'] - - fetch = fetch_resource(module, self_link(module)) - changed = False - - if fetch: - if state == 'present': - if is_different(module, fetch): - update(module, self_link(module)) - fetch = fetch_resource(module, self_link(module)) - changed = True - else: - delete(module, self_link(module)) - fetch = {} - changed = True - else: - if state == 'present': - fetch = create(module, collection(module)) - changed = True - else: - fetch = {} - - fetch.update({'changed': changed}) - - module.exit_json(**fetch) - -def create(module, link): - auth = GcpSession(module, 'zservicebusrecovery') - return return_if_object(module, auth.post(link, resource_to_request(module))) + self.results = dict(changed=False) + self.mgmt_client = None + self.state = None + self.to_do = Actions.NoAction + required_if = [ + # TODO: Required If + ('state', 'present', []) + ] -def update(module, link): - auth = GcpSession(module, 'zservicebusrecovery') - return return_if_object(module, auth.put(link, resource_to_request(module))) + super(AzureRMServiceBusDisasterRecoveryConfig, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=True, + supports_tags=True, + required_if=required_if) + def exec_module(self, **kwargs): + """Main module execution method""" + # TODO: Parameters -> Class Properties + # TODO: Parameters -> SDK -def delete(module, link): - auth = GcpSession(module, 'zservicebusrecovery') - return return_if_object(module, auth.delete(link)) - - -def resource_to_request(module): - request = { - u'name': module.params.get('name'), - u'resourceGroupName': module.params.get('resource_group_name'), - u'namespaceName': module.params.get('namespace_name'), - u'partnerNamespace': module.params.get('partner_namespace'), - u'AlternateName': module.params.get('alternate_name') - } - request = encode_request(request, module) - return_vals = {} - for k, v in request.items(): - if v: - return_vals[k] = v - - return return_vals - - -def fetch_resource(module, link, allow_not_found=True): - auth = GcpSession(module, 'zservicebusrecovery') - return return_if_object(module, auth.get(link), allow_not_found) - - -def self_link(module): - return "NotUsedInAzureNotUsedInAzure/{name}".format(**module.params) - - -def collection(module): - return "NotUsedInAzureNotUsedInAzure".format(**module.params) - - -def return_if_object(module, response, allow_not_found=False): - # If not found, return nothing. - if allow_not_found and response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - - result = decode_request(result, module) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result + response = None + self.mgmt_client = self.get_mgmt_svc_client(ServiceBusManagementClient, + base_url=self._cloud_environment.endpoints.resource_manager) -def is_different(module, response): - request = resource_to_request(module) - response = response_to_hash(module, response) - request = decode_request(request, module) + old_response = self.get_servicebusdisasterrecoveryconfig() - # Remove all output-only from response. - response_vals = {} - for k, v in response.items(): - if k in request: - response_vals[k] = v + # TODO: Idempotency Check - request_vals = {} - for k, v in request.items(): - if k in response: - request_vals[k] = v + if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): + self.log("Need to Create / Update the Service Bus Disaster Recovery Config instance") - return GcpRequest(request_vals) != GcpRequest(response_vals) + self.results['changed'] = True + if self.check_mode: + return self.results + response = self.create_update_servicebusdisasterrecoveryconfig() -# Remove unnecessary properties from the response. -# This is for doing comparisons with Ansible's current parameters. -def response_to_hash(module, response): - return { - u'name': module.params.get('name'), - u'resourceGroupName': module.params.get('resource_group_name'), - u'namespaceName': module.params.get('namespace_name'), - u'partnerNamespace': response.get(u'partnerNamespace'), - u'AlternateName': response.get(u'AlternateName') - } + self.log("Creation / Update done") + elif self.to_do == Actions.Delete: + self.log("Service Bus Disaster Recovery Config instance deleted") + self.results['changed'] = True + if self.check_mode: + return self.results -def decode_request(response, module): - if 'name' in response: - response['name'] = response['name'].split('/')[-1] - return response + self.delete_servicebusdisasterrecoveryconfig() + else: + self.log("Service Bus Disaster Recovery Config instance unchanged") + self.results['changed'] = False + response = old_response + # TODO: Format Response -def encode_request(request, module): - request['name'] = '/'.join(['projects', module.params['project'], - 'topics', module.params['name']]) - return request + def create_update_servicebusdisasterrecoveryconfig(self): + ''' + Creates or updates Service Bus Disaster Recovery Config with the specified configuration. + + :return: deserialized Service Bus Disaster Recovery Config instance state dictionary + ''' + self.log("Creating / Updating the Service Bus Disaster Recovery Config instance {0}".format(self.name)) + try: + response = self.mgmt_client.disaster_recovery_configs.create_or_update(resource_group_name=self.resource_group, + namespace_name=self.namespace, + alias=self.name, + parameters=self.parameters) + if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): + response = self.get_poller_result(response) + except CloudError as exc: + self.log('Error attempting to create the Service Bus Disaster Recovery Config instance.') + self.fail("Error creating the Service Bus Disaster Recovery Config instance: {0}".format(str(exc))) + return response.as_dict() + + + def delete_servicebusdisasterrecoveryconfig(self): + ''' + Deletes specified Service Bus Disaster Recovery Config instance in the specified subscription and resource group. + + :return: True + ''' + self.log("Deleting the Service Bus Disaster Recovery Config instance {0}".format(self.name)) + try: + response = self.mgmt_client.disaster_recovery_configs.delete(resource_group_name=self.resource_group, + namespace_name=self.namespace, + alias=self.name) + except CloudError as e: + self.log('Error attempting to delete the Service Bus Disaster Recovery Config instance.') + self.fail("Error deleting the Service Bus Disaster Recovery Config instance: {0}".format(str(e))) + + if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): + response = self.get_poller_result(response) + return True + + def get_servicebusdisasterrecoveryconfig(self): + ''' + Gets the properties of the specified Service Bus Disaster Recovery Config + :return: deserialized Service Bus Disaster Recovery Config instance state dictionary + ''' + self.log("Checking if the Service Bus Disaster Recovery Config instance {0} is present".format(self.name)) + found = false + try: + response = self.mgmt_client.disaster_recovery_configs.get(resource_group_name=self.resource_group, + namespace_name=self.namespace, + alias=self.name) + found = True + self.log("Response : {0}".format(response)) + self.log("Service Bus Disaster Recovery Config instance : {0} found".format(response.name)) + except CloudError as e: + self.log('Did not find the Service Bus Disaster Recovery Config instance.') + if found is True: + return response.as_dict() + return False -''' def main(): """Main execution""" diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index b893cc088334..ed0e16589717 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -18,22 +18,27 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: servicebus python_client_namespace: azure.mgmt.servicebus - python_client: ServiceBusManagementClient + python_client: ServiceBusManagementClient.disaster_recovery_configs create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate + python_func_name: create_or_update request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup + python_variable_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName + python_variable_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name + python_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: ArmDisasterRecovery + python_variable_name: parameters '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: ArmDisasterRecoveryProperties go_type_name: ArmDisasterRecoveryProperties @@ -43,16 +48,20 @@ objects: go_field_name: PartnerNamespace read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get + python_func_name: get request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup + python_variable_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName + python_variable_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name + python_variable_name: name response: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_variable_name: resourceGroup @@ -70,40 +79,22 @@ objects: go_field_name: AlternateName '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject go_field_name: PartnerNamespace - update: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: namespaces - go_variable_name: servicebusName - 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: disasterRecoveryConfigs - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: ArmDisasterRecovery - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: ArmDisasterRecoveryProperties - go_type_name: ArmDisasterRecoveryProperties - '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: AlternateName - '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: PartnerNamespace delete: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Delete + python_func_name: delete request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup + python_variable_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName + python_variable_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name + python_variable_name: name description: | Manages a service bus disaster recovery config on Azure. diff --git a/provider/ansible.rb b/provider/ansible.rb index 3c16c0657be0..90c8c9a60de5 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -25,6 +25,8 @@ require 'provider/ansible/property_override' require 'provider/ansible/facts_override' +require 'provider/azure/ansible' + module Provider module Ansible # Code generator for Ansible Cookbooks that manage Google Cloud Platform @@ -44,6 +46,8 @@ class Core < Provider::Core include Provider::Ansible::Module include Provider::Ansible::Request + include Provider::Azure::Ansible + def initialize(config, api) super(config, api) @max_columns = 160 diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb new file mode 100644 index 000000000000..32d0a612e7a0 --- /dev/null +++ b/provider/azure/ansible.rb @@ -0,0 +1,11 @@ +require 'provider/azure/ansible/sub_template' +require 'provider/azure/ansible/sdk/sub_template' + +module Provider + module Azure + module Ansible + include Provider::Azure::Ansible::SubTemplate + include Provider::Azure::Ansible::SDK::SubTemplate + end + end +end \ No newline at end of file diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb new file mode 100644 index 000000000000..0880c49a117f --- /dev/null +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -0,0 +1,14 @@ +module Provider + module Azure + module Ansible + module SDK + module SubTemplate + def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) + result = compile 'templates/azure/ansible/sdk/method_invocation.erb', 1 + indent result, indentation + end + end + end + end + end +end \ No newline at end of file diff --git a/provider/azure/ansible/sub_template.rb b/provider/azure/ansible/sub_template.rb new file mode 100644 index 000000000000..8585c03c106c --- /dev/null +++ b/provider/azure/ansible/sub_template.rb @@ -0,0 +1,13 @@ +module Provider + module Azure + module Ansible + module SubTemplate + def build_multiline_method_call(call_prefix, args, call_postfix, indentation = 0) + multiline_args = args.join(",\n#{' ' * call_prefix.length}") + result = "#{call_prefix}#{multiline_args}#{call_postfix}" + indent result, indentation + end + end + end + end +end \ No newline at end of file diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 45b503aaf495..7bc255eb7e12 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -22,16 +22,6 @@ module Terraform include Provider::Azure::Terraform::Example::SubTemplate include Provider::Azure::Terraform::Example::Helpers include Provider::Azure::Terraform::AccTest::SubTemplate - - def azure_resource_go_package(product) - product.azure_namespace.split('.').last.downcase - end - - def order_azure_properties(properties) - special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} - other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} - special_props + order_properties(other_props) - end end end end \ No newline at end of file diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index 4778aed98fc1..f76f015335db 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -6,6 +6,16 @@ def get_property_value(obj, prop_name, default_value) return default_value unless obj.instance_variable_defined?("@#{prop_name}") obj.instance_variable_get("@#{prop_name}") end + + def azure_resource_go_package(product) + product.azure_namespace.split('.').last.downcase + end + + def order_azure_properties(properties) + special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} + other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} + special_props + order_properties(other_props) + end end end end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 5d013f274261..d9639118f6f2 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -1,6 +1,7 @@ #!/usr/bin/python # # Copyright (C) 2019 <%= @config.manifest.get('author', object) -%> + # # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) @@ -15,6 +16,11 @@ __metaclass__ = type supported_by = quote_string(@config.manifest.get('supported_by', object)) update_props = properties_by_custom_update(object.all_user_properties) -%> +<% + combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.python_func_name == object.azure_sdk_definition.update.python_func_name) + python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] + python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] +-%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, 'supported_by': <%= supported_by -%>} @@ -91,7 +97,7 @@ try: from msrest.polling import LROPoller from msrestazure.azure_operation import AzureOperationPoller from msrest.serialization import Model - from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= object.azure_sdk_definition.python_client -%> + from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= python_sdk_client -%> except ImportError: # This is handled in azure_rm_common @@ -108,395 +114,120 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.module_arg_spec = dict( # TODO: Finish type declaration ) - # TODO: Required If # TODO: Argument Properties - # TODO: Module State - # TODO: Base Class Initialization - - # TODO: Main Module Execution - # TODO: Parameters -> Class Properties - # TODO: Parameters -> SDK - # TODO: Create Client Instance - # TODO: Response & Idempotency Check - # TODO: Perform Desired Action - # TODO: Format Response - - # TODO: Create/Update Function - - # TODO: Delete Function - - # TODO: Read Function - -''' -<% - mod_props = object.all_user_properties.reject(&:output).map do |prop| - python_dict_for_property(prop, object) - end --%> - module = GcpModule( - argument_spec=dict( - state=dict(default='present', choices=['present', 'absent'], type='str'), -<%= lines(indent_list(mod_props, 12)) -%> - ) - ) + self.results = dict(changed=False) + self.mgmt_client = None + self.state = None + self.to_do = Actions.NoAction - if not module.params['scopes']: - module.params['scopes'] = <%= python_literal(object.__product.scopes) %> + required_if = [ + # TODO: Required If + ('state', 'present', []) + ] - state = module.params['state'] -<% if object.kind? -%> - kind = <%= lines(quote_string(object.kind)) -%> -<% end -%> - -<% if object.self_link_query.nil? -%> -<% - method = method_call('fetch_resource', ['module', 'self_link(module)', - ('kind' if object.kind?), - ]) --%> - fetch = <%= method %> -<% else # object.self_link_query.nil? -%> - fetch = fetch_wrapped_resource(module, '<%= object.kind -%>', - '<%= object.self_link_query.kind -%>', - '<%= object.self_link_query.items -%>') -<% end # object.self_link_query.nil? -%> - changed = False -<% if object.readonly -%> - if not fetch: - module.fail_json(msg="<%= object.name -%> is not valid") -<% else # object.readonly -%> - - if fetch: - if state == 'present': - if is_different(module, fetch): -<% - method = method_call('update', [ - 'module', 'self_link(module)', - ('kind' if object.kind?), - ('fetch' if object.access_api_results || !update_props.empty?) - ]) --%> -<%= lines(indent("#{method}", 16)) -%> -<% - method = method_call('fetch_resource', ['module', 'self_link(module)', - ('kind' if object.kind?), - ]) --%> - fetch = <%= method %> - changed = True - else: -<% - if object.delete_url.nil? - delete_url = 'self_link(module)' - else - delete_url = 'delete_link(module)' - end - method = method_call('delete', [ - 'module', delete_url, - ('kind' if object.kind?), - ('fetch' if object.access_api_results) - ]) --%> -<%= lines(indent(method, 12)) -%> - fetch = {} - changed = True - else: - if state == 'present': -<% - if !object.create_url.nil? - create_link = 'create_link(module)' - elsif object.create_verb.nil? || object.create_verb == :POST - create_link = 'collection(module)' - elsif object.create_verb == :PUT - create_link = 'self_link(module)' - end - - create_verb = ".#{object.create_verb.to_s.downcase}" - method = method_call('create', ['module', create_link, - ('kind' if object.kind?)]) --%> - fetch = <%= method %> -<% if object.post_create -%> -<%= lines(indent(object.post_create, 12)) -%> -<% end # ifobject.post_create -%> - changed = True - else: - fetch = {} - -<% if object.post_action -%> -<%= lines(indent(object.post_action, 4)) -%> -<% end # ifobject.post_create -%> - fetch.update({'changed': changed}) -<% end # object.readonly -%> - - module.exit_json(**fetch) - - -<% prod_name = object.__product.prefix[1..-1] -%> -<% unless object.readonly -%> -<%# TODO: kind param not always needed. - # https://github.com/GoogleCloudPlatform/magic-modules/issues/45 --%> -<%= method_decl('create', ['module', 'link', ('kind' if object.kind?)]) %> -<% if object.create.nil? -%> - auth = GcpSession(module, <%= quote_string(prod_name) -%>) -<% - create_request = if object.custom_create_resource - 'resource_to_create' - else - 'resource_to_request' - end --%> -<% - method = method_call( - object.async ? 'wait_for_operation' : 'return_if_object', - ['module', - method_call("auth#{create_verb}", - ['link', "#{create_request}(module)"]), - ('kind' if !object.async && object.kind?) - ] - ) --%> - return <%= method %> -<% else -%> -<%= lines(indent(object.create, 4)) -%> -<% end -%> - - -<%= - lines(method_decl('update', ['module', 'link', ('kind' if object.kind?), - ('fetch' if object.access_api_results || !update_props.empty?)])) --%> -<% - update_request = if object.custom_update_resource - 'resource_to_update' - else - 'resource_to_request' - end --%> -<% if object.update.nil? -%> -<% unless update_props.empty? -%> - update_fields(module, resource_to_request(module), - response_to_hash(module, fetch)) -<% end -%> -<% if object.input && update_props.empty? -%> - module.fail_json(msg="<%= object.name -%> cannot be edited") -<% elsif !object.input -%> - auth = GcpSession(module, <%= quote_string(prod_name) -%>) -<% - update_verb = object.update_verb.to_s.downcase - method = method_call( - object.async ? 'wait_for_operation' : 'return_if_object', - [ - 'module', - method_call("auth.#{update_verb}", - ['link', "#{update_request}(module)"]), - ('kind' if !object.async && object.kind?) - ] - ) --%> - return <%= method %> -<% else # non-updatable, but has per-field updates -%> -<% - method = method_call('fetch_resource', ['module', 'self_link(module)', - ('kind' if object.kind?), - ]) --%> - return <%= method %> -<% end # if object.input -%> -<% else # object.update.nil? -%> -<%= lines(indent(object.update, 4)) -%> -<% end # object.update.nil? -%> - - -<% unless update_props.empty? -%> -def update_fields(module, request, response): -<% empty = update_props.values.flatten.reject { |p| p.is_a? Api::Type::FetchedExternal }.empty? -%> -<% if empty -%> - pass -<% else -%> -<% update_props.each do |key, props| -%> -<% - props_statement = props.reject { |p| p.is_a?(Api::Type::FetchedExternal) } - .map { |prop| "response.get(#{quote_string(prop.api_name)}) != request.get(#{quote_string(prop.api_name)})" }.join(' or ') --%> -<% unless props_statement.empty? -%> - if <%= props_statement -%>: - <%= props.first.name.underscore -%>_update(module, request, response) -<% end # unless props_statement.empty? -%> -<% end # update_props.each -%> -<% end # if empty -%> - - -<% update_props.each do |key, props| -%> -def <%= props.first.name.underscore -%>_update(module, request, response): - auth = GcpSession(module, <%= quote_string(prod_name) -%>) - auth.<%= key[:update_verb].downcase -%>( - ''.join([ - "<%= object.__product.base_url -%>", - "<%= key[:update_url].gsub('{{', '{').gsub('}}', '}') -%>" - ]).format(**module.params), - { -<%= lines(request_properties(props, 12)) -%> - } - ) - - -<% end -%> -<% end # unless update_props.empty? -%> -<%= - lines(method_decl('delete', ['module', 'link', ('kind' if object.kind?), - ('fetch' if object.access_api_results)])) --%> -<% if object.delete.nil? -%> - auth = GcpSession(module, <%= quote_string(prod_name) -%>) -<% - delete_verb = object.delete_verb.to_s.downcase - - method = method_call( - object.async ? 'wait_for_operation' : 'return_if_object', - ['module', - method_call("auth.#{delete_verb}", ['link']), - ('kind' if !object.async && object.kind?) - ] - ) --%> - return <%= method %> -<% else # if object.delete.nil? -%> -<%= lines(indent(object.delete, 4)) -%> -<% end # if object.delete.nil? -%> +<%= lines(build_multiline_method_call("super(AzureRM#{object.name}, self).__init__(", [ + "derived_arg_spec=self.module_arg_spec", "supports_check_mode=True", "supports_tags=True", "required_if=required_if" + ], ")", 8)) -%> + def exec_module(self, **kwargs): + """Main module execution method""" + # TODO: Parameters -> Class Properties + # TODO: Parameters -> SDK -<% end # unless object.readonly -%> -def resource_to_request(module): -<% - properties_in_request = [ - object&.parameters&.select { |p| p.input }, - object.properties.reject(&:output) - ].flatten.compact --%> - request = { -<% if object.kind? -%> - u'kind': <%= quote_string(object.kind) -%>, -<% end # if object.kind? -%> -<%= lines(indent(request_properties(properties_in_request, 4), 4)) -%> - } -<% if object.encoder? -%> - request = <%= object.transport.encoder -%>(request, module) -<% end -%> - return_vals = {} - for k, v in request.items(): - if v: - return_vals[k] = v + response = None - return return_vals -<% unless false?(object.unwrap_resource) -%> -<% - urf_code = [ - 'return {', - indent_list( - Hash[object.identity.map { |i| [i, "module.params[#{quote_string(i.out_name)}]"] }] - .map { |k, v| "#{quote_string(k.out_name)}: #{v}" }, 4 - ), - '}' - ] --%> -<%= - lines_before(lines(emit_method('unwrap_resource_filter', %w[module], - urf_code, file_relative), 1), 1) --%> + self.mgmt_client = self.get_mgmt_svc_client(<%= python_sdk_client -%>, + base_url=self._cloud_environment.endpoints.resource_manager) -def unwrap_resource(result, module): - query_predicate = unwrap_resource_filter(module) - matched_items = [] - for item in result: - if all(item[k] == query_predicate[k] for k in query_predicate.keys()): - matched_items.append(item) - if len(matched_items) > 1: - module.fail_json(msg="More than 1 result found: %s" % matched_items) - - if matched_items: - return matched_items[0] - else: - return None -<% end -%> + old_response = self.get_<%= object.name.downcase -%>() + # TODO: Idempotency Check -<%= lines(compile('templates/ansible/transport.erb'), 2) -%> -<%= lines(emit_link('self_link', build_url(object.self_link_url), object), 2) -%> -<%= lines(emit_link('collection', build_url(object.collection_url), object), 2) -%> -<%- unless object.create_url.nil? -%> -<%=lines(emit_link('create_link', build_url(object.full_create_url), object), 2)-%> -<% end -%> -<% unless object.delete_url.nil? -%> -<%= lines(emit_link('delete_link', build_url(object.full_delete_url), object), 2) -%> -<% end -%> -<%= - lines(method_decl('return_if_object', ['module', 'response', - ('kind' if object.kind?), - 'allow_not_found=False'])) --%> -<% if object.return_if_object -%> -<%= lines(indent(object.return_if_object, 4)) -%> -<% else # if object.return_if_object -%> - # If not found, return nothing. - if allow_not_found and response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - -<% if object.decoder? -%> - result = <%= object.transport.decoder -%>(result, module) - -<% end -%> - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result -<% end # if object.return_if_object -%> + if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): + self.log("Need to Create<%= " / Update" if combine_create_update -%> the <%= object.name.titlecase -%> instance") + self.results['changed'] = True + if self.check_mode: + return self.results -def is_different(module, response): - request = resource_to_request(module) - response = response_to_hash(module, response) -<% if object.decoder? -%> - request = <%= object.transport.decoder -%>(request, module) -<% end -%> + response = self.<%= combine_create_update ? "create_update" : "create" -%>_<%= object.name.downcase -%>() - # Remove all output-only from response. - response_vals = {} - for k, v in response.items(): - if k in request: - response_vals[k] = v + self.log("Creation<%= " / Update" if combine_create_update -%> done") + elif self.to_do == Actions.Delete: + self.log("<%= object.name.titlecase -%> instance deleted") + self.results['changed'] = True - request_vals = {} - for k, v in request.items(): - if k in response: - request_vals[k] = v + if self.check_mode: + return self.results - return GcpRequest(request_vals) != GcpRequest(response_vals) + self.delete_<%= object.name.downcase -%>() + else: + self.log("<%= object.name.titlecase -%> instance unchanged") + self.results['changed'] = False + response = old_response + # TODO: Format Response -# Remove unnecessary properties from the response. -# This is for doing comparisons with Ansible's current parameters. -def response_to_hash(module, response): - return { -<%= lines(response_properties(object.properties, 8)) -%> - } -<%= lines_before(compile('templates/ansible/async.erb'), 1) -%> -<%= lines_before(compile('templates/ansible/provider_helpers.erb'), 1) -%> -<%= lines_before(compile('templates/ansible/properties.erb'), 1) -%> +<% sdk_operation = object.azure_sdk_definition.create -%> + def <%= combine_create_update ? "create_update" : "create" -%>_<%= object.name.downcase -%>(self): + ''' + Creates<%= " or updates" if combine_create_update -%> <%= object.name.titlecase -%> with the specified configuration. + + :return: deserialized <%= object.name.titlecase -%> instance state dictionary + ''' + self.log("Creating<%= " / Updating" if combine_create_update -%> the <%= object.name.titlecase -%> instance {0}".format(self.name)) + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): + response = self.get_poller_result(response) + except CloudError as exc: + self.log('Error attempting to create the <%= object.name.titlecase -%> instance.') + self.fail("Error creating the <%= object.name.titlecase -%> instance: {0}".format(str(exc))) + return response.as_dict() + +<% if !combine_create_update -%> + # TODO: Update Function Not Implemented +<% end -%> + +<% sdk_operation = object.azure_sdk_definition.delete -%> + def delete_<%= object.name.downcase -%>(self): + ''' + Deletes specified <%= object.name.titlecase -%> instance in the specified subscription and resource group. + + :return: True + ''' + self.log("Deleting the <%= object.name.titlecase -%> instance {0}".format(self.name)) + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + except CloudError as e: + self.log('Error attempting to delete the <%= object.name.titlecase -%> instance.') + self.fail("Error deleting the <%= object.name.titlecase -%> instance: {0}".format(str(e))) + + if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): + response = self.get_poller_result(response) + return True + +<% sdk_operation = object.azure_sdk_definition.read -%> + def get_<%= object.name.downcase -%>(self): + ''' + Gets the properties of the specified <%= object.name.titlecase -%> + + :return: deserialized <%= object.name.titlecase -%> instance state dictionary + ''' + self.log("Checking if the <%= object.name.titlecase -%> instance {0} is present".format(self.name)) + found = false + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + found = True + self.log("Response : {0}".format(response)) + self.log("<%= object.name.titlecase -%> instance : {0} found".format(response.name)) + except CloudError as e: + self.log('Did not find the <%= object.name.titlecase -%> instance.') + if found is True: + return response.as_dict() + return False -''' def main(): """Main execution""" diff --git a/templates/azure/ansible/sdk/method_invocation.erb b/templates/azure/ansible/sdk/method_invocation.erb new file mode 100644 index 000000000000..e64758072e70 --- /dev/null +++ b/templates/azure/ansible/sdk/method_invocation.erb @@ -0,0 +1,3 @@ +<% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> +<% param_assignments = params.map{|k, v| "#{k == '/' ? 'parameters' : k.underscore}=self.#{v.python_variable_name}"} -%> +<%= lines(build_multiline_method_call("response = self.mgmt_client.#{sdk_client}.#{sdk_op_def.python_func_name}(", param_assignments, ")")) -%> \ No newline at end of file From 676aadd5456f74d873277fe37ca75f1cc9a1dfd7 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 3 Apr 2019 11:42:31 -0700 Subject: [PATCH 047/175] Azure SDK definition overrides kick-off --- api/azure/sdk_definition_override.rb | 21 +++++++++++++++++++ .../sdk_operation_definition_override.rb | 19 +++++++++++++++++ api/azure/sdk_type_definition_override.rb | 20 ++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 api/azure/sdk_definition_override.rb create mode 100644 api/azure/sdk_operation_definition_override.rb create mode 100644 api/azure/sdk_type_definition_override.rb diff --git a/api/azure/sdk_definition_override.rb b/api/azure/sdk_definition_override.rb new file mode 100644 index 000000000000..014eabc70b3a --- /dev/null +++ b/api/azure/sdk_definition_override.rb @@ -0,0 +1,21 @@ +require 'api/object' +require 'api/azure/sdk_operation_definition_override' + +module Api + module Azure + module SDKDefinitionOverride < Api::Object + attr_reader :create + attr_reader :read + attr_reader :update + attr_reader :delete + + def validate + super + check_optional_property :create, Api::Azure::SDKOperationDefinitionOverride + check_optional_property :read, Api::Azure::SDKOperationDefinitionOverride + check_optional_property :update, Api::Azure::SDKOperationDefinitionOverride + check_optional_property :delete, Api::Azure::SDKOperationDefinitionOverride + end + end + end +end \ No newline at end of file diff --git a/api/azure/sdk_operation_definition_override.rb b/api/azure/sdk_operation_definition_override.rb new file mode 100644 index 000000000000..94bdd2106d41 --- /dev/null +++ b/api/azure/sdk_operation_definition_override.rb @@ -0,0 +1,19 @@ +require 'api/object' +require 'api/azure/sdk_type_definition_override' + +module Api + module Azure + class SDKOperationDefinitionOverride < Api::Object + attr_reader :request + attr_reader :response + + def validate + super + check_property :request, Hash + check_property_hash :request, String, Api::Azure::SDKTypeDefinitionOverride + check_optional_property :response, Hash + check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinitionOverride + end + end + end +end \ No newline at end of file diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb new file mode 100644 index 000000000000..e2397223c77f --- /dev/null +++ b/api/azure/sdk_type_definition_override.rb @@ -0,0 +1,20 @@ +require 'api/object' + +module Api + module Azure + class SDKTypeDefinitionOverride < Api::Object + attr_reader :id_portion + attr_reader :go_variable_name + attr_reader :go_field_name + attr_reader :python_variable_name + + def validate + super + check_optional_property :id_portion + check_optional_property :go_variable_name + check_optional_property :go_field_name + check_optional_property :python_variable_name + end + end + end +end \ No newline at end of file From 18b4eb246444474a9723073c874caff5a42aa643 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 3 Apr 2019 18:47:11 -0700 Subject: [PATCH 048/175] Introduce batch account api.yaml. --- products/azbatchaccount/api.yaml | 212 +++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 products/azbatchaccount/api.yaml diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml new file mode 100644 index 000000000000..f5812245cbcd --- /dev/null +++ b/products/azbatchaccount/api.yaml @@ -0,0 +1,212 @@ +--- !ruby/object:Api::Product +name: Azure Batch Account +prefix: azbatchaccount +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: Microsoft.Batch +azure_version: '2018-12-01' +objects: + - !ruby/object:Api::Resource + name: BatchAccount + api_name: Batch + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: batch + go_client_namespace: batch + go_client: batchAccountClient + python_client_namespace: azure.mgmt.batch + python_client: BatchManagementClient.batch_account + create: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: Create + python_func_name: create + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group + 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: batchAccounts + go_variable_name: name + python_parameter_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: AccountCreateParameters + python_parameter_name: parameters + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AccountCreateProperties + go_type_name: AccountCreateProperties + '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AutoStorage + go_type_name: AutoStorageBaseProperties + '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: StorageAccountID + '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: KeyVaultReference + go_type_name: KeyVaultReference + '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: URL + '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: PoolAllocationMode + go_enum_type_name: PoolAllocationMode + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group + 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: batchAccounts + go_variable_name: name + python_parameter_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Account + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AccountProperties + go_type_name: AccountProperties + '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: AccountEndpoint + '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AutoStorage + go_type_name: AutoStorageProperties + '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: StorageAccountID + '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: KeyVaultReference + go_type_name: KeyVaultReference + '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: URL + '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: PoolAllocationMode + go_enum_type_name: PoolAllocationMode + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + update: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Update + python_func_name: update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group + 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: batchAccounts + go_variable_name: name + python_parameter_name: name + 'tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [:python] + python_parameter_name: tags + 'autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [:python] + python_vairiable_name: auto_storage + 'autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [:python] + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [:go] + go_variable_name: parameters + go_type_name: AccountUpdateParameters + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [:go] + go_field_name: AccountUpdateProperties + go_type_name: AccountUpdateProperties + '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [:go] + go_field_name: AutoStorage + go_type_name: AutoStorageBaseProperties + '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [:go] + go_field_name: StorageAccountID + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [:go] + go_field_name: Tags + delete: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group + 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: batchAccounts + go_variable_name: name + python_parameter_name: name + + description: | + Manages a Batch Account on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: The name of the resource group in which to create the Batch Account. + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + properties: + - !ruby/object:Api::Type::String + name: name + description: The name of the Batch Account. + required: true + input: true + azure_sdk_references: ['accountName', '/name'] + - !ruby/object:Api::Azure::Type::Location + name: location + description: Specifies the supported Azure location where the resource exists. + required: true + input: true + azure_sdk_references: ['/location'] + - !ruby/object:Api::Azure::Type::Tags + name: tags + description: A mapping of tags to assign to the batch account. + azure_sdk_references: ['tags', '/tags'] + - !ruby/object:Api::Type::String + name: autoStorageAccountId + description: The ID of the Batch Account auto storage account. + azure_sdk_references: ['/properties/autoStorage/storageAccountId', 'autoStorage/storageAccountId'] + - !ruby/object:Api::Type::Enum + name: poolAllocationMode + description: The pool acclocation mode of the Batch Account. + input: true + values: + - :BatchService + - :UserSubscription + default_value: :BatchService + azure_sdk_references: ['/properties/poolAllocationMode'] + - !ruby/object:Api::Type::NestedObject + name: keyVaultReference + description: A reference to the Azure key vault associated with the Batch account. + input: true + azure_sdk_references: ['/properties/keyVaultReference'] + properties: + - !ruby/object:Api::Type::String + name: id + description: The resource ID of the Azure key vault associated with the Batch account. + required: true + input: true + azure_sdk_references: ['/properties/keyVaultReference/id'] + - !ruby/object:Api::Type::String + name: url + description: The URL of the Azure key vault associated with the Batch account. + required: true + input: true + azure_sdk_references: ['/properties/keyVaultReference/url'] From a68e53b37b9a2614e81a851a406ed3595c9f3c55 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 5 Apr 2019 19:18:38 -0700 Subject: [PATCH 049/175] Complete module argument spec and initialization. --- api/azure/sdk_definition.rb | 4 + api/azure/sdk_type_definition.rb | 9 +- api/azure/sdk_type_definition_override.rb | 4 +- .../cloud/google/azure_rm_batchaccount.py | 268 ++++++++++++++++++ google/yaml_validator.rb | 17 +- products/azbatchaccount/ansible.yaml | 11 + products/azbatchaccount/api.yaml | 18 +- products/azservicebusrecovery/api.yaml | 20 +- provider/azure/ansible/sdk/sub_template.rb | 5 + templates/ansible/resource.erb | 15 +- .../sdk/class_instance_variable_init.erb | 11 + .../azure/ansible/sdk/method_invocation.erb | 2 +- 12 files changed, 351 insertions(+), 33 deletions(-) create mode 100644 build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py create mode 100644 products/azbatchaccount/ansible.yaml create mode 100644 templates/azure/ansible/sdk/class_instance_variable_init.erb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 2801f757fd88..946432f2b0e8 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -5,6 +5,8 @@ module Api module Azure class SDKDefinition < Api::Object attr_reader :provider_name + attr_reader :go_client_namespace + attr_reader :go_client attr_reader :python_client_namespace attr_reader :python_client attr_reader :create @@ -15,6 +17,8 @@ class SDKDefinition < Api::Object def validate super check_optional_property :provider_name, String + check_optional_property :go_client_namespace, String + check_optional_property :go_client, String check_optional_property :python_client_namespace, String check_optional_property :python_client, String check_property :create, Api::Azure::SDKOperationDefinition diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index a0f5bc23c33b..2cae84df3f5a 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -4,16 +4,19 @@ module Api module Azure class SDKTypeDefinition < Api::Object attr_reader :id_portion + attr_reader :applicable_to attr_reader :go_variable_name attr_reader :go_field_name - attr_reader :python_variable_name + attr_reader :python_parameter_name def validate super check_optional_property :id_portion + check_optional_property :applicable_to, Array + check_optional_property_list_oneof :applicable_to, ['go', 'python'], String check_optional_property :go_variable_name check_optional_property :go_field_name - check_optional_property :python_variable_name + check_optional_property :python_parameter_name end class BooleanObject < SDKTypeDefinition @@ -36,7 +39,7 @@ class ComplexObject < SDKTypeDefinition def validate super - check_property :go_type_name, String + check_optional_property :go_type_name, String end end diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index e2397223c77f..a51cc856b1b1 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -6,14 +6,14 @@ class SDKTypeDefinitionOverride < Api::Object attr_reader :id_portion attr_reader :go_variable_name attr_reader :go_field_name - attr_reader :python_variable_name + attr_reader :python_parameter_name def validate super check_optional_property :id_portion check_optional_property :go_variable_name check_optional_property :go_field_name - check_optional_property :python_variable_name + check_optional_property :python_parameter_name end end end diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py new file mode 100644 index 000000000000..ebf035fac257 --- /dev/null +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -0,0 +1,268 @@ +#!/usr/bin/python +# +# Copyright (C) 2019 Zim Kalinowski (@zikalino) +# +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ["preview"], + 'supported_by': 'community'} + + +DOCUMENTATION = ''' +--- +module: azure_rm_batchaccount +version_added: "2.6" + +short_description: Manages a Batch Account on Azure. + +description: + - Create, update and delete instance of Azure Batch Account. + +options: + name: + description: + - The name of the Batch Account. + required: true + location: + description: + - Specifies the supported Azure location where the resource exists. + required: true + tags: + description: + - A mapping of tags to assign to the batch account. + required: false + auto_storage_account_id: + description: + - The ID of the Batch Account auto storage account. + required: false + pool_allocation_mode: + description: + - The pool acclocation mode of the Batch Account. + required: false + default: BatchService + choices: + - BatchService + - UserSubscription + key_vault_reference: + description: + - A reference to the Azure key vault associated with the Batch account. + required: false + suboptions: + id: + description: + - The resource ID of the Azure key vault associated with the Batch + account. + required: true + url: + description: + - The URL of the Azure key vault associated with the Batch account. + required: true + resource_group_name: + description: + - The name of the resource group in which to create the Batch Account. + required: true + state: + description: + - Assert the state of the Batch Account. + - Use 'present' to create or update a Batch Account and 'absent' to delete + it. + default: present + choices: + - present + - absent + +extends_documentation_fragment: + - azure + +author: + - "Zim Kalinowski (@zikalino)" +''' + + +RETURN = ''' +id: + description: + - The identifier of the DTL Virtual Machine resource. + returned: always + type: str +''' + +import time +from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.common.dict_transformations import _snake_to_camel + +try: + from msrestazure.azure_exceptions import CloudError + from msrest.polling import LROPoller + from msrestazure.azure_operation import AzureOperationPoller + from msrest.serialization import Model + from azure.mgmt.batch import BatchManagementClient +except ImportError: + # This is handled in azure_rm_common + pass + + +class Actions: + NoAction, Create, Update, Delete = range(4) + +class AzureRMBatchAccount(AzureRMModuleBase): + """Configuration class for an Azure RM Batch Account resource""" + + def __init__(self): + self.module_arg_spec = dict( + name=dict(required=True, type='str'), + location=dict(required=True, type='str'), + tags=dict(type='str'), + auto_storage_account_id=dict(type='str'), + pool_allocation_mode=dict(default='BatchService', type='str', choices=['BatchService', 'UserSubscription']), + key_vault_reference=dict(type='dict', options=dict( + id=dict(required=True, type='str'), + url=dict(required=True, type='str') + )), + resource_group_name=dict(required=True, type='str'), + state=dict( + type='str', + default='present', + choices=['present', 'absent'] + ) + ) + + self.resource_group = None + self.name = None + self.parameters = dict() + + self.results = dict(changed=False) + self.mgmt_client = None + self.state = None + self.to_do = Actions.NoAction + + required_if = [ + ('state', 'present', []) + ] + + super(AzureRMBatchAccount, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=True, + supports_tags=True, + required_if=required_if) + + def exec_module(self, **kwargs): + """Main module execution method""" + # TODO: Parameters -> Class Properties + # TODO: Parameters -> SDK + + response = None + + self.mgmt_client = self.get_mgmt_svc_client(BatchManagementClient, + base_url=self._cloud_environment.endpoints.resource_manager) + + old_response = self.get_batchaccount() + + # TODO: Idempotency Check + + if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): + self.log("Need to Create the Batch Account instance") + + self.results['changed'] = True + if self.check_mode: + return self.results + + response = self.create_batchaccount() + + self.log("Creation done") + elif self.to_do == Actions.Delete: + self.log("Batch Account instance deleted") + self.results['changed'] = True + + if self.check_mode: + return self.results + + self.delete_batchaccount() + else: + self.log("Batch Account instance unchanged") + self.results['changed'] = False + response = old_response + + # TODO: Format Response + + def create_batchaccount(self): + ''' + Creates Batch Account with the specified configuration. + + :return: deserialized Batch Account instance state dictionary + ''' + self.log("Creating the Batch Account instance {0}".format(self.name)) + try: + response = self.mgmt_client.batch_account.create(resource_group_name=self.resource_group, + account_name=self.name, + parameters=self.parameters) + if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): + response = self.get_poller_result(response) + except CloudError as exc: + self.log('Error attempting to create the Batch Account instance.') + self.fail("Error creating the Batch Account instance: {0}".format(str(exc))) + return response.as_dict() + + # TODO: Update Function Not Implemented + + def delete_batchaccount(self): + ''' + Deletes specified Batch Account instance in the specified subscription and resource group. + + :return: True + ''' + self.log("Deleting the Batch Account instance {0}".format(self.name)) + try: + response = self.mgmt_client.batch_account.delete(resource_group_name=self.resource_group, + account_name=self.name) + except CloudError as e: + self.log('Error attempting to delete the Batch Account instance.') + self.fail("Error deleting the Batch Account instance: {0}".format(str(e))) + + if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): + response = self.get_poller_result(response) + return True + + def get_batchaccount(self): + ''' + Gets the properties of the specified Batch Account + :return: deserialized Batch Account instance state dictionary + ''' + self.log("Checking if the Batch Account instance {0} is present".format(self.name)) + found = false + try: + response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, + account_name=self.name) + found = True + self.log("Response : {0}".format(response)) + self.log("Batch Account instance : {0} found".format(response.name)) + except CloudError as e: + self.log('Did not find the Batch Account instance.') + if found is True: + return response.as_dict() + return False + + +def main(): + """Main execution""" + AzureRMBatchAccount() + +if __name__ == '__main__': + main() diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 3e01ca1e343e..67645d66847f 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -94,6 +94,12 @@ def default_value_property(property, def_value) instance_variable_set("@#{property}", def_value) if value.nil? end + def check_property_value_oneof(property, prop_value, valid_values, type) + check_property_value property, prop_value, type + raise "Invalid #{property} #{prop_value}" \ + unless valid_values.include?(prop_value) + end + def check_extraneous_properties instance_variables.each do |variable| var_name = variable.id2name[1..-1] @@ -127,6 +133,12 @@ def check_optional_property_list(name, type = nil) check_property_list(name, type) end + def check_optional_property_list_oneof(name, valid_values, type = nil) + obj_list = instance_variable_get("@#{name}") + return if obj_list.nil? + obj_list.each { |o| check_property_value_oneof "#{name}:item", o, valid_values, type } + end + def check_property_hash(name, keyType = nil, valType = nil) obj_hash = instance_variable_get("@#{name}") if obj_hash.nil? @@ -150,10 +162,7 @@ def check_optional_property_hash(name, keyType = nil, valType = nil) # Verifies if a property is of a given type and its value are one of the # valid possibilities. def check_property_oneof(property, valid_values, type = nil) - check_property(property, type) - prop_value = instance_variable_get("@#{property}") - raise "Invalid #{property} #{prop_value}" \ - unless valid_values.include?(prop_value) + check_property_value_oneof property, instance_variable_get("@#{property}"), valid_values, type end # Similar to 'check_property_oneof' but assigns a default value if missing. diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml new file mode 100644 index 000000000000..b8da4e8accbb --- /dev/null +++ b/products/azbatchaccount/ansible.yaml @@ -0,0 +1,11 @@ +--- !ruby/object:Provider::Ansible::Config +manifest: !ruby/object:Provider::Ansible::Manifest + metadata_version: '1.1' + status: + - preview + supported_by: 'community' + requirements: + - python >= 2.6 + - requests >= 2.18.4 + version_added: '2.6' + author: Zim Kalinowski (@zikalino) diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index f5812245cbcd..036838f789a8 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -114,30 +114,30 @@ objects: go_variable_name: name python_parameter_name: name 'tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [:python] + applicable_to: [python] python_parameter_name: tags 'autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [:python] - python_vairiable_name: auto_storage + applicable_to: [python] + python_parameter_name: auto_storage 'autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [:python] + applicable_to: [python] '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [:go] + applicable_to: [go] go_variable_name: parameters go_type_name: AccountUpdateParameters '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [:go] + applicable_to: [go] go_field_name: AccountUpdateProperties go_type_name: AccountUpdateProperties '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [:go] + applicable_to: [go] go_field_name: AutoStorage go_type_name: AutoStorageBaseProperties '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [:go] + applicable_to: [go] go_field_name: StorageAccountID '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [:go] + applicable_to: [go] go_field_name: Tags delete: !ruby/object:Api::Azure::SDKOperationDefinition async: true diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index ed0e16589717..e421b75f1bb8 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -26,19 +26,19 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_variable_name: resource_group + python_parameter_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName - python_variable_name: namespace + python_parameter_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name - python_variable_name: name + python_parameter_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: ArmDisasterRecovery - python_variable_name: parameters + python_parameter_name: parameters '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: ArmDisasterRecoveryProperties go_type_name: ArmDisasterRecoveryProperties @@ -53,15 +53,15 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_variable_name: resource_group + python_parameter_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName - python_variable_name: namespace + python_parameter_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name - python_variable_name: name + python_parameter_name: name response: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_variable_name: resourceGroup @@ -86,15 +86,15 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_variable_name: resource_group + python_parameter_name: resource_group 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: namespaces go_variable_name: servicebusName - python_variable_name: namespace + python_parameter_name: namespace 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: disasterRecoveryConfigs go_variable_name: name - python_variable_name: name + python_parameter_name: name description: | Manages a service bus disaster recovery config on Azure. diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index 0880c49a117f..0543a252ec74 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -3,6 +3,11 @@ module Azure module Ansible module SDK module SubTemplate + def build_class_instance_variable_init(object, indentation = 8) + result = compile 'templates/azure/ansible/sdk/class_instance_variable_init.erb', 1 + indent result, indentation + end + def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) result = compile 'templates/azure/ansible/sdk/method_invocation.erb', 1 indent result, indentation diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index d9639118f6f2..9eb7f32164ae 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -20,6 +20,8 @@ __metaclass__ = type combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.python_func_name == object.azure_sdk_definition.update.python_func_name) python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] + + input_properties = object.all_user_properties.reject(&:output) -%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, @@ -39,7 +41,7 @@ description: <%= to_yaml({ 'options' => [ - object.all_user_properties.reject(&:output).map { |p| documentation_for_property(p) }, + input_properties.map{|p| documentation_for_property(p)}, { 'state' => { 'description' => [ @@ -112,9 +114,15 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): def __init__(self): self.module_arg_spec = dict( - # TODO: Finish type declaration +<%= lines(indent_list(input_properties.map{|p| python_dict_for_property(p, object)}, 12, true)) -%> + state=dict( + type='str', + default='present', + choices=['present', 'absent'] + ) ) - # TODO: Argument Properties + +<%= lines(build_class_instance_variable_init(object)) -%> self.results = dict(changed=False) self.mgmt_client = None @@ -122,7 +130,6 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.to_do = Actions.NoAction required_if = [ - # TODO: Required If ('state', 'present', []) ] diff --git a/templates/azure/ansible/sdk/class_instance_variable_init.erb b/templates/azure/ansible/sdk/class_instance_variable_init.erb new file mode 100644 index 000000000000..c536d5d2ccdf --- /dev/null +++ b/templates/azure/ansible/sdk/class_instance_variable_init.erb @@ -0,0 +1,11 @@ +<% params = object.azure_sdk_definition.create.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> +<% params.each do |name, value| -%> +<% case value -%> +<% when Api::Azure::SDKTypeDefinition::StringObject -%> +self.<%= value.python_parameter_name -%> = None +<% when Api::Azure::SDKTypeDefinition::ComplexObject -%> +self.<%= value.python_parameter_name -%> = dict() +<% else -%> +# TODO: <%= value -%> is not supported for initialization +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/ansible/sdk/method_invocation.erb b/templates/azure/ansible/sdk/method_invocation.erb index e64758072e70..10d21a37cff4 100644 --- a/templates/azure/ansible/sdk/method_invocation.erb +++ b/templates/azure/ansible/sdk/method_invocation.erb @@ -1,3 +1,3 @@ <% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> -<% param_assignments = params.map{|k, v| "#{k == '/' ? 'parameters' : k.underscore}=self.#{v.python_variable_name}"} -%> +<% param_assignments = params.map{|k, v| "#{k == '/' ? 'parameters' : k.underscore}=self.#{v.python_parameter_name}"} -%> <%= lines(build_multiline_method_call("response = self.mgmt_client.#{sdk_client}.#{sdk_op_def.python_func_name}(", param_assignments, ")")) -%> \ No newline at end of file From 4efd180f1dc6baa576630ff6ddc8740e4a8f752c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 8 Apr 2019 19:13:54 -0700 Subject: [PATCH 050/175] Generate the rest of Ansible module code. --- api/azure/sdk_definition.rb | 7 + api/azure/sdk_operation_definition.rb | 11 ++ api/azure/sdk_type_definition.rb | 10 +- api/azure/sdk_type_definition_override.rb | 10 +- api/azure/type.rb | 12 ++ api/type.rb | 2 +- .../cloud/google/azure_rm_batchaccount.py | 137 ++++++++++++------ google/python_utils.rb | 8 + products/azbatchaccount/api.yaml | 19 ++- provider/ansible/documentation.rb | 8 +- provider/ansible/module.rb | 15 +- provider/ansible/resource_override.rb | 3 + provider/azure/ansible.rb | 2 + provider/azure/ansible/module/sub_template.rb | 19 +++ provider/azure/ansible/sdk/sub_template.rb | 5 - provider/resource_override.rb | 18 +++ provider/terraform/resource_override.rb | 3 + templates/ansible/resource.erb | 63 +++++--- .../class_instance_variable_init.erb | 4 +- .../module/response_properties_update.erb | 4 + .../azure/ansible/sdk/method_invocation.erb | 4 +- 21 files changed, 269 insertions(+), 95 deletions(-) create mode 100644 provider/azure/ansible/module/sub_template.rb rename templates/azure/ansible/{sdk => module}/class_instance_variable_init.erb (79%) create mode 100644 templates/azure/ansible/module/response_properties_update.erb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 946432f2b0e8..0afb909ee933 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -26,6 +26,13 @@ def validate check_optional_property :update, Api::Azure::SDKOperationDefinition check_property :delete, Api::Azure::SDKOperationDefinition end + + def merge_overrides(overrides, language) + @create.merge_overrides(nil, language) unless @create.nil? + @read.merge_overrides(nil, language) unless @read.nil? + @update.merge_overrides(nil, language) unless @update.nil? + @delete.merge_overrides(nil, language) unless @delete.nil? + end end end end diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb index 51f3bcc8a4f6..094507fad786 100644 --- a/api/azure/sdk_operation_definition.rb +++ b/api/azure/sdk_operation_definition.rb @@ -20,6 +20,17 @@ def validate check_optional_property :response, Hash check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinition end + + def merge_overrides(overrides, language) + filter_applicable(@request, language) unless @request.nil? + filter_applicable(@response, language) unless @response.nil? + end + + private + + def filter_applicable(fields, language) + fields.reject!{|name, value| !value.applicable_to.nil? && !value.applicable_to.include?(language)} + end end end end diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 2cae84df3f5a..c077268bb10f 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -8,15 +8,17 @@ class SDKTypeDefinition < Api::Object attr_reader :go_variable_name attr_reader :go_field_name attr_reader :python_parameter_name + attr_reader :python_variable_name def validate super - check_optional_property :id_portion + check_optional_property :id_portion, String check_optional_property :applicable_to, Array check_optional_property_list_oneof :applicable_to, ['go', 'python'], String - check_optional_property :go_variable_name - check_optional_property :go_field_name - check_optional_property :python_parameter_name + check_optional_property :go_variable_name, String + check_optional_property :go_field_name, String + check_optional_property :python_parameter_name, String + check_optional_property :python_variable_name, String end class BooleanObject < SDKTypeDefinition diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index a51cc856b1b1..67f35b64b00c 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -7,13 +7,15 @@ class SDKTypeDefinitionOverride < Api::Object attr_reader :go_variable_name attr_reader :go_field_name attr_reader :python_parameter_name + attr_reader :python_variable_name def validate super - check_optional_property :id_portion - check_optional_property :go_variable_name - check_optional_property :go_field_name - check_optional_property :python_parameter_name + check_optional_property :id_portion, String + check_optional_property :go_variable_name, String + check_optional_property :go_field_name, String + check_optional_property :python_parameter_name, String + check_optional_property :python_variable_name, String end end end diff --git a/api/azure/type.rb b/api/azure/type.rb index 7998ec9a090d..3ae844e84f4d 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -5,12 +5,24 @@ module Azure module Type class ResourceGroupName < Api::Type::String + def validate + @order ||= 550 + super + end end class Location < Api::Type::String + def validate + @order ||= 600 + super + end end class Tags < Api::Type::KeyValuePairs + def validate + @order ||= 2000 + super + end end end diff --git a/api/type.rb b/api/type.rb index 9923efb50e72..bc32b4516dba 100644 --- a/api/type.rb +++ b/api/type.rb @@ -73,7 +73,7 @@ def validate check_optional_property :update_url, ::String check_optional_property :order, ::Integer - @order ||= 1000 + @order ||= 750 check_property :azure_sdk_references, ::Array check_property_non_empty_list :azure_sdk_references, ::String diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py index ebf035fac257..5839ea0dc3c4 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -37,6 +37,10 @@ - Create, update and delete instance of Azure Batch Account. options: + resource_group: + description: + - The name of the resource group in which to create the Batch Account. + required: true name: description: - The name of the Batch Account. @@ -45,22 +49,10 @@ description: - Specifies the supported Azure location where the resource exists. required: true - tags: - description: - - A mapping of tags to assign to the batch account. - required: false auto_storage_account_id: description: - The ID of the Batch Account auto storage account. required: false - pool_allocation_mode: - description: - - The pool acclocation mode of the Batch Account. - required: false - default: BatchService - choices: - - BatchService - - UserSubscription key_vault_reference: description: - A reference to the Azure key vault associated with the Batch account. @@ -75,10 +67,18 @@ description: - The URL of the Azure key vault associated with the Batch account. required: true - resource_group_name: + pool_allocation_mode: description: - - The name of the resource group in which to create the Batch Account. - required: true + - The pool acclocation mode of the Batch Account. + required: false + default: BatchService + choices: + - BatchService + - UserSubscription + tags: + description: + - A mapping of tags to assign to the batch account. + required: false state: description: - Assert the state of the Batch Account. @@ -128,16 +128,42 @@ class AzureRMBatchAccount(AzureRMModuleBase): def __init__(self): self.module_arg_spec = dict( - name=dict(required=True, type='str'), - location=dict(required=True, type='str'), - tags=dict(type='str'), - auto_storage_account_id=dict(type='str'), - pool_allocation_mode=dict(default='BatchService', type='str', choices=['BatchService', 'UserSubscription']), - key_vault_reference=dict(type='dict', options=dict( - id=dict(required=True, type='str'), - url=dict(required=True, type='str') - )), - resource_group_name=dict(required=True, type='str'), + resource_group=dict( + required=True, + type='str' + ), + name=dict( + required=True, + type='str' + ), + location=dict( + required=True, + type='str' + ), + auto_storage_account_id=dict( + type='str' + ), + key_vault_reference=dict( + type='dict', + options=dict( + id=dict( + required=True, + type='str' + ), + url=dict( + required=True, + type='str' + ) + ) + ), + pool_allocation_mode=dict( + default='BatchService', + type='str', + choices=['BatchService', 'UserSubscription'] + ), + tags=dict( + type='str' + ), state=dict( type='str', default='present', @@ -147,7 +173,7 @@ def __init__(self): self.resource_group = None self.name = None - self.parameters = dict() + self.batch_account = dict() self.results = dict(changed=False) self.mgmt_client = None @@ -165,8 +191,12 @@ def __init__(self): def exec_module(self, **kwargs): """Main module execution method""" - # TODO: Parameters -> Class Properties - # TODO: Parameters -> SDK + + for key in list(self.module_arg_spec.keys()) + ['tags']: + if hasattr(self, key): + setattr(self, key, kwargs[key]) + elif kwargs[key] is not None: + self.parameters[key] = kwargs[key] response = None @@ -175,18 +205,30 @@ def exec_module(self, **kwargs): old_response = self.get_batchaccount() - # TODO: Idempotency Check + if not old_response: + self.log("Batch Account instance doesn't exist") + if self.state == 'absent': + self.log("Old instance didn't exist") + else: + self.to_do = Actions.Create + else: + self.log("Batch Account instance already exists") + if self.state == 'absent': + self.to_do = Actions.Delete + elif self.state == 'present': + if (not default_compare(self.parameters, old_response, '', self.results)): + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): - self.log("Need to Create the Batch Account instance") + self.log("Need to Create / Update the Batch Account instance") self.results['changed'] = True if self.check_mode: return self.results - response = self.create_batchaccount() + response = self.create_update_batchaccount() - self.log("Creation done") + self.log("Creation / Update done") elif self.to_do == Actions.Delete: self.log("Batch Account instance deleted") self.results['changed'] = True @@ -200,19 +242,30 @@ def exec_module(self, **kwargs): self.results['changed'] = False response = old_response - # TODO: Format Response + if self.state == 'present': + self.results.update({ + 'id': response.get('id', None) + }) + return self.results - def create_batchaccount(self): + def create_update_batchaccount(self): ''' - Creates Batch Account with the specified configuration. + Creates or updates Batch Account with the specified configuration. :return: deserialized Batch Account instance state dictionary ''' - self.log("Creating the Batch Account instance {0}".format(self.name)) + self.log("Creating / Updating the Batch Account instance {0}".format(self.name)) + try: - response = self.mgmt_client.batch_account.create(resource_group_name=self.resource_group, - account_name=self.name, - parameters=self.parameters) + if self.to_do == Actions.Create: + response = self.mgmt_client.batch_account.create(resource_group_name=self.resource_group, + name=self.name, + parameters=self.batch_account) + else: + response = self.mgmt_client.batch_account.update(resource_group_name=self.resource_group, + name=self.name, + tags=self.tags, + auto_storage=self.auto_storage) if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): response = self.get_poller_result(response) except CloudError as exc: @@ -220,8 +273,6 @@ def create_batchaccount(self): self.fail("Error creating the Batch Account instance: {0}".format(str(exc))) return response.as_dict() - # TODO: Update Function Not Implemented - def delete_batchaccount(self): ''' Deletes specified Batch Account instance in the specified subscription and resource group. @@ -231,7 +282,7 @@ def delete_batchaccount(self): self.log("Deleting the Batch Account instance {0}".format(self.name)) try: response = self.mgmt_client.batch_account.delete(resource_group_name=self.resource_group, - account_name=self.name) + name=self.name) except CloudError as e: self.log('Error attempting to delete the Batch Account instance.') self.fail("Error deleting the Batch Account instance: {0}".format(str(e))) @@ -249,7 +300,7 @@ def get_batchaccount(self): found = false try: response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, - account_name=self.name) + name=self.name) found = True self.log("Response : {0}".format(response)) self.log("Batch Account instance : {0} found".format(response.name)) diff --git a/google/python_utils.rb b/google/python_utils.rb index 89e3e766726d..4073bd43f517 100644 --- a/google/python_utils.rb +++ b/google/python_utils.rb @@ -51,5 +51,13 @@ def method_decl(name, args) def method_call(name, args) "#{name}(#{args.compact.join(', ')})" end + + def python_field_name(property, sdk_op_def) + sdk_ref = property.azure_sdk_references[0] + return property.out_name.underscore unless sdk_op_def.request.has_key?(sdk_ref) + python_var = sdk_op_def.request[sdk_ref].python_variable_name + return property.out_name.underscore if python_var.nil? + python_var + end end end diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 036838f789a8..af2082df456a 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -29,15 +29,18 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_parameter_name: resource_group + python_parameter_name: resource_group_name + python_variable_name: resource_group 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name python_parameter_name: name + python_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: AccountCreateParameters python_parameter_name: parameters + python_variable_name: batch_account '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject @@ -67,11 +70,13 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_parameter_name: resource_group + python_parameter_name: resource_group_name + python_variable_name: resource_group 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name python_parameter_name: name + python_variable_name: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Account @@ -108,17 +113,21 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_parameter_name: resource_group + python_parameter_name: resource_group_name + python_variable_name: resource_group 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name python_parameter_name: name + python_variable_name: name 'tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject applicable_to: [python] python_parameter_name: tags + python_variable_name: tags 'autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject applicable_to: [python] python_parameter_name: auto_storage + python_variable_name: auto_storage 'autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject applicable_to: [python] '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject @@ -147,11 +156,13 @@ objects: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups go_variable_name: resourceGroup - python_parameter_name: resource_group + python_parameter_name: resource_group_name + python_variable_name: resource_group 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name python_parameter_name: name + python_variable_name: name description: | Manages a Batch Account on Azure. diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 2e972f7ad3b6..2406bf9ea2b0 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -32,10 +32,10 @@ def to_yaml(obj) # Builds out the DOCUMENTATION for a property. # This will eventually be converted to YAML - def documentation_for_property(prop) + def documentation_for_property(prop, object) required = prop.required && !prop.default_value ? true : false { - prop.name.underscore => { + python_field_name(prop, object.azure_sdk_definition.create) => { 'description' => [ format_description(prop.description), (resourceref_description(prop) \ @@ -49,10 +49,10 @@ def documentation_for_property(prop) 'choices' => (prop.values.map(&:to_s) if prop.is_a? Api::Type::Enum), 'suboptions' => ( if prop.is_a?(Api::Type::NestedObject) - prop.properties.map { |p| documentation_for_property(p) }.reduce({}, :merge) + prop.properties.map { |p| documentation_for_property(p, object) }.reduce({}, :merge) elsif prop.is_a?(Api::Type::Array) && prop.item_type.is_a?(Api::Type::NestedObject) prop.item_type.properties - .map { |p| documentation_for_property(p) } + .map { |p| documentation_for_property(p, object) } .reduce({}, :merge) end ) diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index 90f8678f570d..e148061a55ad 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -28,8 +28,9 @@ def python_dict_for_property(prop, object, spaces = 0) elsif prop.is_a? Api::Type::NestedObject nested_obj_dict(prop, object, prop.properties, spaces) else - name = prop.out_name.underscore - "#{name}=dict(#{prop_options(prop, object, spaces).join(', ')})" + name = python_field_name(prop, object.azure_sdk_definition.create) + options = prop_options(prop, object, spaces).join("\n") + "#{name}=dict(\n#{indent_list(options, 4)}\n)" end end @@ -38,14 +39,14 @@ def python_dict_for_property(prop, object, spaces = 0) # Creates a Python dictionary representing a nested object property # for validation. def nested_obj_dict(prop, object, properties, spaces) - name = prop.out_name.underscore - options = prop_options(prop, object, spaces).join(', ') + name = python_field_name(prop, object.azure_sdk_definition.create) + options = prop_options(prop, object, spaces).join("\n") [ - "#{name}=dict(#{options}, options=dict(", + "#{name}=dict(\n#{indent_list(options, 4, true)}\n options=dict(", indent_list(properties.map do |p| python_dict_for_property(p, object, spaces + 4) - end, 4), - '))' + end, 8), + " )\n)" ] end diff --git a/provider/ansible/resource_override.rb b/provider/ansible/resource_override.rb index c63daeaa8189..d37a8ce6c0bd 100644 --- a/provider/ansible/resource_override.rb +++ b/provider/ansible/resource_override.rb @@ -45,6 +45,9 @@ class ResourceOverride < Provider::ResourceOverride def validate super + @name_default_order = 555 + @azure_sdk_language = 'python' + default_value_property :access_api_results, false default_value_property :custom_create_resource, false default_value_property :custom_update_resource, false diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 32d0a612e7a0..409ee668914f 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -1,10 +1,12 @@ require 'provider/azure/ansible/sub_template' +require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' module Provider module Azure module Ansible include Provider::Azure::Ansible::SubTemplate + include Provider::Azure::Ansible::Module::SubTemplate include Provider::Azure::Ansible::SDK::SubTemplate end end diff --git a/provider/azure/ansible/module/sub_template.rb b/provider/azure/ansible/module/sub_template.rb new file mode 100644 index 000000000000..78eba803bc1c --- /dev/null +++ b/provider/azure/ansible/module/sub_template.rb @@ -0,0 +1,19 @@ +module Provider + module Azure + module Ansible + module Module + module SubTemplate + def build_class_instance_variable_init(object, indentation = 8) + result = compile 'templates/azure/ansible/module/class_instance_variable_init.erb', 1 + indent result, indentation + end + + def build_response_properties_update(properties, sdk_response_def, indentation = 16) + result = compile 'templates/azure/ansible/module/response_properties_update.erb', 1 + indent_list result, indentation + end + end + end + end + end +end \ No newline at end of file diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index 0543a252ec74..0880c49a117f 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -3,11 +3,6 @@ module Azure module Ansible module SDK module SubTemplate - def build_class_instance_variable_init(object, indentation = 8) - result = compile 'templates/azure/ansible/sdk/class_instance_variable_init.erb', 1 - indent result, indentation - end - def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) result = compile 'templates/azure/ansible/sdk/method_invocation.erb', 1 indent result, indentation diff --git a/provider/resource_override.rb b/provider/resource_override.rb index f056db09094e..6ff0a03d6c63 100644 --- a/provider/resource_override.rb +++ b/provider/resource_override.rb @@ -30,6 +30,8 @@ class ResourceOverride < Api::Object def apply(api_resource) ensure_resource_properties update_overriden_properties(api_resource) + update_overriden_azure_sdk_definition(api_resource) + update_name_property_sort_order(api_resource) # TODO(nelsonjr): Enable revalidate the object to make sure we did not # break the object during the override process @@ -39,6 +41,9 @@ def apply(api_resource) def validate super + @name_default_order = 750 + @azure_sdk_language = 'csharp' + @properties ||= {} check_property :properties, Hash @@ -89,6 +94,19 @@ def require_module(clazz) unless self.class.included_modules.include?(clazz) end + def update_overriden_azure_sdk_definition(api_resource) + override = instance_variable_get('@azure_sdk_definition') + api_resource.azure_sdk_definition.merge_overrides override, @azure_sdk_language + end + + def update_name_property_sort_order(api_resource) + name_index = api_resource.properties.find_index{|p| p.name == 'name'} + unless name_index.nil? + name_prop = api_resource.properties[name_index] + name_prop.instance_variable_set('@order', @name_default_order) + end + end + # Returns the module that provides overriden properties for this provider. def overriden raise "overriden property should be implemented in #{self.class}" diff --git a/provider/terraform/resource_override.rb b/provider/terraform/resource_override.rb index 173213b66868..559319bca0ce 100644 --- a/provider/terraform/resource_override.rb +++ b/provider/terraform/resource_override.rb @@ -48,6 +48,9 @@ class ResourceOverride < Provider::ResourceOverride def validate super + @name_default_order = 500 + @azure_sdk_language = 'go' + @id_format ||= '{{name}}' @import_format ||= [] @custom_code ||= Provider::Terraform::CustomCode.new diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 9eb7f32164ae..27ae8b253aeb 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -21,7 +21,9 @@ __metaclass__ = type python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] - input_properties = object.all_user_properties.reject(&:output) + input_properties = object.all_user_properties.reject(&:output).sort_by{|p| [p.order, p.name]} + output_properties = object.all_user_properties.select(&:output) + root_object_field = object.azure_sdk_definition.create.request["/"].python_parameter_name -%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, @@ -41,7 +43,7 @@ description: <%= to_yaml({ 'options' => [ - input_properties.map{|p| documentation_for_property(p)}, + input_properties.map{|p| documentation_for_property(p, object)}, { 'state' => { 'description' => [ @@ -81,7 +83,7 @@ EXAMPLES = ''' <% end -%> RETURN = ''' -<%= to_yaml(object.all_user_properties.select(&:output).map { |p| returns_for_property(p) }.reduce({ +<%= to_yaml(output_properties.map{|p| returns_for_property(p)}.reduce({ 'id'=> { 'description' => ['The identifier of the DTL Virtual Machine resource.'], 'returned' => 'always', @@ -139,8 +141,12 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): def exec_module(self, **kwargs): """Main module execution method""" - # TODO: Parameters -> Class Properties - # TODO: Parameters -> SDK + + for key in list(self.module_arg_spec.keys()) + ['tags']: + if hasattr(self, key): + setattr(self, key, kwargs[key]) + elif kwargs[key] is not None: + self.<%= root_object_field -%>[key] = kwargs[key] response = None @@ -149,18 +155,30 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): old_response = self.get_<%= object.name.downcase -%>() - # TODO: Idempotency Check + if not old_response: + self.log("<%= object.name.titlecase -%> instance doesn't exist") + if self.state == 'absent': + self.log("Old instance didn't exist") + else: + self.to_do = Actions.Create + else: + self.log("<%= object.name.titlecase -%> instance already exists") + if self.state == 'absent': + self.to_do = Actions.Delete + elif self.state == 'present': + if (not default_compare(self.<%= root_object_field -%>, old_response, '', self.results)): + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): - self.log("Need to Create<%= " / Update" if combine_create_update -%> the <%= object.name.titlecase -%> instance") + self.log("Need to Create / Update the <%= object.name.titlecase -%> instance") self.results['changed'] = True if self.check_mode: return self.results - response = self.<%= combine_create_update ? "create_update" : "create" -%>_<%= object.name.downcase -%>() + response = self.create_update_<%= object.name.downcase -%>() - self.log("Creation<%= " / Update" if combine_create_update -%> done") + self.log("Creation / Update done") elif self.to_do == Actions.Delete: self.log("<%= object.name.titlecase -%> instance deleted") self.results['changed'] = True @@ -174,18 +192,29 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.results['changed'] = False response = old_response - # TODO: Format Response + if self.state == 'present': + self.results.update({ +<%= lines(build_response_properties_update(output_properties, object.azure_sdk_definition.read.response)) -%> + }) + return self.results -<% sdk_operation = object.azure_sdk_definition.create -%> - def <%= combine_create_update ? "create_update" : "create" -%>_<%= object.name.downcase -%>(self): + def create_update_<%= object.name.downcase -%>(self): ''' - Creates<%= " or updates" if combine_create_update -%> <%= object.name.titlecase -%> with the specified configuration. + Creates or updates <%= object.name.titlecase -%> with the specified configuration. :return: deserialized <%= object.name.titlecase -%> instance state dictionary ''' - self.log("Creating<%= " / Updating" if combine_create_update -%> the <%= object.name.titlecase -%> instance {0}".format(self.name)) + self.log("Creating / Updating the <%= object.name.titlecase -%> instance {0}".format(self.name)) + try: -<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> +<% if combine_create_update -%> +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, object.azure_sdk_definition.create)) -%> +<% else -%> + if self.to_do == Actions.Create: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, object.azure_sdk_definition.create, 16)) -%> + else: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, object.azure_sdk_definition.update, 16)) -%> +<% end -%> if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): response = self.get_poller_result(response) except CloudError as exc: @@ -193,10 +222,6 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.fail("Error creating the <%= object.name.titlecase -%> instance: {0}".format(str(exc))) return response.as_dict() -<% if !combine_create_update -%> - # TODO: Update Function Not Implemented -<% end -%> - <% sdk_operation = object.azure_sdk_definition.delete -%> def delete_<%= object.name.downcase -%>(self): ''' diff --git a/templates/azure/ansible/sdk/class_instance_variable_init.erb b/templates/azure/ansible/module/class_instance_variable_init.erb similarity index 79% rename from templates/azure/ansible/sdk/class_instance_variable_init.erb rename to templates/azure/ansible/module/class_instance_variable_init.erb index c536d5d2ccdf..e26d40458ec6 100644 --- a/templates/azure/ansible/sdk/class_instance_variable_init.erb +++ b/templates/azure/ansible/module/class_instance_variable_init.erb @@ -2,9 +2,9 @@ <% params.each do |name, value| -%> <% case value -%> <% when Api::Azure::SDKTypeDefinition::StringObject -%> -self.<%= value.python_parameter_name -%> = None +self.<%= value.python_variable_name -%> = None <% when Api::Azure::SDKTypeDefinition::ComplexObject -%> -self.<%= value.python_parameter_name -%> = dict() +self.<%= value.python_variable_name -%> = dict() <% else -%> # TODO: <%= value -%> is not supported for initialization <% end -%> diff --git a/templates/azure/ansible/module/response_properties_update.erb b/templates/azure/ansible/module/response_properties_update.erb new file mode 100644 index 000000000000..e300439158e2 --- /dev/null +++ b/templates/azure/ansible/module/response_properties_update.erb @@ -0,0 +1,4 @@ +'id': response.get('id', None) +<% properties.each do |prop| -%> +'<%= prop.name -%>': response.get('??', None) +<% end -%> \ No newline at end of file diff --git a/templates/azure/ansible/sdk/method_invocation.erb b/templates/azure/ansible/sdk/method_invocation.erb index 10d21a37cff4..df3d40304f8f 100644 --- a/templates/azure/ansible/sdk/method_invocation.erb +++ b/templates/azure/ansible/sdk/method_invocation.erb @@ -1,3 +1,3 @@ -<% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> -<% param_assignments = params.map{|k, v| "#{k == '/' ? 'parameters' : k.underscore}=self.#{v.python_parameter_name}"} -%> +<% params = sdk_op_def.request.reject{|k, v| k.include?("/") && k != "/"} -%> +<% param_assignments = params.map{|k, v| "#{v.python_parameter_name}=self.#{v.python_variable_name}"} -%> <%= lines(build_multiline_method_call("response = self.mgmt_client.#{sdk_client}.#{sdk_op_def.python_func_name}(", param_assignments, ")")) -%> \ No newline at end of file From 6393ca1d2917dda3f1b29f4eca467db9bd7b8198 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 9 Apr 2019 13:02:00 -0700 Subject: [PATCH 051/175] Include examples in BatchAccount (Ansible). --- .../cloud/google/azure_rm_batchaccount.py | 9 ++ .../azure_rm_batchaccount/tasks/main.yml | 102 ++++++++++++++++++ .../examples/ansible/batch_account.yaml | 10 ++ 3 files changed, 121 insertions(+) create mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml create mode 100644 products/azbatchaccount/examples/ansible/batch_account.yaml diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py index 5839ea0dc3c4..c421184627ba 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -96,6 +96,15 @@ - "Zim Kalinowski (@zikalino)" ''' +EXAMPLES = ''' + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "test_object" + location: West US + storage_account_id: MyStorageAccountId + state: present +''' RETURN = ''' id: diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml new file mode 100644 index 000000000000..af31bcb8a5a2 --- /dev/null +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml @@ -0,0 +1,102 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- +# Pre-test setup + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "{{ resource_name }}" + location: West US + storage_account_id: MyStorageAccountId + state: absent +#---------------------------------------------------------- + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "{{ resource_name }}" + location: West US + storage_account_id: MyStorageAccountId + state: present + register: result +- name: assert changed is true + assert: + that: + - result.changed == true +- name: verify that batch_account was created + gcp_zbatchaccount_batch_account_facts: + filters: + - name = {{ resource_name }} + project: "{{ gcp_project }}" + auth_kind: "{{ gcp_cred_kind }}" + service_account_file: "{{ gcp_cred_file }}" + scopes: + - NotUsedInAzure + register: results +- name: verify that command succeeded + assert: + that: + - results['items'] | length == 1 +# ---------------------------------------------------------------------------- + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "{{ resource_name }}" + location: West US + storage_account_id: MyStorageAccountId + state: present + register: result +- name: assert changed is false + assert: + that: + - result.changed == false +#---------------------------------------------------------- + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "{{ resource_name }}" + location: West US + storage_account_id: MyStorageAccountId + state: absent + register: result +- name: assert changed is true + assert: + that: + - result.changed == true +- name: verify that batch_account was deleted + gcp_zbatchaccount_batch_account_facts: + filters: + - name = {{ resource_name }} + project: "{{ gcp_project }}" + auth_kind: "{{ gcp_cred_kind }}" + service_account_file: "{{ gcp_cred_file }}" + scopes: + - NotUsedInAzure + register: results +- name: verify that command succeeded + assert: + that: + - results['items'] | length == 0 +# ---------------------------------------------------------------------------- + - name: Create (or update) Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: "{{ resource_name }}" + location: West US + storage_account_id: MyStorageAccountId + state: absent + register: result +- name: assert changed is false + assert: + that: + - result.changed == false diff --git a/products/azbatchaccount/examples/ansible/batch_account.yaml b/products/azbatchaccount/examples/ansible/batch_account.yaml new file mode 100644 index 000000000000..7c73e0fa9c91 --- /dev/null +++ b/products/azbatchaccount/examples/ansible/batch_account.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Ansible::Example +task: !ruby/object:Provider::Ansible::Task + name: azure_rm_batchaccount + description: Create (or update) Batch Account + code: + resource_group: myResourceGroup + name: <%= ctx[:name] %> + resource_group: MyResGroup + location: West US + storage_account_id: MyStorageAccountId From b21b9f72e6b69db757e42266650a6af37a75ebf8 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 9 Apr 2019 17:20:55 -0700 Subject: [PATCH 052/175] Generate Terraform BatchAccount resource. --- .../azurerm/resource_arm_batch_account.go | 236 ++++++++++++++++++ .../resource_arm_batch_account_test.go | 74 ++++++ .../docs/r/batch_account.html.markdown | 69 +++++ google/python_utils.rb | 6 +- products/azbatchaccount/api.yaml | 2 +- products/azbatchaccount/terraform.yaml | 10 + provider/azure/ansible.rb | 2 + provider/azure/ansible/sdk/helpers.rb | 28 +++ provider/azure/terraform/example/helpers.rb | 2 +- provider/azure/terraform/schema.rb | 2 +- provider/azure/terraform/sdk/helpers.rb | 15 +- provider/azure/terraform/sdk/sub_template.rb | 5 +- .../acctest/parameters_from_schema.erb | 4 +- .../sdk/errorf_with_resource_name.erb | 4 +- .../sdktypes/property_to_sdkfield_assign.erb | 2 +- .../examples/base_configs/test_file.go.erb | 2 +- templates/terraform/resource.erb | 75 +++--- .../terraform/resource.html.markdown.erb | 2 +- templates/terraform/schemas/primitive.erb | 26 +- 19 files changed, 503 insertions(+), 63 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_batch_account.go create mode 100644 build/azterraform/azurerm/resource_arm_batch_account_test.go create mode 100644 build/azterraform/website/docs/r/batch_account.html.markdown create mode 100644 products/azbatchaccount/terraform.yaml create mode 100644 provider/azure/ansible/sdk/helpers.rb diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go new file mode 100644 index 000000000000..4982a845c6a1 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -0,0 +1,236 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmBatchAccount() *schema.Resource { + return &schema.Resource{ + Create: resourceArmBatchAccountCreate, + Read: resourceArmBatchAccountRead, + Update: resourceArmBatchAccountUpdate, + Delete: resourceArmBatchAccountDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "location": locationSchema(), + + "resource_group_name": resourceGroupNameSchema(), + + "auto_storage_account_id": { + Type: schema.TypeString, + Optional: true, + }, + + "key_vault_reference": { + Type: schema.TypeList, + Optional: true, + ForceNew: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "url": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + }, + }, + + "pool_allocation_mode": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ValidateFunc: validation.StringInSlice([]string{ + string(batch.BatchService), + string(batch.UserSubscription), + }, false), + Default: "BatchService", + }, + + "tags": tagsSchema(), + }, + } +} + +func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).batchAccountClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_batch_account", *resp.ID) + } + } + + location := azureRMNormalizeLocation(d.Get("location").(string)) + autoStorageAccountId := d.Get("auto_storage_account_id").(string) + // TODO: Property 'key_vault_reference' of type Api::Type::NestedObject is not supported + poolAllocationMode := d.Get("pool_allocation_mode").(string) + tags := d.Get("tags").(map[string]interface{}) + + parameters := batch.AccountCreateParameters{ + Location: utils.String(location), + AccountCreateProperties: &batch.AccountCreateProperties{ + AutoStorage: &batch.AutoStorageBaseProperties{ + StorageAccountID: utils.String(autoStorageAccountId), + }, + KeyVaultReference: &batch.KeyVaultReference{ + }, + PoolAllocationMode: batch.PoolAllocationMode(poolAllocationMode), + }, + Tags: expandTags(tags), + } + + + future, err := client.Create(ctx, resourceGroup, name, parameters) + if err != nil { + return fmt.Errorf("Error creating Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + return fmt.Errorf("Error retrieving Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Batch Account %q (Resource Group %q) ID", name, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmBatchAccountRead(d, meta) +} + +func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).batchAccountClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + name := id.Path["batchAccounts"] + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Batch Account %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + + + d.Set("name", resp.Name) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) + } + if accountProperties := resp.AccountProperties; accountProperties != nil { + if autoStorage := accountProperties.AutoStorage; autoStorage != nil { + d.Set("auto_storage_account_id", autoStorage.StorageAccountID) + } + if keyVaultReference := accountProperties.KeyVaultReference; keyVaultReference != nil { + } + d.Set("pool_allocation_mode", string(accountProperties.PoolAllocationMode)) + } + flattenAndSetTags(d, resp.Tags) + + return nil +} + +func resourceArmBatchAccountUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).batchAccountClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + autoStorageAccountId := d.Get("auto_storage_account_id").(string) + tags := d.Get("tags").(map[string]interface{}) + + parameters := batch.AccountUpdateParameters{ + AccountUpdateProperties: &batch.AccountUpdateProperties{ + AutoStorage: &batch.AutoStorageBaseProperties{ + StorageAccountID: utils.String(autoStorageAccountId), + }, + }, + Tags: expandTags(tags), + } + + if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { + return fmt.Errorf("Error updating Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + return resourceArmBatchAccountRead(d, meta) +} + +func resourceArmBatchAccountDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).batchAccountClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + name := id.Path["batchAccounts"] + + future, err := client.Delete(ctx, resourceGroup, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_batch_account_test.go b/build/azterraform/azurerm/resource_arm_batch_account_test.go new file mode 100644 index 000000000000..dfd87c31ba1d --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_batch_account_test.go @@ -0,0 +1,74 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMBatchAccountExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Batch Account not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + client := testAccProvider.Meta().(*ArmClient).batchAccountClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Batch Account %q (Resource Group %q) does not exist", name, resourceGroup) + } + return fmt.Errorf("Bad: Get on batchAccountClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMBatchAccountDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).batchAccountClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_batch_account" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on batchAccountClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/batch_account.html.markdown b/build/azterraform/website/docs/r/batch_account.html.markdown new file mode 100644 index 000000000000..b39b04d07006 --- /dev/null +++ b/build/azterraform/website/docs/r/batch_account.html.markdown @@ -0,0 +1,69 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_batch_account" +sidebar_current: "docs-azurerm-resource-batch-account" +description: |- + Manages a Batch Account on Azure. +--- + +# azurerm_batch_account + +Manages a Batch Account on Azure. + + +## Example Usage - Resource Group + + +```hcl +resource "azurerm_resource_group" "example" { + name = "ExampleRG" + location = "West US" + + tags { + environment = "Production" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the Batch Account. Changing this forces a new resource to be created. + +* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which to create the Batch Account. Changing this forces a new resource to be created. + +* `tags` - (Optional) A mapping of tags to assign to the batch account. + +* `auto_storage_account_id` - (Optional) The ID of the Batch Account auto storage account. + +* `pool_allocation_mode` - (Optional) The pool acclocation mode of the Batch Account. Defaults to `BatchService`. Changing this forces a new resource to be created. + +* `key_vault_reference` - (Optional) A reference to the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. Structure is documented below. + +The `key_vault_reference` block supports: + +* `id` - (Required) The resource ID of the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. + +* `url` - (Required) The URL of the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. + +## Attributes Reference + +The following attributes are exported: + +* `id` - The ID of the Batch Account. diff --git a/google/python_utils.rb b/google/python_utils.rb index 4073bd43f517..a41bdc12d82b 100644 --- a/google/python_utils.rb +++ b/google/python_utils.rb @@ -53,9 +53,9 @@ def method_call(name, args) end def python_field_name(property, sdk_op_def) - sdk_ref = property.azure_sdk_references[0] - return property.out_name.underscore unless sdk_op_def.request.has_key?(sdk_ref) - python_var = sdk_op_def.request[sdk_ref].python_variable_name + sdk_ref = get_applicable_reference(property.azure_sdk_references, sdk_op_def.request) + return property.out_name.underscore if sdk_ref.nil? + python_var = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_op_def.request).python_variable_name return property.out_name.underscore if python_var.nil? python_var end diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index af2082df456a..b817d20476ae 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -193,7 +193,7 @@ objects: - !ruby/object:Api::Type::String name: autoStorageAccountId description: The ID of the Batch Account auto storage account. - azure_sdk_references: ['/properties/autoStorage/storageAccountId', 'autoStorage/storageAccountId'] + azure_sdk_references: ['autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] - !ruby/object:Api::Type::Enum name: poolAllocationMode description: The pool acclocation mode of the Batch Account. diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml new file mode 100644 index 000000000000..f452c10cb29f --- /dev/null +++ b/products/azbatchaccount/terraform.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Terraform::Config +name: azbatchaccount +overrides: !ruby/object:Provider::ResourceOverrides + BatchAccount: !ruby/object:Provider::Terraform::ResourceOverride + example: + - !ruby/object:Provider::Terraform::Examples + name: "resource_group" + primary_resource_id: "example" + vars: + rg_name: "ExampleRG" diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 409ee668914f..7e75130d7a35 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -1,3 +1,4 @@ +require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/sub_template' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' @@ -5,6 +6,7 @@ module Provider module Azure module Ansible + include Provider::Azure::Ansible::SDK::Helpers include Provider::Azure::Ansible::SubTemplate include Provider::Azure::Ansible::Module::SubTemplate include Provider::Azure::Ansible::SDK::SubTemplate diff --git a/provider/azure/ansible/sdk/helpers.rb b/provider/azure/ansible/sdk/helpers.rb new file mode 100644 index 000000000000..4bc0dbe35370 --- /dev/null +++ b/provider/azure/ansible/sdk/helpers.rb @@ -0,0 +1,28 @@ +module Provider + module Azure + module Ansible + module SDK + module Helpers + def get_properties_matching_sdk_reference(sdk_reference, object) + object.all_user_properties + .select{|p| p.azure_sdk_references.include?(sdk_reference)} + .sort_by{|p| [p.order, p.name]} + end + + def get_applicable_reference(references, typedefs) + references.each do |ref| + return ref if typedefs.has_key?(ref) + end + nil + end + + def get_sdk_typedef_by_references(references, typedefs) + ref = get_applicable_reference(references, typedefs) + return nil if ref.nil? + typedefs[ref] + end + end + end + end + end +end diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index 9effd5026606..7ed9230973ba 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -7,7 +7,7 @@ class Example < Api::Object module Helpers def get_example_properties_to_check(product_name, example_name, object) request = object.azure_sdk_definition.read.request - param_props = object.all_user_properties.select{|p| request.has_key?(p.azure_sdk_references[0])} + param_props = object.all_user_properties.select{|p| azure_sdk_references.any?{|ref| request.has_key?(ref)}} params = param_props.map{|p| p.name.underscore}.to_set example = get_example_from_file(product_name, example_name) diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index a7d9e28b2b44..dd0fad347aa0 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -38,7 +38,7 @@ def schema_property_template(property) 'templates/azure/terraform/schemas/location.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs, Api::Type::NestedObject 'templates/terraform/schemas/primitive.erb' else 'templates/terraform/schemas/unsupport.erb' diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 8b0b14d5a4b4..083428049b4d 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -9,6 +9,19 @@ def get_properties_matching_sdk_reference(sdk_reference, object) .sort_by{|p| [p.order, p.name]} end + def get_applicable_reference(references, typedefs) + references.each do |ref| + return ref if typedefs.has_key?(ref) + end + nil + end + + def get_sdk_typedef_by_references(references, typedefs) + ref = get_applicable_reference(references, typedefs) + return nil if ref.nil? + typedefs[ref] + end + def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) @@ -16,7 +29,7 @@ def property_to_sdk_field_assignment_template(property, sdk_type) when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject - 'templates/azure/terraform/sdktypes/enum_fiield_assign.erb' + 'templates/azure/terraform/sdktypes/enum_field_assign.erb' else 'templates/azure/terraform/sdktypes/unsupport.erb' end diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 02375da13b6f..88c536c36eea 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -22,11 +22,12 @@ def build_schema_property_set(input, output, property, indentation = 0) property: property end - def build_sdk_field_assignment(property, sdk_type, resource_name) + def build_sdk_field_assignment(property, sdk_type, resource_name, object) compile_template property_to_sdk_field_assignment_template(property, sdk_type), property: property, sdk_type: sdk_type, - resouce_name: resource_name + resouce_name: resource_name, + object: object end def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object, indentation = 4) diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb index 0f9622f7d528..f35618565fea 100644 --- a/templates/azure/terraform/acctest/parameters_from_schema.erb +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -1,4 +1,4 @@ -<% properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) }.each do |prop| -%> -<% var_name = sdk_op_def.request[prop.azure_sdk_references[0]].go_variable_name -%> +<% properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil?}.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_op_def.request).go_variable_name -%> <%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index fb6e1b3507b1..fb63af1767ac 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -3,8 +3,8 @@ res_var = "" depends = [] depends_vars = [] - properties.select{|p| sdk_op_def.request.has_key?(p.azure_sdk_references[0]) && !p.azure_sdk_references[0].start_with?("/") }.each do |prop| - param = sdk_op_def.request[prop.azure_sdk_references[0]] + properties.select{|p| !get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil? && !get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).start_with?("/") }.each do |prop| + param = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_op_def.request) case prop.name when "name" res_name = "#{get_property_value(prop, "name_in_logs", nil) || object.name.titlecase} %q" diff --git a/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb b/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb index e90e27806f62..e5ca3b954048 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb @@ -1,3 +1,3 @@ <% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> -<%= lines(build_sdk_field_assignment(property, sdk_type_defs[api_path], resource_name)) -%> +<%= lines(build_sdk_field_assignment(property, sdk_type_defs[api_path], resource_name, object)) -%> <% end -%> \ No newline at end of file diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 960dfe7d2aa4..ee6989350088 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -14,7 +14,7 @@ import ( <% resource_name = "AzureRM" + object.name terraform_name = "azurerm_" + object.name.underscore - azure_client_name = "#{object.api_name}Client".camelcase(:lower) + azure_client_name = object.azure_sdk_definition.go_client properties = object.all_user_properties contains_acctests = object.instance_variable_defined?(:@acctests) %> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 954affc85f72..c724e42c73db 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -26,8 +26,7 @@ package azurerm # can just be read in anyways, and after a Read they will need to be set in every Update. settable_properties = properties.reject{ |v| v.output && !v.is_a?(Api::Type::Fingerprint) }.reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH - update_body_properties = settable_properties - update_body_properties = settable_properties.reject(&:input) if object.update_verb == :PATCH + updatable_properties = settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager api_name_lower = String.new(product_ns) api_name_lower[0] = api_name_lower[0].downcase @@ -36,7 +35,7 @@ package azurerm has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> <% - azure_client_name = "#{object.api_name}Client".camelcase(:lower) + azure_client_name = object.azure_sdk_definition.go_client sdk_package = azure_resource_go_package(object.__product) -%> <% @@ -79,7 +78,7 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(compile(object.custom_code.resource_definition)) if object.custom_code.resource_definition -%> Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> -<% order_azure_properties(properties.reject(&:hide_from_schema)).each do |prop| -%> +<% order_azure_properties(properties.reject{|p| get_property_value(p, 'hide_from_schema', false)}).each do |prop| -%> <%= lines_before(build_schema_property(prop, object, 12)) -%> <% end -%> @@ -97,13 +96,14 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff } <% end -%> +<% sdk_operation = object.azure_sdk_definition.create -%> func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= azure_client_name -%> ctx := meta.(*ArmClient).StopContext -<% settable_properties.reject{|p| p.azure_sdk_references[0].start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> +<% settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> @@ -122,13 +122,13 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res } } -<% settable_properties.select{|p| p.azure_sdk_references[0].start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<% var_name = object.azure_sdk_definition.create.request[prop.azure_sdk_references[0]].go_variable_name -%> +<% settable_properties.select{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", resource_name, object.azure_sdk_definition.create.request, object)) -%> +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -139,20 +139,20 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res defer mutexKV.Unlock(lockName) <% end -%> -<% unless object.azure_sdk_definition.create.async -%> - if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%>; err != nil { - return <%= build_errorf_with_resource_name("Error creating %s", true, object.azure_sdk_definition.create, properties, object) -%> +<% unless sdk_operation.async -%> + if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { + return <%= build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object) -%> } <% else -%> - future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.create) -%> + future, err := <%= build_sdk_func_invocation(sdk_operation) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error creating %s", true, object.azure_sdk_definition.create, properties, object) -%> + return <%= build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return <%= build_errorf_with_resource_name("Error waiting for creation of %s", true, object.azure_sdk_definition.create, properties, object) -%> + return <%= build_errorf_with_resource_name("Error waiting for creation of %s", true, sdk_operation, properties, object) -%> } <% end -%> @@ -162,11 +162,11 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error retrieving %s", true, object.azure_sdk_definition.create, properties, object) -%> + return <%= build_errorf_with_resource_name("Error retrieving %s", true, object.azure_sdk_definition.read, properties, object) -%> } if resp.ID == nil { - return <%= build_errorf_with_resource_name("Cannot read %s ID", false, object.azure_sdk_definition.create, properties, object) -%> + return <%= build_errorf_with_resource_name("Cannot read %s ID", false, object.azure_sdk_definition.read, properties, object) -%> } d.SetId(*resp.ID) @@ -212,38 +212,45 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) } <% if !combine_create_update -%> +<% sdk_operation = object.azure_sdk_definition.update -%> func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= azure_client_name -%> ctx := meta.(*ArmClient).StopContext -<%= build_azure_id_parser(object.azure_sdk_definition.update, object) -%> - - -<% settable_properties.each do |prop| -%> -<% if prop.name != "name" && prop.name != "resourceGroupName" && prop.name != "location" -%> -<% output_var = prop.name.camelcase(:lower) -%> +<% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% if prop.name != "location" -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", resource_name, object.azure_sdk_definition.update.request, object)) -%> +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object)) -%> + +<% unless sdk_operation.async -%> + if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { + return <%= build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object) -%> - future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.update) -%> + } +<% else -%> + future, err := <%= build_sdk_func_invocation(sdk_operation) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error updating %s", true, object.azure_sdk_definition.update, properties, object) -%> + return <%= build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return <%= build_errorf_with_resource_name("Error waiting for update of %s", true, object.azure_sdk_definition.update, properties, object) -%> + return <%= build_errorf_with_resource_name("Error waiting for update of %s", true, sdk_operation, properties, object) -%> } +<% end -%> return resource<%= resource_name -%>Read(d, meta) } <% end -%> +<% sdk_operation = object.azure_sdk_definition.delete -%> func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= azure_client_name -%> @@ -258,28 +265,28 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> -<%= build_azure_id_parser(object.azure_sdk_definition.delete, object) -%> +<%= build_azure_id_parser(sdk_operation, object) -%> -<% unless object.azure_sdk_definition.delete.async -%> - if _, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%>; err != nil { - return <%= build_errorf_with_resource_name("Error deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> +<% unless sdk_operation.async -%> + if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { + return <%= build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object) -%> } <% else -%> - future, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.delete) -%> + future, err := <%= build_sdk_func_invocation(sdk_operation) -%> if err != nil { if response.WasNotFound(future.Response()) { return nil } - return <%= build_errorf_with_resource_name("Error deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> + return <%= build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return <%= build_errorf_with_resource_name("Error waiting for deleting %s", true, object.azure_sdk_definition.delete, properties, object) -%> + return <%= build_errorf_with_resource_name("Error waiting for deleting %s", true, sdk_operation, properties, object) -%> } } diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 9bdac0bd31e9..14a545c5a19b 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -37,7 +37,7 @@ -%> <% resource_name = object.name.underscore - properties = object.all_user_properties.reject(&:hide_from_schema) + properties = object.all_user_properties.reject{|p| get_property_value(p, 'hide_from_schema', false)} -%> --- <%= lines(autogen_notice :yaml) -%> diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index be792a182cc1..0e8930a1e52a 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -16,13 +16,13 @@ Optional: true, <% end -%> <% if force_new?(property, object) -%> - ForceNew: true, + ForceNew: true, <% end -%> <% unless property.validation.nil? || property.output -%> <% if !property.validation.regex.nil? -%> - ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), + ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), <% elsif !property.validation.function.nil? -%> - ValidateFunc: <%= property.validation.function -%>, + ValidateFunc: <%= property.validation.function -%>, <% end # property.validation.nil? -%> <% end # property.validation.nil? -%> <% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> @@ -30,11 +30,11 @@ enum_values = property.values # enum_values.push "" unless property.required -%> - ValidateFunc: validation.StringInSlice([]string{ + ValidateFunc: validation.StringInSlice([]string{ <% enum_values.each do |val| -%> - string(<%= azure_resource_go_package(object.__product) -%>.<%= val -%>), + string(<%= azure_resource_go_package(object.__product) -%>.<%= val -%>), <% end -%> - }, false), + }, false), <% end -%> <% if !property.diff_suppress_func.nil? -%> DiffSuppressFunc: <%= property.diff_suppress_func %>, @@ -45,14 +45,14 @@ StateFunc: <%= property.state_func %>, <% end -%> <% if property.is_a?(Api::Type::NestedObject) -%> - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - <% order_properties(property.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ +<% order_properties(property.properties).each do |prop| -%> +<%= lines(build_schema_property(prop, object, 12)) -%> +<% end -%> + }, }, - }, <% elsif property.is_a?(Api::Type::Array) -%> <% unless property.min_size.nil? -%> MinItems: <%= property.min_size %>, From 5378f9be0ae4e85b901feab27dbbdda81f68ef99 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 9 Apr 2019 19:40:45 -0700 Subject: [PATCH 053/175] Change author of BatchAccount (Ansible). --- .../modules/cloud/google/azure_rm_batchaccount.py | 10 +++++----- products/azbatchaccount/ansible.yaml | 4 ++-- templates/ansible/resource.erb | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py index c421184627ba..70575047d4b4 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -1,6 +1,6 @@ #!/usr/bin/python # -# Copyright (C) 2019 Zim Kalinowski (@zikalino) +# Copyright (C) 2019 Junyi Yi (@JunyiYi) # # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) @@ -29,7 +29,7 @@ DOCUMENTATION = ''' --- module: azure_rm_batchaccount -version_added: "2.6" +version_added: "2.9" short_description: Manages a Batch Account on Azure. @@ -93,7 +93,7 @@ - azure author: - - "Zim Kalinowski (@zikalino)" + - "Junyi Yi (@JunyiYi)" ''' EXAMPLES = ''' @@ -205,7 +205,7 @@ def exec_module(self, **kwargs): if hasattr(self, key): setattr(self, key, kwargs[key]) elif kwargs[key] is not None: - self.parameters[key] = kwargs[key] + self.batch_account[key] = kwargs[key] response = None @@ -225,7 +225,7 @@ def exec_module(self, **kwargs): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - if (not default_compare(self.parameters, old_response, '', self.results)): + if (not default_compare(self.batch_account, old_response, '', self.results)): self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index b8da4e8accbb..663dafa330d4 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -7,5 +7,5 @@ manifest: !ruby/object:Provider::Ansible::Manifest requirements: - python >= 2.6 - requests >= 2.18.4 - version_added: '2.6' - author: Zim Kalinowski (@zikalino) + version_added: '2.9' + author: Junyi Yi (@JunyiYi) diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 27ae8b253aeb..4783c853be77 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -23,7 +23,7 @@ __metaclass__ = type input_properties = object.all_user_properties.reject(&:output).sort_by{|p| [p.order, p.name]} output_properties = object.all_user_properties.select(&:output) - root_object_field = object.azure_sdk_definition.create.request["/"].python_parameter_name + root_object_field = object.azure_sdk_definition.create.request["/"].python_variable_name -%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, From 91fb7d838bac725f271a0435072d7b8e8447d44d Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Apr 2019 11:58:57 -0700 Subject: [PATCH 054/175] Refactor prop2sdk to better support custom expand. --- .../cloud/google/azure_rm_batchaccount.py | 4 +-- .../azurerm/resource_arm_batch_account.go | 7 ++-- google/golang_utils.rb | 6 ++-- provider/azure/terraform/helpers.rb | 4 --- provider/azure/terraform/schema.rb | 4 ++- provider/azure/terraform/sdk/helpers.rb | 12 ++----- provider/azure/terraform/sdk/sub_template.rb | 11 +++--- templates/ansible/resource.erb | 4 +-- .../terraform/sdktypes/enum_field_assign.erb | 3 +- .../sdktypes/expand_func_field_assign.erb | 1 + .../sdktypes/nested_object_field_assign.erb | 5 +++ .../sdktypes/property_to_sdkfield_assign.erb | 3 -- .../sdktypes/property_to_sdkobject.erb | 36 +++++++++---------- templates/terraform/resource.erb | 10 ++++-- templates/terraform/schemas/primitive.erb | 7 ++-- 15 files changed, 61 insertions(+), 56 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/nested_object_field_assign.erb delete mode 100644 templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py index 70575047d4b4..e0de6e5652c1 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -22,7 +22,7 @@ __metaclass__ = type ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ["preview"], + 'status': ['preview'], 'supported_by': 'community'} @@ -109,7 +109,7 @@ RETURN = ''' id: description: - - The identifier of the DTL Virtual Machine resource. + - The identifier of the Batch Account resource. returned: always type: str ''' diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 4982a845c6a1..b1c91b58f47b 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -73,7 +73,7 @@ func resourceArmBatchAccount() *schema.Resource { string(batch.BatchService), string(batch.UserSubscription), }, false), - Default: "BatchService", + Default: string(batch.BatchService), }, "tags": tagsSchema(), @@ -102,7 +102,7 @@ func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) err location := azureRMNormalizeLocation(d.Get("location").(string)) autoStorageAccountId := d.Get("auto_storage_account_id").(string) - // TODO: Property 'key_vault_reference' of type Api::Type::NestedObject is not supported + keyVaultReference := d.Get("key_vault_reference").([]interface{}) poolAllocationMode := d.Get("pool_allocation_mode").(string) tags := d.Get("tags").(map[string]interface{}) @@ -112,8 +112,7 @@ func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) err AutoStorage: &batch.AutoStorageBaseProperties{ StorageAccountID: utils.String(autoStorageAccountId), }, - KeyVaultReference: &batch.KeyVaultReference{ - }, + KeyVaultReference: expandArmBatchAccountKeyVaultReference(keyVaultReference), PoolAllocationMode: batch.PoolAllocationMode(poolAllocationMode), }, Tags: expandTags(tags), diff --git a/google/golang_utils.rb b/google/golang_utils.rb index 830a7f06d242..219c9d570210 100644 --- a/google/golang_utils.rb +++ b/google/golang_utils.rb @@ -24,9 +24,11 @@ module GolangUtils # quotes becomes a ruby string without quotes unless you explicitly set # quotes in the string like "\"foo\"" which is not a pattern we want to # see in our yaml config files. - def go_literal(value) - if value.is_a?(String) || value.is_a?(Symbol) + def go_literal(value, go_package = nil) + if value.is_a?(String) "\"#{value}\"" + elsif value.is_a?(Symbol) + "string(#{go_package}#{'.' unless go_package.nil?}#{value})" elsif value.is_a?(Numeric) value.to_s elsif value.is_a?(Array) && value.all? { |v| v.is_a?(String) || v.is_a?(Symbol) } diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index f76f015335db..7298ab650329 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -7,10 +7,6 @@ def get_property_value(obj, prop_name, default_value) obj.instance_variable_get("@#{prop_name}") end - def azure_resource_go_package(product) - product.azure_namespace.split('.').last.downcase - end - def order_azure_properties(properties) special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index dd0fad347aa0..19b9258d04d4 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -11,6 +11,8 @@ def go_type(property) 'string' when Api::Type::KeyValuePairs 'map[string]interface{}' + when Api::Type::NestedObject + '[]interface{}' else 'interface{}' end @@ -51,7 +53,7 @@ def schema_property_get_template(property) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs, Api::Type::NestedObject 'templates/terraform/schemas/basic_get.erb' else 'templates/terraform/schemas/unsupport.erb' diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 083428049b4d..3a4d410fc972 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -30,17 +30,11 @@ def property_to_sdk_field_assignment_template(property, sdk_type) 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_field_assign.erb' - else - 'templates/azure/terraform/sdktypes/unsupport.erb' - end - end - - def property_to_sdk_object_template(sdk_type_defs, api_path) - case sdk_type_defs[api_path] when Api::Azure::SDKTypeDefinition::ComplexObject - 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb' + return 'templates/azure/terraform/sdktypes/nested_object_field_assign.erb' if property.nil? + 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' else - 'templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb' + 'templates/azure/terraform/sdktypes/unsupport.erb' end end diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 88c536c36eea..55c29a46f48e 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -22,16 +22,17 @@ def build_schema_property_set(input, output, property, indentation = 0) property: property end - def build_sdk_field_assignment(property, sdk_type, resource_name, object) - compile_template property_to_sdk_field_assignment_template(property, sdk_type), + def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, object) + compile_template property_to_sdk_field_assignment_template(property, sdk_type_defs[api_path]), property: property, - sdk_type: sdk_type, - resouce_name: resource_name, + api_path: api_path, + sdk_type_defs: sdk_type_defs, + resource_name: resource_name, object: object end def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object, indentation = 4) - compile_template property_to_sdk_object_template(sdk_type_defs, api_path), + compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb', indentation: indentation, resource_name: resource_name, api_path: api_path, diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 4783c853be77..d5cb10000615 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -26,7 +26,7 @@ __metaclass__ = type root_object_field = object.azure_sdk_definition.create.request["/"].python_variable_name -%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, - 'status': <%= @config.manifest.get('status', object) -%>, + 'status': [<%= @config.manifest.get('status', object).map{|item| "'#{item}'"}.join(', ') -%>], 'supported_by': <%= supported_by -%>} @@ -85,7 +85,7 @@ EXAMPLES = ''' RETURN = ''' <%= to_yaml(output_properties.map{|p| returns_for_property(p)}.reduce({ 'id'=> { - 'description' => ['The identifier of the DTL Virtual Machine resource.'], + 'description' => ["The identifier of the #{object.name.titlecase} resource."], 'returned' => 'always', 'type' => 'str', } diff --git a/templates/azure/terraform/sdktypes/enum_field_assign.erb b/templates/azure/terraform/sdktypes/enum_field_assign.erb index 9920e2c48819..035279fd4054 100644 --- a/templates/azure/terraform/sdktypes/enum_field_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_field_assign.erb @@ -1,2 +1,3 @@ -<% sdk_package = azure_resource_go_package(object.__product) -%> +<% sdk_package = object.azure_sdk_definition.go_client_namespace -%> +<% sdk_type = sdk_type_defs[api_path] -%> <%= sdk_type.go_field_name -%>: <%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index e35483681207..e1f8bc0249b6 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,3 +1,4 @@ +<% sdk_type = sdk_type_defs[api_path] -%> <% if expand_funcs.include?(property.class) -%> <%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> diff --git a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb new file mode 100644 index 000000000000..adfabc097c3f --- /dev/null +++ b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb @@ -0,0 +1,5 @@ +<% sdk_package = object.azure_sdk_definition.go_client_namespace -%> +<% sdk_type = sdk_type_defs[api_path] -%> +<%= sdk_type.go_field_name -%>: &<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ +<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object)) -%> +}, \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb b/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb deleted file mode 100644 index e5ca3b954048..000000000000 --- a/templates/azure/terraform/sdktypes/property_to_sdkfield_assign.erb +++ /dev/null @@ -1,3 +0,0 @@ -<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> -<%= lines(build_sdk_field_assignment(property, sdk_type_defs[api_path], resource_name, object)) -%> -<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index ed93ca6c6653..be32cc900e9d 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -1,25 +1,18 @@ <% - sdk_package = azure_resource_go_package(object.__product) + sdk_package = object.azure_sdk_definition.go_client_namespace sdk_type = sdk_type_defs[api_path] - if api_path == "/" --%> -<%= sdk_type.go_variable_name -%> := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ -<% else -%> -<%= sdk_type.go_field_name -%>: &<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ -<% - end direct_children = Set.new object.all_user_properties.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| - if api_path == "/" && child_api_path.start_with?(api_path) - sub_paths = child_api_path.split("/") - api_path = "" - elsif child_api_path.start_with?(api_path + "/") - sub_paths = child_api_path[api_path.length..-1].split("/") + if api_path == '/' && child_api_path.start_with?(api_path) + sub_paths = child_api_path.split('/') + api_path = '' + elsif child_api_path.start_with?(api_path + '/') + sub_paths = child_api_path[api_path.length..-1].split('/') end - if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" - sub_api_path = api_path + "/" + sub_paths[1] + if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == '' + sub_api_path = api_path + '/' + sub_paths[1] direct_children << sub_api_path if sub_paths.length > 2 direct_children << child_api_path if sub_paths.length == 2 end @@ -27,7 +20,14 @@ end direct_children.to_a.sort.each do |child_api_path| + matched_properties = get_properties_matching_sdk_reference(child_api_path, object) +-%> +<%= lines(build_sdk_field_assignment(nil, child_api_path, sdk_type_defs, resource_name, object)) if matched_properties.empty? -%> +<% + matched_properties.each do |property| -%> -<%= lines(build_property_to_sdk_object(child_api_path, resource_name, sdk_type_defs, object)) -%> -<% end -%> -}<%= "," unless api_path == "" -%> \ No newline at end of file +<%= lines(build_sdk_field_assignment(property, child_api_path, sdk_type_defs, resource_name, object)) -%> +<% + end + end +-%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index c724e42c73db..d795b57ebb38 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -36,7 +36,7 @@ package azurerm -%> <% azure_client_name = object.azure_sdk_definition.go_client - sdk_package = azure_resource_go_package(object.__product) + sdk_package = object.azure_sdk_definition.go_client_namespace -%> <% combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.go_func_name == object.azure_sdk_definition.update.go_func_name) @@ -128,7 +128,9 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object)) -%> + <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object, 8)) -%> + } <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") @@ -226,7 +228,9 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <% end -%> -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object)) -%> + <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object, 8)) -%> + } <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index 0e8930a1e52a..d98c4554b4b6 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -1,3 +1,6 @@ +<% + sdk_package = object.azure_sdk_definition.go_client_namespace +-%> <% if tf_types.include?(property.class) -%> "<%= property.name.underscore -%>": { <% if property.is_set -%> @@ -32,7 +35,7 @@ -%> ValidateFunc: validation.StringInSlice([]string{ <% enum_values.each do |val| -%> - string(<%= azure_resource_go_package(object.__product) -%>.<%= val -%>), + <%= go_literal(val, sdk_package) -%>, <% end -%> }, false), <% end -%> @@ -117,7 +120,7 @@ Sensitive: true, <% end -%> <% unless property.default_value.nil? -%> - Default: <%= go_literal(property.default_value) -%>, + Default: <%= go_literal(property.default_value, sdk_package) -%>, <% end -%> <% unless property.conflicts_with.empty? -%> ConflictsWith: []string{<%= property.conflicts_with.map{ |p| go_literal(p) }.join(', ') -%>}, From 3ec2575cbb84a908c8b71a291dbcc4cbc644e6a4 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Apr 2019 15:18:03 -0700 Subject: [PATCH 055/175] Add expand NestedObject feature to Terraform. --- .../azurerm/resource_arm_batch_account.go | 16 +++++ provider/azure/terraform.rb | 1 + .../sdk/expand_flatten_descriptor.rb | 21 ++++++ provider/azure/terraform/sdk/helpers.rb | 14 ++-- provider/azure/terraform/sdk/sub_template.rb | 11 +++- provider/terraform/sub_template.rb | 8 ++- .../sdktypes/expand_func_field_assign.erb | 1 + .../sdktypes/nested_object_field_assign.erb | 2 +- .../sdktypes/property_to_sdkobject.erb | 8 +-- .../sdktypes/sdkenum_to_property.erb | 2 +- .../sdktypes/sdkobject_to_property.erb | 2 +- .../sdktypes/sdkprimitive_to_property.erb | 2 +- .../terraform/expand_property_method.erb | 66 ++++++++----------- templates/terraform/resource.erb | 21 ++++-- 14 files changed, 113 insertions(+), 62 deletions(-) create mode 100644 provider/azure/terraform/sdk/expand_flatten_descriptor.rb diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index b1c91b58f47b..8144b8791d0b 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -233,3 +233,19 @@ func resourceArmBatchAccountDelete(d *schema.ResourceData, meta interface{}) err return nil } + +func expandArmBatchAccountKeyVaultReference(input []interface{}) *batch.KeyVaultReference { + if len(input) == 0 { + return nil + } + v := input[0].(map[string]interface{}) + + id := v["id"].(string) + url := v["url"].(string) + + result := batch.KeyVaultReference{ + ID: utils.String(id), + URL: utils.String(url), + } + return &result +} diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 7bc255eb7e12..03577769c772 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,6 +1,7 @@ require 'provider/azure/terraform/helpers' require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform/sdk/expand_flatten_descriptor' require 'provider/azure/terraform/sdk/sub_template' require 'provider/azure/terraform/sdk/helpers' require 'provider/azure/terraform/example/example' diff --git a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb new file mode 100644 index 000000000000..de9875bf155a --- /dev/null +++ b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb @@ -0,0 +1,21 @@ +module Provider + module Azure + module Terraform + module SDK + class ExpandFlattenDescriptor + attr_reader :property + attr_reader :api_path + attr_reader :sdk_type + attr_reader :sdk_type_defs + + def initialize(property, api_path, sdk_type_defs) + @property = property + @api_path = api_path + @sdk_type_defs = sdk_type_defs + @sdk_type = sdk_type_defs[api_path] + end + end + end + end + end +end \ No newline at end of file diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 3a4d410fc972..895541c734a8 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -1,12 +1,12 @@ +require 'provider/azure/terraform/sdk/expand_flatten_descriptor' + module Provider module Azure module Terraform module SDK module Helpers - def get_properties_matching_sdk_reference(sdk_reference, object) - object.all_user_properties - .select{|p| p.azure_sdk_references.include?(sdk_reference)} - .sort_by{|p| [p.order, p.name]} + def get_properties_matching_sdk_reference(properties, sdk_reference, object) + properties.select{|p| p.azure_sdk_references.include?(sdk_reference)}.sort_by{|p| [p.order, p.name]} end def get_applicable_reference(references, typedefs) @@ -22,6 +22,12 @@ def get_sdk_typedef_by_references(references, typedefs) typedefs[ref] end + def expand_enqueue(expand_queue, property, api_path, sdk_type_defs) + sdk_type = sdk_type_defs[api_path] + existed = expand_queue.any?{|exp| exp.property == property && exp.sdk_type.go_type_name == sdk_type.go_type_name} + expand_queue << ExpandFlattenDescriptor.new(property, api_path, sdk_type_defs) unless existed + end + def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 55c29a46f48e..8b193a7f0e7a 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -22,30 +22,35 @@ def build_schema_property_set(input, output, property, indentation = 0) property: property end - def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, object) + def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, expand_queue, properties, object) compile_template property_to_sdk_field_assignment_template(property, sdk_type_defs[api_path]), property: property, api_path: api_path, sdk_type_defs: sdk_type_defs, resource_name: resource_name, + expand_queue: expand_queue, + properties: properties, object: object end - def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object, indentation = 4) + def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb', indentation: indentation, resource_name: resource_name, api_path: api_path, sdk_type_defs: sdk_type_defs, + expand_queue: expand_queue, + properties: properties, object: object end - def build_sdk_object_to_property(input, api_path, sdk_type_defs, object, indentation = 4) + def build_sdk_object_to_property(input, api_path, sdk_type_defs, properties, object, indentation = 4) compile_template sdk_object_to_property_template(sdk_type_defs, api_path), indentation: indentation, input_statement: input, api_path: api_path, sdk_type_defs: sdk_type_defs, + properties: properties, object: object end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 206dcefb9131..11bc365cb077 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -35,10 +35,14 @@ def build_flatten_method(prefix, property) # Transforms a Terraform schema representation of a property into a # representation used by the Cloud API. - def build_expand_method(prefix, property) + def build_expand_method(prefix, property, api_path, sdk_type_defs, expand_queue, object) compile_template 'templates/terraform/expand_property_method.erb', prefix: prefix, - property: property + property: property, + sdk_type_defs: sdk_type_defs, + api_path: api_path, + expand_queue: expand_queue, + object: object end def build_expand_resource_ref(var_name, property) diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index e1f8bc0249b6..0fcd53244101 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -2,5 +2,6 @@ <% if expand_funcs.include?(property.class) -%> <%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> +<% expand_enqueue(expand_queue, property, api_path, sdk_type_defs) -%> <%= sdk_type.go_field_name -%>: expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb index adfabc097c3f..5ec2874e3522 100644 --- a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb +++ b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb @@ -1,5 +1,5 @@ <% sdk_package = object.azure_sdk_definition.go_client_namespace -%> <% sdk_type = sdk_type_defs[api_path] -%> <%= sdk_type.go_field_name -%>: &<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ -<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, object)) -%> +<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object)) -%> }, \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index be32cc900e9d..e3c2cd3f09f3 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -3,7 +3,7 @@ sdk_type = sdk_type_defs[api_path] direct_children = Set.new - object.all_user_properties.each do |prop| + properties.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == '/' && child_api_path.start_with?(api_path) sub_paths = child_api_path.split('/') @@ -20,13 +20,13 @@ end direct_children.to_a.sort.each do |child_api_path| - matched_properties = get_properties_matching_sdk_reference(child_api_path, object) + matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) -%> -<%= lines(build_sdk_field_assignment(nil, child_api_path, sdk_type_defs, resource_name, object)) if matched_properties.empty? -%> +<%= lines(build_sdk_field_assignment(nil, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) if matched_properties.empty? -%> <% matched_properties.each do |property| -%> -<%= lines(build_sdk_field_assignment(property, child_api_path, sdk_type_defs, resource_name, object)) -%> +<%= lines(build_sdk_field_assignment(property, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) -%> <% end end diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb index c8ece6725839..1f399d26301a 100644 --- a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkenum_to_property.erb @@ -1,4 +1,4 @@ <% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> -<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> +<% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> <%= lines(build_schema_property_set(input_var, 'd', property)) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 36b4e8dd6c84..fc18273b8df9 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -27,6 +27,6 @@ if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; < direct_children.each do |child_api_path| -%> -<%= lines(build_sdk_object_to_property(temp_var, child_api_path, sdk_type_defs, object)) -%> +<%= lines(build_sdk_object_to_property(temp_var, child_api_path, sdk_type_defs, properties, object)) -%> <% end -%> <%= "}" unless api_path == "" -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb index 54faf0f435b0..0b7e8f32d6b9 100644 --- a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb @@ -1,5 +1,5 @@ <% sdk_type = sdk_type_defs[api_path] -%> <% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> -<% get_properties_matching_sdk_reference(api_path, object).each do |property| -%> +<% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> <%= lines(build_schema_property_set(input_var, 'd', property)) -%> <% end -%> \ No newline at end of file diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index a60e935081ba..c6c3abaa2eaa 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -12,6 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> +<% + resource_name = "Arm" + object.name + sdk_package = object.azure_sdk_definition.go_client_namespace + sdk_type = sdk_type_defs[api_path] +-%> <% if property.custom_expand -%> <%= lines(compile_template(property.custom_expand, prefix: prefix, @@ -44,7 +49,7 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d * <% nested_properties(property.value_type).each do |prop| -%> <% next if prop.name == property.key_name -%> -<%= lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> +<%# lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { @@ -58,55 +63,40 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d * return m, nil } <% elsif tf_types.include?(property.class) -%> -func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (interface{}, error) { -<% if property.is_set -%> - v = v.(*schema.Set).List() -<% end -%> +func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type(property) -%>) *<%= sdk_package -%>.<%= sdk_type.go_type_name -%> { <% if !nested_properties(property).empty? nested_properties = nested_properties(property) -%> - l := v.([]interface{}) -<% if property.is_a?(Api::Type::Array) -%> - req := make([]interface{}, 0, len(l)) - for _, raw := range l { - if raw == nil { - continue +<% if property.is_set -%> + v := input.(*schema.Set).List() +<% elsif property.is_a?(Api::Type::NestedObject) -%> + if len(input) == 0 { + return nil } -<% else -%> - if len(l) == 0 || l[0] == nil{ - return nil, nil - } - raw := l[0] -<% end -%> - original := raw.(map[string]interface{}) - transformed := make(map[string]interface{}) + v := input[0].(map[string]interface{}) -<% nested_properties.each do |prop| -%> - transformed<%= titlelize_property(prop) -%>, err := expand<%= prefix -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.name.underscore -%>"], d, config) - if err != nil { - return nil, err -<% unless prop.send_empty_value -%> - } else if val := reflect.ValueOf(transformed<%= titlelize_property(prop) -%>); val.IsValid() && !isEmptyValue(val) { - transformed["<%= prop.api_name -%>"] = transformed<%= titlelize_property(prop) -%> -<% else -%> - } else { - transformed["<%= prop.api_name -%>"] = transformed<%= titlelize_property(prop) -%> +<% nested_properties.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_type_defs).go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('v', output_var, prop, object, 4)) -%> <% end -%> - } -<% end -%> -<% if property.is_a?(Api::Type::Array) -%> - req = append(req, transformed) - } - return req, nil -<% else -%> - return transformed, nil + result := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ +<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, nested_properties, object, 8)) -%> + } + return &result +<% elsif property.is_a?(Api::Type::Array) -%> + result := make([]<%= sdk_package -%>.<%= sdk_type.go_type_name -%>, 0) + for _, v := range input { + result = append(results, ??) + } + return result <% end -%> } <% nested_properties.each do |prop| -%> -<%= lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> +<%# lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%> l := v.([]interface{}) diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index d795b57ebb38..e011ee83f141 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -19,8 +19,6 @@ package azurerm <%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> <% - resource_name = "Arm" + object.name - terraform_name = "azurerm_" + object.name.underscore properties = object.all_user_properties # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. @@ -35,10 +33,14 @@ package azurerm has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> <% + resource_name = "Arm" + object.name + terraform_name = "azurerm_" + object.name.underscore azure_client_name = object.azure_sdk_definition.go_client sdk_package = object.azure_sdk_definition.go_client_namespace --%> -<% + + expand_queue = Array.new + flatten_queue = Array.new + combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.go_func_name == object.azure_sdk_definition.update.go_func_name) create_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Create") update_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Update") @@ -129,7 +131,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% end -%> <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object, 8)) -%> +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, settable_properties, object, 8)) -%> } <% if object.mutex -%> @@ -208,7 +210,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) resource_name: resource_name) -%> <% end -%> -<%= lines(build_sdk_object_to_property("resp", "", object.azure_sdk_definition.read.response, object, 0)) -%> +<%= lines(build_sdk_object_to_property("resp", "", object.azure_sdk_definition.read.response, properties, object, 0)) -%> return nil } @@ -229,7 +231,7 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% end -%> <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, object, 8)) -%> +<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, updatable_properties, object, 8)) -%> } <% unless sdk_operation.async -%> @@ -298,3 +300,8 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ return nil } + +<% while !expand_queue.empty? -%> +<% descriptor = expand_queue.shift -%> +<%= lines(build_expand_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, expand_queue, object)) -%> +<% end -%> \ No newline at end of file From 264bf9554805b09c93b0ff60864e123e15bd28aa Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Apr 2019 17:47:46 -0700 Subject: [PATCH 056/175] Support nested object flatten in Terraform. --- .../azurerm/resource_arm_batch_account.go | 27 +++++- products/azbatchaccount/api.yaml | 1 + provider/azure/terraform/schema.rb | 2 + provider/azure/terraform/sdk/helpers.rb | 18 ++-- provider/azure/terraform/sdk/sub_template.rb | 35 +++++-- provider/terraform/sub_template.rb | 8 +- ...to_property.erb => enum_schema_assign.erb} | 2 +- .../sdktypes/expand_func_field_assign.erb | 2 +- .../sdktypes/nested_object_schema_assign.erb | 7 ++ ...operty.erb => primitive_schema_assign.erb} | 2 +- .../sdktypes/property_to_sdkobject.erb | 4 +- .../sdktypes/sdkobject_to_property.erb | 20 ++-- .../terraform/expand_property_method.erb | 8 +- .../terraform/flatten_property_method.erb | 28 +++--- templates/terraform/resource.erb | 92 +++++++------------ templates/terraform/schemas/basic_set.erb | 2 +- templates/terraform/schemas/flatten_set.erb | 8 ++ 17 files changed, 146 insertions(+), 120 deletions(-) rename templates/azure/terraform/sdktypes/{sdkenum_to_property.erb => enum_schema_assign.erb} (62%) create mode 100644 templates/azure/terraform/sdktypes/nested_object_schema_assign.erb rename templates/azure/terraform/sdktypes/{sdkprimitive_to_property.erb => primitive_schema_assign.erb} (65%) create mode 100644 templates/terraform/schemas/flatten_set.erb diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 8144b8791d0b..53c329ed6c01 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -162,18 +162,18 @@ func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error } - d.Set("name", resp.Name) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - if accountProperties := resp.AccountProperties; accountProperties != nil { - if autoStorage := accountProperties.AutoStorage; autoStorage != nil { + if properties := resp.AccountProperties; properties != nil { + if autoStorage := properties.AutoStorage; autoStorage != nil { d.Set("auto_storage_account_id", autoStorage.StorageAccountID) } - if keyVaultReference := accountProperties.KeyVaultReference; keyVaultReference != nil { + if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { + return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) } - d.Set("pool_allocation_mode", string(accountProperties.PoolAllocationMode)) + d.Set("pool_allocation_mode", string(properties.PoolAllocationMode)) } flattenAndSetTags(d, resp.Tags) @@ -249,3 +249,20 @@ func expandArmBatchAccountKeyVaultReference(input []interface{}) *batch.KeyVault } return &result } + +func flattenArmBatchAccountKeyVaultReference(input *batch.KeyVaultReference) []interface{} { + if input == nil { + return make([]interface{}, 0) + } + + result := make(map[string]interface{}) + + if id := input.ID; id != nil { + result["id"] = *id + } + if url := input.URL; url != nil { + result["url"] = *url + } + + return []interface{}{result} +} diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index b817d20476ae..32111eabc5e9 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -87,6 +87,7 @@ objects: '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_field_name: AccountProperties go_type_name: AccountProperties + go_variable_name: properties '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: AccountEndpoint '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 19b9258d04d4..d4439a74762a 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -70,6 +70,8 @@ def schema_property_set_template(property) 'templates/azure/terraform/schemas/tags_set.erb' when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs 'templates/terraform/schemas/basic_set.erb' + when Api::Type::NestedObject + 'templates/terraform/schemas/flatten_set.erb' else 'templates/terraform/schemas/unsupport.erb' end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 895541c734a8..cff7554a7375 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -22,7 +22,7 @@ def get_sdk_typedef_by_references(references, typedefs) typedefs[ref] end - def expand_enqueue(expand_queue, property, api_path, sdk_type_defs) + def expand_or_flatten_enqueue(expand_queue, property, api_path, sdk_type_defs) sdk_type = sdk_type_defs[api_path] existed = expand_queue.any?{|exp| exp.property == property && exp.sdk_type.go_type_name == sdk_type.go_type_name} expand_queue << ExpandFlattenDescriptor.new(property, api_path, sdk_type_defs) unless existed @@ -43,16 +43,16 @@ def property_to_sdk_field_assignment_template(property, sdk_type) 'templates/azure/terraform/sdktypes/unsupport.erb' end end - - def sdk_object_to_property_template(sdk_type_defs, api_path) - return 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' if api_path == "" - case sdk_type_defs[api_path] + + def property_to_schema_assignment_template(property, sdk_type) + case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject - 'templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb' + 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject - 'templates/azure/terraform/sdktypes/sdkenum_to_property.erb' + 'templates/azure/terraform/sdktypes/enum_schema_assign.erb' when Api::Azure::SDKTypeDefinition::ComplexObject - 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb' + return 'templates/azure/terraform/sdktypes/nested_object_schema_assign.erb' if property.nil? + 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' else 'templates/azure/terraform/sdktypes/unsupport.erb' end @@ -61,4 +61,4 @@ def sdk_object_to_property_template(sdk_type_defs, api_path) end end end -end +end \ No newline at end of file diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 8b193a7f0e7a..82af7ce8c444 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -12,16 +12,20 @@ def build_schema_property_get(input, output, property, object, indentation = 0) property: property, object: object end - - def build_schema_property_set(input, output, property, indentation = 0) + + def build_schema_property_set(input, output, api_path, sdk_type_defs, resource_name, flatten_queue, property, indentation = 0) compile_template schema_property_set_template(property), indentation: indentation, input_var: input, output_var: output, + api_path: api_path, + sdk_type_defs: sdk_type_defs, prop_name: property.name.underscore, - property: property + property: property, + resource_name: resource_name, + flatten_queue: flatten_queue end - + def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, expand_queue, properties, object) compile_template property_to_sdk_field_assignment_template(property, sdk_type_defs[api_path]), property: property, @@ -43,17 +47,32 @@ def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_ properties: properties, object: object end - - def build_sdk_object_to_property(input, api_path, sdk_type_defs, properties, object, indentation = 4) - compile_template sdk_object_to_property_template(sdk_type_defs, api_path), + + def build_schema_assignment(input, output, property, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object) + compile_template property_to_schema_assignment_template(property, sdk_type_defs[api_path]), + input_statement: input, + output: output, + api_path: api_path, + sdk_type_defs: sdk_type_defs, + resource_name: resource_name, + flatten_queue: flatten_queue, + properties: properties, + object: object + end + + def build_sdk_object_to_property(input, output, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object, indentation = 4) + compile_template 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb', indentation: indentation, input_statement: input, + output: output, api_path: api_path, sdk_type_defs: sdk_type_defs, + resource_name: resource_name, + flatten_queue: flatten_queue, properties: properties, object: object end - + def build_sdk_func_invocation(sdk_op_def) compile_template 'templates/azure/terraform/sdk/function_invocation.erb', sdk_op_def: sdk_op_def diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 11bc365cb077..543f2c05a4ee 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -27,10 +27,14 @@ def build_schema_property(property, object, indentation = 0) # Transforms a Cloud API representation of a property into a Terraform # schema representation. - def build_flatten_method(prefix, property) + def build_flatten_method(prefix, property, api_path, sdk_type_defs, flatten_queue, object) compile_template 'templates/terraform/flatten_property_method.erb', prefix: prefix, - property: property + property: property, + sdk_type_defs: sdk_type_defs, + api_path: api_path, + flatten_queue: flatten_queue, + object: object end # Transforms a Terraform schema representation of a property into a diff --git a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb b/templates/azure/terraform/sdktypes/enum_schema_assign.erb similarity index 62% rename from templates/azure/terraform/sdktypes/sdkenum_to_property.erb rename to templates/azure/terraform/sdktypes/enum_schema_assign.erb index 1f399d26301a..285970c3238e 100644 --- a/templates/azure/terraform/sdktypes/sdkenum_to_property.erb +++ b/templates/azure/terraform/sdktypes/enum_schema_assign.erb @@ -1,4 +1,4 @@ <% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> <% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> -<%= lines(build_schema_property_set(input_var, 'd', property)) -%> +<%= lines(build_schema_property_set(input_var, 'd', api_path, sdk_type_defs, resource_name, flatten_queue, property)) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 0fcd53244101..14bcea575c2c 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -2,6 +2,6 @@ <% if expand_funcs.include?(property.class) -%> <%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), <% else -%> -<% expand_enqueue(expand_queue, property, api_path, sdk_type_defs) -%> +<% expand_or_flatten_enqueue(expand_queue, property, api_path, sdk_type_defs) -%> <%= sdk_type.go_field_name -%>: expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb new file mode 100644 index 000000000000..174980f202d3 --- /dev/null +++ b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb @@ -0,0 +1,7 @@ +<% + sdk_type = sdk_type_defs[api_path] + temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) || input_statement +-%> +if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { +<%= lines(build_sdk_object_to_property(temp_var, output, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) -%> +} \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb similarity index 65% rename from templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb rename to templates/azure/terraform/sdktypes/primitive_schema_assign.erb index 0b7e8f32d6b9..2fb0a2490d81 100644 --- a/templates/azure/terraform/sdktypes/sdkprimitive_to_property.erb +++ b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb @@ -1,5 +1,5 @@ <% sdk_type = sdk_type_defs[api_path] -%> <% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> <% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> -<%= lines(build_schema_property_set(input_var, 'd', property)) -%> +<%= lines(build_schema_property_set(input_var, output, api_path, sdk_type_defs, resource_name, flatten_queue, property)) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index e3c2cd3f09f3..0ddeeff83a80 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -23,9 +23,7 @@ matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) -%> <%= lines(build_sdk_field_assignment(nil, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) if matched_properties.empty? -%> -<% - matched_properties.each do |property| --%> +<% matched_properties.each do |property| -%> <%= lines(build_sdk_field_assignment(property, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) -%> <% end diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index fc18273b8df9..99bfbcdda4f8 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -1,15 +1,6 @@ <% - temp_var = input_statement - unless api_path == "" - sdk_type = sdk_type_defs[api_path] - temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) --%> -if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { -<% - end - direct_children = Set.new - object.all_user_properties.sort_by{|p| [p.order, p.name]}.each do |prop| + properties.sort_by{|p| [p.order, p.name]}.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == "" sub_paths = child_api_path.split("/") @@ -26,7 +17,10 @@ if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; < end direct_children.each do |child_api_path| + matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) -%> -<%= lines(build_sdk_object_to_property(temp_var, child_api_path, sdk_type_defs, properties, object)) -%> -<% end -%> -<%= "}" unless api_path == "" -%> \ No newline at end of file +<%= lines(build_schema_assignment(input_statement, output, nil, child_api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) if matched_properties.empty? -%> +<% matched_properties.each do |property| -%> +<%= lines(build_schema_assignment(input_statement, output, property, child_api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) -%> +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index c6c3abaa2eaa..b54d94ca1372 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -87,11 +87,13 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type( } return &result <% elsif property.is_a?(Api::Type::Array) -%> - result := make([]<%= sdk_package -%>.<%= sdk_type.go_type_name -%>, 0) + results := make([]<%= sdk_package -%>.<%= sdk_type.go_type_name -%>, 0) for _, v := range input { - result = append(results, ??) + // TODO: Implement Array Expand + item := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{} + results = append(results, item) } - return result + return results <% end -%> } diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index dbab7319546b..8ecc584ed2fe 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -12,24 +12,28 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> +<% + resource_name = "Arm" + object.name + sdk_package = object.azure_sdk_definition.go_client_namespace + sdk_type = sdk_type_defs[api_path] +-%> <% if property.custom_flatten -%> <%= lines(compile_template(property.custom_flatten, prefix: prefix, property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= prefix -%><%= titlelize_property(property) -%>(v interface{}) interface{} { +func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_package -%>.<%= sdk_type.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> - if v == nil { - return nil - } - original := v.(map[string]interface{}) - transformed := make(map[string]interface{}) - <% property.properties.each do |prop| -%> - transformed["<%= prop.name.underscore -%>"] = - flatten<%= prefix -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]) - <% end -%> - return []interface{}{transformed} + if input == nil { + return make([]interface{}, 0) + } + + result := make(map[string]interface{}) + +<%= lines(build_sdk_object_to_property('input', 'result', api_path, sdk_type_defs, resource_name, flatten_queue, nested_properties(property), object)) -%> + + return []interface{}{result} <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) -%> if v == nil { return v @@ -95,7 +99,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(v interface{}) in } <% if !nested_properties(property).empty? -%> <% nested_properties(property).each do |prop| -%> - <%= lines(build_flatten_method(prefix + titlelize_property(property), prop), 1) -%> + <%# lines(build_flatten_method(prefix + titlelize_property(property), prop), 1) -%> <% end -%> <% end -%> <% else -%> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e011ee83f141..861da23a4df5 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -100,8 +100,7 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff <% sdk_operation = object.azure_sdk_definition.create -%> func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= azure_client_name -%> - + client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext <% settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> @@ -111,12 +110,10 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% end -%> if requireResourcesToBeImported { - resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> - + resp, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> if err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return <%= build_errorf_with_resource_name("Error checking for present of existing %s", true, object.azure_sdk_definition.read, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error checking for present of existing %s", true, object.azure_sdk_definition.read, properties, object)) -%> } } if !utils.ResponseWasNotFound(resp.Response) { @@ -145,33 +142,26 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { - return <%= build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object)) -%> } <% else -%> - future, err := <%= build_sdk_func_invocation(sdk_operation) -%> - + future, err := <%= lines(build_sdk_func_invocation(sdk_operation)) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error creating %s", true, sdk_operation, properties, object)) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return <%= build_errorf_with_resource_name("Error waiting for creation of %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error waiting for creation of %s", true, sdk_operation, properties, object)) -%> } <% end -%> <%= lines(compile(object.custom_code.post_create)) if object.custom_code.post_create -%> - resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> - + resp, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error retrieving %s", true, object.azure_sdk_definition.read, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error retrieving %s", true, object.azure_sdk_definition.read, properties, object)) -%> } if resp.ID == nil { - return <%= build_errorf_with_resource_name("Cannot read %s ID", false, object.azure_sdk_definition.read, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Cannot read %s ID", false, object.azure_sdk_definition.read, properties, object)) -%> } d.SetId(*resp.ID) @@ -179,38 +169,24 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res } func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= azure_client_name -%> - + client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext -<%= build_azure_id_parser(object.azure_sdk_definition.read, object) -%> - - - resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%> +<%= lines(build_azure_id_parser(object.azure_sdk_definition.read, object)) -%> + resp, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> if err != nil { if utils.ResponseWasNotFound(resp.Response) { log.Printf("[INFO] <%= object.name.titlecase -%> %q does not exist - removing from state", d.Id()) d.SetId("") return nil } - return <%= build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, properties, object)) -%> } <%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> -<% unless object.self_link_query.nil? -%> -<%# This part of the template extracts the one resource we're interested in - from the list that gets returned. self_link_query is a field which - describes a list result from a read. -%> -<%= compile_template('templates/terraform/self_link_query.erb', - object: object, - settable_properties: settable_properties, - resource_name: resource_name) -%> -<% end -%> - -<%= lines(build_sdk_object_to_property("resp", "", object.azure_sdk_definition.read.response, properties, object, 0)) -%> +<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read.response, resource_name, flatten_queue, properties, object)) -%> return nil } @@ -218,8 +194,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% if !combine_create_update -%> <% sdk_operation = object.azure_sdk_definition.update -%> func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= azure_client_name -%> - + client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext <% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> @@ -236,19 +211,15 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { - return <%= build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object)) -%> } <% else -%> - future, err := <%= build_sdk_func_invocation(sdk_operation) -%> - + future, err := <%= lines(build_sdk_func_invocation(sdk_operation)) -%> if err != nil { - return <%= build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object)) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return <%= build_errorf_with_resource_name("Error waiting for update of %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error waiting for update of %s", true, sdk_operation, properties, object)) -%> } <% end -%> @@ -258,8 +229,7 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% sdk_operation = object.azure_sdk_definition.delete -%> func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= azure_client_name -%> - + client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext <% if object.mutex -%> @@ -271,29 +241,24 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ defer mutexKV.Unlock(lockName) <% end -%> -<%= build_azure_id_parser(sdk_operation, object) -%> - +<%= lines(build_azure_id_parser(sdk_operation, object)) -%> <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { - return <%= build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object)) -%> } <% else -%> - future, err := <%= build_sdk_func_invocation(sdk_operation) -%> - + future, err := <%= lines(build_sdk_func_invocation(sdk_operation)) -%> if err != nil { if response.WasNotFound(future.Response()) { return nil } - return <%= build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error deleting %s", true, sdk_operation, properties, object)) -%> } if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { if !response.WasNotFound(future.Response()) { - return <%= build_errorf_with_resource_name("Error waiting for deleting %s", true, sdk_operation, properties, object) -%> - + return <%= lines(build_errorf_with_resource_name("Error waiting for deleting %s", true, sdk_operation, properties, object)) -%> } } <% end -%> @@ -304,4 +269,9 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% while !expand_queue.empty? -%> <% descriptor = expand_queue.shift -%> <%= lines(build_expand_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, expand_queue, object)) -%> +<% end -%> + +<% while !flatten_queue.empty? -%> +<% descriptor = flatten_queue.shift -%> +<%= lines(build_flatten_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, flatten_queue, object)) -%> <% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/basic_set.erb b/templates/terraform/schemas/basic_set.erb index a00950e2a92c..3c370120f766 100644 --- a/templates/terraform/schemas/basic_set.erb +++ b/templates/terraform/schemas/basic_set.erb @@ -3,6 +3,6 @@ d.Set("<%= prop_name -%>", <%= input_var -%>) <% else -%> <% temp_var = prop_name.camelize(:lower) -%> if <%= temp_var -%> := <%= input_var -%>; <%= temp_var -%> != nil { - <%= output_var -%>["<%= prop_name -%>"] = *<%= temp_var -%> + <%= output_var -%>["<%= prop_name -%>"] = *<%= lines(temp_var) -%> } <% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/flatten_set.erb b/templates/terraform/schemas/flatten_set.erb new file mode 100644 index 000000000000..17e91757df03 --- /dev/null +++ b/templates/terraform/schemas/flatten_set.erb @@ -0,0 +1,8 @@ +<% expand_or_flatten_enqueue(flatten_queue, property, api_path, sdk_type_defs) -%> +<% if output_var == 'd' -%> +if err := d.Set("<%= prop_name -%>", flatten<%= resource_name -%><%= titlelize_property(property) -%>(<%= input_var -%>)); err != nil { + return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) +} +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = flatten<%= resource_name -%><%= titlelize_property(property) -%>(<%= input_var -%>) +<% end -%> \ No newline at end of file From 7cf0d81a48e37d26c9b2e5f82f37dba578d57d07 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 11 Apr 2019 15:50:08 -0700 Subject: [PATCH 057/175] Fix Ansible linting issues. --- .../cloud/google/azure_rm_batchaccount.py | 36 ++++++++----------- .../azure_rm_batchaccount/tasks/main.yml | 10 +++--- google/python_utils.rb | 4 ++- products/azbatchaccount/ansible.yaml | 7 +++- .../examples/ansible/batch_account.yaml | 2 +- provider/ansible/documentation.rb | 6 ++-- provider/ansible/module.rb | 2 +- provider/azure/ansible.rb | 4 ++- provider/azure/ansible/helpers.rb | 17 +++++++++ templates/ansible/resource.erb | 23 ++++++++---- 10 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 provider/azure/ansible/helpers.rb diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py index e0de6e5652c1..c054e1955f60 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py @@ -29,7 +29,7 @@ DOCUMENTATION = ''' --- module: azure_rm_batchaccount -version_added: "2.9" +version_added: "2.8" short_description: Manages a Batch Account on Azure. @@ -49,14 +49,12 @@ description: - Specifies the supported Azure location where the resource exists. required: true - auto_storage_account_id: + auto_storage_account: description: - The ID of the Batch Account auto storage account. - required: false key_vault_reference: description: - A reference to the Azure key vault associated with the Batch account. - required: false suboptions: id: description: @@ -70,15 +68,10 @@ pool_allocation_mode: description: - The pool acclocation mode of the Batch Account. - required: false - default: BatchService + default: batch_service choices: - - BatchService - - UserSubscription - tags: - description: - - A mapping of tags to assign to the batch account. - required: false + - batch_service + - user_subscription state: description: - Assert the state of the Batch Account. @@ -91,6 +84,7 @@ extends_documentation_fragment: - azure + - azure_tags author: - "Junyi Yi (@JunyiYi)" @@ -102,7 +96,7 @@ resource_group: MyResGroup name: "test_object" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: present ''' @@ -132,6 +126,7 @@ class Actions: NoAction, Create, Update, Delete = range(4) + class AzureRMBatchAccount(AzureRMModuleBase): """Configuration class for an Azure RM Batch Account resource""" @@ -149,7 +144,7 @@ def __init__(self): required=True, type='str' ), - auto_storage_account_id=dict( + auto_storage_account=dict( type='str' ), key_vault_reference=dict( @@ -166,12 +161,9 @@ def __init__(self): ) ), pool_allocation_mode=dict( - default='BatchService', + default='batch_service', type='str', - choices=['BatchService', 'UserSubscription'] - ), - tags=dict( - type='str' + choices=['batch_service', 'user_subscription'] ), state=dict( type='str', @@ -206,6 +198,7 @@ def exec_module(self, **kwargs): setattr(self, key, kwargs[key]) elif kwargs[key] is not None: self.batch_account[key] = kwargs[key] + self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None @@ -226,7 +219,7 @@ def exec_module(self, **kwargs): self.to_do = Actions.Delete elif self.state == 'present': if (not default_compare(self.batch_account, old_response, '', self.results)): - self.to_do = Actions.Update + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the Batch Account instance") @@ -306,7 +299,7 @@ def get_batchaccount(self): :return: deserialized Batch Account instance state dictionary ''' self.log("Checking if the Batch Account instance {0} is present".format(self.name)) - found = false + found = False try: response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, name=self.name) @@ -324,5 +317,6 @@ def main(): """Main execution""" AzureRMBatchAccount() + if __name__ == '__main__': main() diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml index af31bcb8a5a2..f292cd91af63 100644 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml @@ -18,7 +18,7 @@ resource_group: MyResGroup name: "{{ resource_name }}" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: absent #---------------------------------------------------------- - name: Create (or update) Batch Account @@ -26,7 +26,7 @@ resource_group: MyResGroup name: "{{ resource_name }}" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: present register: result - name: assert changed is true @@ -53,7 +53,7 @@ resource_group: MyResGroup name: "{{ resource_name }}" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: present register: result - name: assert changed is false @@ -66,7 +66,7 @@ resource_group: MyResGroup name: "{{ resource_name }}" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: absent register: result - name: assert changed is true @@ -93,7 +93,7 @@ resource_group: MyResGroup name: "{{ resource_name }}" location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId state: absent register: result - name: assert changed is false diff --git a/google/python_utils.rb b/google/python_utils.rb index a41bdc12d82b..a01138ac1ae1 100644 --- a/google/python_utils.rb +++ b/google/python_utils.rb @@ -25,8 +25,10 @@ module PythonUtils # quotes in the string like "\"foo\"" which is not a pattern we want to # see in our yaml config files. def python_literal(value) - if value.is_a?(String) || value.is_a?(Symbol) + if value.is_a?(String) "'#{value}'" + elsif value.is_a?(Symbol) + "'#{value.to_s.underscore}'" elsif value.is_a?(Numeric) value.to_s elsif value.is_a?(Array) diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 663dafa330d4..a7eb41f2811a 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -7,5 +7,10 @@ manifest: !ruby/object:Provider::Ansible::Manifest requirements: - python >= 2.6 - requests >= 2.18.4 - version_added: '2.9' + version_added: '2.8' author: Junyi Yi (@JunyiYi) +overrides: !ruby/object:Provider::ResourceOverrides + BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride + properties: + autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride + name: autoStorageAccount \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/batch_account.yaml b/products/azbatchaccount/examples/ansible/batch_account.yaml index 7c73e0fa9c91..fbce75453625 100644 --- a/products/azbatchaccount/examples/ansible/batch_account.yaml +++ b/products/azbatchaccount/examples/ansible/batch_account.yaml @@ -7,4 +7,4 @@ task: !ruby/object:Provider::Ansible::Task name: <%= ctx[:name] %> resource_group: MyResGroup location: West US - storage_account_id: MyStorageAccountId + auto_storage_account: MyStorageAccountId diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 2406bf9ea2b0..6959e4c36733 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -41,12 +41,12 @@ def documentation_for_property(prop, object) (resourceref_description(prop) \ if prop.is_a?(Api::Type::ResourceRef) && !prop.resource_ref.readonly) ].flatten.compact, - 'required' => required, - 'default' => (prop.default_value.to_s if prop.default_value), + 'required' => (true if required), + 'default' => (prop.default_value.to_s.underscore if prop.default_value), 'type' => ('bool' if prop.is_a? Api::Type::Boolean), 'aliases' => (prop.aliases if prop.aliases), 'version_added' => (prop.version_added.to_f if prop.version_added), - 'choices' => (prop.values.map(&:to_s) if prop.is_a? Api::Type::Enum), + 'choices' => (prop.values.map{|v| v.to_s.underscore} if prop.is_a? Api::Type::Enum), 'suboptions' => ( if prop.is_a?(Api::Type::NestedObject) prop.properties.map { |p| documentation_for_property(p, object) }.reduce({}, :merge) diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index e148061a55ad..dd1cca44a443 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -74,7 +74,7 @@ def choices_enum(prop, spaces) format([ [ "choices=[#{prop.values.map do |x| - quote_string(x.to_s) + quote_string(x.to_s.underscore) end.join(', ')}]" ], [ diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 7e75130d7a35..95fffd5ca3c0 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -1,11 +1,13 @@ -require 'provider/azure/ansible/sdk/helpers' +require 'provider/azure/ansible/helpers' require 'provider/azure/ansible/sub_template' +require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' module Provider module Azure module Ansible + include Provider::Azure::Ansible::Helpers include Provider::Azure::Ansible::SDK::Helpers include Provider::Azure::Ansible::SubTemplate include Provider::Azure::Ansible::Module::SubTemplate diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb new file mode 100644 index 000000000000..d257409a193f --- /dev/null +++ b/provider/azure/ansible/helpers.rb @@ -0,0 +1,17 @@ +require 'api/azure/type' + +module Provider + module Azure + module Ansible + module Helpers + def is_tags?(property) + property.is_a?(Api::Azure::Type::Tags) + end + + def is_tags_defined?(object) + object.all_user_properties.any?{|p| is_tags?(p)} + end + end + end + end +end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index d5cb10000615..31dfe71b3c0c 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -43,7 +43,7 @@ description: <%= to_yaml({ 'options' => [ - input_properties.map{|p| documentation_for_property(p, object)}, + input_properties.reject{|p| is_tags?(p)}.map{|p| documentation_for_property(p, object)}, { 'state' => { 'description' => [ @@ -65,6 +65,7 @@ description: extends_documentation_fragment: - azure + <%= lines('- azure_tags') if is_tags_defined?(object) -%> author: - "<%= @config.manifest.get('author', object) -%>" @@ -111,12 +112,13 @@ except ImportError: class Actions: NoAction, Create, Update, Delete = range(4) + class AzureRM<%= object.name -%>(AzureRMModuleBase): """Configuration class for an Azure RM <%= object.name.titleize -%> resource""" def __init__(self): self.module_arg_spec = dict( -<%= lines(indent_list(input_properties.map{|p| python_dict_for_property(p, object)}, 12, true)) -%> +<%= lines(indent_list(input_properties.reject{|p| is_tags?(p)}.map{|p| python_dict_for_property(p, object)}, 12, true)) -%> state=dict( type='str', default='present', @@ -136,17 +138,25 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): ] <%= lines(build_multiline_method_call("super(AzureRM#{object.name}, self).__init__(", [ - "derived_arg_spec=self.module_arg_spec", "supports_check_mode=True", "supports_tags=True", "required_if=required_if" + "derived_arg_spec=self.module_arg_spec", + "supports_check_mode=True", + "supports_tags=#{python_literal(is_tags_defined?(object))}", + "required_if=required_if" ], ")", 8)) -%> def exec_module(self, **kwargs): """Main module execution method""" - for key in list(self.module_arg_spec.keys()) + ['tags']: + for key in list(self.module_arg_spec.keys())<%= " + ['tags']" if is_tags_defined?(object) -%>: if hasattr(self, key): setattr(self, key, kwargs[key]) elif kwargs[key] is not None: self.<%= root_object_field -%>[key] = kwargs[key] +<% input_properties.each do |prop| -%> +<% if prop.is_a? Api::Type::Enum -%> + self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], True) +<% end -%> +<% end -%> response = None @@ -167,7 +177,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.to_do = Actions.Delete elif self.state == 'present': if (not default_compare(self.<%= root_object_field -%>, old_response, '', self.results)): - self.to_do = Actions.Update + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the <%= object.name.titlecase -%> instance") @@ -248,7 +258,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): :return: deserialized <%= object.name.titlecase -%> instance state dictionary ''' self.log("Checking if the <%= object.name.titlecase -%> instance {0} is present".format(self.name)) - found = false + found = False try: <%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> found = True @@ -265,5 +275,6 @@ def main(): """Main execution""" AzureRM<%= object.name -%>() + if __name__ == '__main__': main() From 0d460d926b01e4061c7704f4f807eea056d8350c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 11 Apr 2019 17:12:52 -0700 Subject: [PATCH 058/175] Refine Terraform documentation. --- .../azure_rm_batchaccount.py | 3 +- ...ure_rm_servicebusdisasterrecoveryconfig.py | 243 ----------------- .../google/gcp_azurerm_resource_group.py | 247 ------------------ .../azurerm/resource_arm_batch_account.go | 43 ++- .../docs/r/batch_account.html.markdown | 46 +++- products/azbatchaccount/api.yaml | 2 +- .../examples/terraform/basic.yaml | 15 ++ products/azbatchaccount/terraform.yaml | 27 +- .../terraform_extra_functions.erb | 16 ++ .../examples/terraform/basic.yaml | 12 + provider/ansible.rb | 4 +- provider/terraform/custom_code.rb | 3 + templates/ansible/resource.erb | 3 +- .../terraform/example/import_resource_id.erb | 4 +- .../nested_property_documentation.erb | 4 +- .../terraform/property_documentation.erb | 5 +- templates/terraform/resource.erb | 4 + .../terraform/resource.html.markdown.erb | 14 +- templates/terraform/schemas/primitive.erb | 40 +-- 19 files changed, 175 insertions(+), 560 deletions(-) rename build/azansible/lib/ansible/modules/cloud/{google => azure}/azure_rm_batchaccount.py (98%) delete mode 100644 build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py delete mode 100644 build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py create mode 100644 products/azbatchaccount/examples/terraform/basic.yaml create mode 100644 products/azbatchaccount/terraform_extra_functions.erb create mode 100644 products/azstorageaccount/examples/terraform/basic.yaml diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py similarity index 98% rename from build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py rename to build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index c054e1955f60..4e4e5bb89887 100644 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -218,8 +218,7 @@ def exec_module(self, **kwargs): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - if (not default_compare(self.batch_account, old_response, '', self.results)): - self.to_do = Actions.Update + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the Batch Account instance") diff --git a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py b/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py deleted file mode 100644 index 5b41080d3937..000000000000 --- a/build/azansible/lib/ansible/modules/cloud/google/azure_rm_servicebusdisasterrecoveryconfig.py +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2019 Zim Kalinowski (@zikalino) -# -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ["preview"], - 'supported_by': 'community'} - - -DOCUMENTATION = ''' ---- -module: azure_rm_servicebusdisasterrecoveryconfig -version_added: "2.6" - -short_description: Manages a service bus disaster recovery config on Azure. - -description: - - Create, update and delete instance of Azure Service Bus Disaster Recovery Config. - -options: - name: - description: - - The name of the service bus disaster recovery. - required: true - resource_group_name: - description: - - The name of the resource group in which to create the service bus disaster - recovery. - required: true - namespace_name: - description: - - The name of the service bus namespace in which the config is created. - required: true - partner_namespace: - description: - - The parter namespace of the service bus disaster recovery. - required: false - alternate_name: - description: - - The alternative name of the service bus disaster recovery. - required: false - state: - description: - - Assert the state of the Service Bus Disaster Recovery Config. - - Use 'present' to create or update a Service Bus Disaster Recovery Config - and 'absent' to delete it. - default: present - choices: - - present - - absent - -extends_documentation_fragment: - - azure - -author: - - "Zim Kalinowski (@zikalino)" -''' - -EXAMPLES = ''' - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "test_object" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: present -''' - -RETURN = ''' -id: - description: - - The identifier of the DTL Virtual Machine resource. - returned: always - type: str -''' - -import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase -from ansible.module_utils.common.dict_transformations import _snake_to_camel - -try: - from msrestazure.azure_exceptions import CloudError - from msrest.polling import LROPoller - from msrestazure.azure_operation import AzureOperationPoller - from msrest.serialization import Model - from azure.mgmt.servicebus import ServiceBusManagementClient -except ImportError: - # This is handled in azure_rm_common - pass - - -class Actions: - NoAction, Create, Update, Delete = range(4) - -class AzureRMServiceBusDisasterRecoveryConfig(AzureRMModuleBase): - """Configuration class for an Azure RM Service Bus Disaster Recovery Config resource""" - - def __init__(self): - self.module_arg_spec = dict( - # TODO: Finish type declaration - ) - # TODO: Argument Properties - - self.results = dict(changed=False) - self.mgmt_client = None - self.state = None - self.to_do = Actions.NoAction - - required_if = [ - # TODO: Required If - ('state', 'present', []) - ] - - super(AzureRMServiceBusDisasterRecoveryConfig, self).__init__(derived_arg_spec=self.module_arg_spec, - supports_check_mode=True, - supports_tags=True, - required_if=required_if) - - def exec_module(self, **kwargs): - """Main module execution method""" - # TODO: Parameters -> Class Properties - # TODO: Parameters -> SDK - - response = None - - self.mgmt_client = self.get_mgmt_svc_client(ServiceBusManagementClient, - base_url=self._cloud_environment.endpoints.resource_manager) - - old_response = self.get_servicebusdisasterrecoveryconfig() - - # TODO: Idempotency Check - - if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): - self.log("Need to Create / Update the Service Bus Disaster Recovery Config instance") - - self.results['changed'] = True - if self.check_mode: - return self.results - - response = self.create_update_servicebusdisasterrecoveryconfig() - - self.log("Creation / Update done") - elif self.to_do == Actions.Delete: - self.log("Service Bus Disaster Recovery Config instance deleted") - self.results['changed'] = True - - if self.check_mode: - return self.results - - self.delete_servicebusdisasterrecoveryconfig() - else: - self.log("Service Bus Disaster Recovery Config instance unchanged") - self.results['changed'] = False - response = old_response - - # TODO: Format Response - - def create_update_servicebusdisasterrecoveryconfig(self): - ''' - Creates or updates Service Bus Disaster Recovery Config with the specified configuration. - - :return: deserialized Service Bus Disaster Recovery Config instance state dictionary - ''' - self.log("Creating / Updating the Service Bus Disaster Recovery Config instance {0}".format(self.name)) - try: - response = self.mgmt_client.disaster_recovery_configs.create_or_update(resource_group_name=self.resource_group, - namespace_name=self.namespace, - alias=self.name, - parameters=self.parameters) - if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): - response = self.get_poller_result(response) - except CloudError as exc: - self.log('Error attempting to create the Service Bus Disaster Recovery Config instance.') - self.fail("Error creating the Service Bus Disaster Recovery Config instance: {0}".format(str(exc))) - return response.as_dict() - - - def delete_servicebusdisasterrecoveryconfig(self): - ''' - Deletes specified Service Bus Disaster Recovery Config instance in the specified subscription and resource group. - - :return: True - ''' - self.log("Deleting the Service Bus Disaster Recovery Config instance {0}".format(self.name)) - try: - response = self.mgmt_client.disaster_recovery_configs.delete(resource_group_name=self.resource_group, - namespace_name=self.namespace, - alias=self.name) - except CloudError as e: - self.log('Error attempting to delete the Service Bus Disaster Recovery Config instance.') - self.fail("Error deleting the Service Bus Disaster Recovery Config instance: {0}".format(str(e))) - - if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): - response = self.get_poller_result(response) - return True - - def get_servicebusdisasterrecoveryconfig(self): - ''' - Gets the properties of the specified Service Bus Disaster Recovery Config - :return: deserialized Service Bus Disaster Recovery Config instance state dictionary - ''' - self.log("Checking if the Service Bus Disaster Recovery Config instance {0} is present".format(self.name)) - found = false - try: - response = self.mgmt_client.disaster_recovery_configs.get(resource_group_name=self.resource_group, - namespace_name=self.namespace, - alias=self.name) - found = True - self.log("Response : {0}".format(response)) - self.log("Service Bus Disaster Recovery Config instance : {0} found".format(response.name)) - except CloudError as e: - self.log('Did not find the Service Bus Disaster Recovery Config instance.') - if found is True: - return response.as_dict() - return False - - -def main(): - """Main execution""" - AzureRMServiceBusDisasterRecoveryConfig() - -if __name__ == '__main__': - main() diff --git a/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py b/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py deleted file mode 100644 index d966b3e1457f..000000000000 --- a/build/azansible/lib/ansible/modules/cloud/google/gcp_azurerm_resource_group.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2017 Google -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -################################################################################ -# Documentation -################################################################################ - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ["preview"], - 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: gcp_zurerm_resource_group -description: -- Manages a resource group on Azure. -short_description: Creates a GCP ResourceGroup -version_added: 2.6 -author: Google Inc. (@googlecloudplatform) -requirements: -- python >= 2.6 -- requests >= 2.18.4 -- google-auth >= 1.3.0 -options: - state: - description: - - Whether the given object should exist in GCP - choices: - - present - - absent - default: present - name: - description: - - The name of the resource group. - required: true - location: - description: - - The location where the resource group should be created. - required: true - tags: - description: - - A mapping of tags to assign to the resource group. - required: false -extends_documentation_fragment: gcp -''' - - -RETURN = ''' -name: - description: - - The name of the resource group. - returned: success - type: str -location: - description: - - The location where the resource group should be created. - returned: success - type: str -tags: - description: - - A mapping of tags to assign to the resource group. - returned: success - type: dict -''' - -################################################################################ -# Imports -################################################################################ - -from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, replace_resource_dict -import json - -################################################################################ -# Main -################################################################################ - - -def main(): - """Main function""" - - module = GcpModule( - argument_spec=dict( - state=dict(default='present', choices=['present', 'absent'], type='str'), - name=dict(required=True, type='str'), - location=dict(required=True, type='str'), - tags=dict(type='dict') - ) - ) - - if not module.params['scopes']: - module.params['scopes'] = ['NotUsedInAzure'] - - state = module.params['state'] - - fetch = fetch_resource(module, self_link(module)) - changed = False - - if fetch: - if state == 'present': - if is_different(module, fetch): - update(module, self_link(module)) - fetch = fetch_resource(module, self_link(module)) - changed = True - else: - delete(module, self_link(module)) - fetch = {} - changed = True - else: - if state == 'present': - fetch = create(module, collection(module)) - changed = True - else: - fetch = {} - - fetch.update({'changed': changed}) - - module.exit_json(**fetch) - - -def create(module, link): - auth = GcpSession(module, 'zurerm') - return return_if_object(module, auth.post(link, resource_to_request(module))) - - -def update(module, link): - auth = GcpSession(module, 'zurerm') - return return_if_object(module, auth.put(link, resource_to_request(module))) - - -def delete(module, link): - auth = GcpSession(module, 'zurerm') - return return_if_object(module, auth.delete(link)) - - -def resource_to_request(module): - request = { - u'name': module.params.get('name'), - u'location': module.params.get('location'), - u'tags': module.params.get('tags') - } - request = encode_request(request, module) - return_vals = {} - for k, v in request.items(): - if v: - return_vals[k] = v - - return return_vals - - -def fetch_resource(module, link, allow_not_found=True): - auth = GcpSession(module, 'zurerm') - return return_if_object(module, auth.get(link), allow_not_found) - - -def self_link(module): - return "NotUsedInAzureNotUsedInAzure/{name}".format(**module.params) - - -def collection(module): - return "NotUsedInAzureNotUsedInAzure".format(**module.params) - - -def return_if_object(module, response, allow_not_found=False): - # If not found, return nothing. - if allow_not_found and response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - - result = decode_request(result, module) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result - - -def is_different(module, response): - request = resource_to_request(module) - response = response_to_hash(module, response) - request = decode_request(request, module) - - # Remove all output-only from response. - response_vals = {} - for k, v in response.items(): - if k in request: - response_vals[k] = v - - request_vals = {} - for k, v in request.items(): - if k in response: - request_vals[k] = v - - return GcpRequest(request_vals) != GcpRequest(response_vals) - - -# Remove unnecessary properties from the response. -# This is for doing comparisons with Ansible's current parameters. -def response_to_hash(module, response): - return { - u'name': module.params.get('name'), - u'location': module.params.get('location'), - u'tags': response.get(u'tags') - } - - -def decode_request(response, module): - if 'name' in response: - response['name'] = response['name'].split('/')[-1] - return response - - -def encode_request(request, module): - request['name'] = '/'.join(['projects', module.params['project'], - 'topics', module.params['name']]) - return request - - -if __name__ == '__main__': - main() diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 53c329ed6c01..e84b552a71d6 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -33,17 +33,13 @@ func resourceArmBatchAccount() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, + ValidateFunc: validateAzureRMBatchAccountName, }, "location": locationSchema(), "resource_group_name": resourceGroupNameSchema(), - "auto_storage_account_id": { - Type: schema.TypeString, - Optional: true, - }, - "key_vault_reference": { Type: schema.TypeList, Optional: true, @@ -76,6 +72,12 @@ func resourceArmBatchAccount() *schema.Resource { Default: string(batch.BatchService), }, + "storage_account_id": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: azure.ValidateResourceIDOrEmpty, + }, + "tags": tagsSchema(), }, } @@ -101,16 +103,16 @@ func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) err } location := azureRMNormalizeLocation(d.Get("location").(string)) - autoStorageAccountId := d.Get("auto_storage_account_id").(string) keyVaultReference := d.Get("key_vault_reference").([]interface{}) poolAllocationMode := d.Get("pool_allocation_mode").(string) + storageAccountId := d.Get("storage_account_id").(string) tags := d.Get("tags").(map[string]interface{}) parameters := batch.AccountCreateParameters{ Location: utils.String(location), AccountCreateProperties: &batch.AccountCreateProperties{ AutoStorage: &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(autoStorageAccountId), + StorageAccountID: utils.String(storageAccountId), }, KeyVaultReference: expandArmBatchAccountKeyVaultReference(keyVaultReference), PoolAllocationMode: batch.PoolAllocationMode(poolAllocationMode), @@ -167,13 +169,13 @@ func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error d.Set("location", azureRMNormalizeLocation(*location)) } if properties := resp.AccountProperties; properties != nil { - if autoStorage := properties.AutoStorage; autoStorage != nil { - d.Set("auto_storage_account_id", autoStorage.StorageAccountID) - } if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) } d.Set("pool_allocation_mode", string(properties.PoolAllocationMode)) + if autoStorage := properties.AutoStorage; autoStorage != nil { + d.Set("storage_account_id", autoStorage.StorageAccountID) + } } flattenAndSetTags(d, resp.Tags) @@ -186,13 +188,13 @@ func resourceArmBatchAccountUpdate(d *schema.ResourceData, meta interface{}) err name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) - autoStorageAccountId := d.Get("auto_storage_account_id").(string) + storageAccountId := d.Get("storage_account_id").(string) tags := d.Get("tags").(map[string]interface{}) parameters := batch.AccountUpdateParameters{ AccountUpdateProperties: &batch.AccountUpdateProperties{ AutoStorage: &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(autoStorageAccountId), + StorageAccountID: utils.String(storageAccountId), }, }, Tags: expandTags(tags), @@ -266,3 +268,20 @@ func flattenArmBatchAccountKeyVaultReference(input *batch.KeyVaultReference) []i return []interface{}{result} } + +func validateAzureRMBatchAccountName(v interface{}, k string) (warnings []string, errors []error) { + value := v.(string) + if !regexp.MustCompile(`^[a-z0-9]+$`).MatchString(value) { + errors = append(errors, fmt.Errorf("lowercase letters and numbers only are allowed in %q: %q", k, value)) + } + + if 3 > len(value) { + errors = append(errors, fmt.Errorf("%q cannot be less than 3 characters: %q", k, value)) + } + + if len(value) > 24 { + errors = append(errors, fmt.Errorf("%q cannot be longer than 24 characters: %q %d", k, value, len(value))) + } + + return warnings, errors +} diff --git a/build/azterraform/website/docs/r/batch_account.html.markdown b/build/azterraform/website/docs/r/batch_account.html.markdown index b39b04d07006..517d43599535 100644 --- a/build/azterraform/website/docs/r/batch_account.html.markdown +++ b/build/azterraform/website/docs/r/batch_account.html.markdown @@ -24,17 +24,28 @@ description: |- Manages a Batch Account on Azure. -## Example Usage - Resource Group - +## Example Usage ```hcl resource "azurerm_resource_group" "example" { - name = "ExampleRG" + name = "example-rg" location = "West US" +} - tags { - environment = "Production" - } +resource "azurerm_storage_account" "example" { + name = "examplesa" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + accountTier = "Standard" + accountReplicationType = "LRS" +} + +resource "azurerm_batch_account" "example" { + name = "example-batch-account" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" + poolAllocationMode = "BatchService" + storageAccountId = "${azurerm_storage_account.example.id}" } ``` @@ -44,19 +55,21 @@ The following arguments are supported: * `name` - (Required) The name of the Batch Account. Changing this forces a new resource to be created. -* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. - * `resource_group_name` - (Required) The name of the resource group in which to create the Batch Account. Changing this forces a new resource to be created. -* `tags` - (Optional) A mapping of tags to assign to the batch account. +* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. -* `auto_storage_account_id` - (Optional) The ID of the Batch Account auto storage account. +* `key_vault_reference` - (Optional) One `key_vault_reference` block defined below. Changing this forces a new resource to be created. * `pool_allocation_mode` - (Optional) The pool acclocation mode of the Batch Account. Defaults to `BatchService`. Changing this forces a new resource to be created. -* `key_vault_reference` - (Optional) A reference to the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. Structure is documented below. +* `storage_account_id` - (Optional) The ID of the Batch Account auto storage account. -The `key_vault_reference` block supports: +* `tags` - (Optional) A mapping of tags to assign to the batch account. + +--- + +The `key_vault_reference` block supports the following: * `id` - (Required) The resource ID of the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. @@ -67,3 +80,12 @@ The `key_vault_reference` block supports: The following attributes are exported: * `id` - The ID of the Batch Account. + + +## Import + +Batch Account can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_batch_account.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Batch/batchAccounts/example-batch-account +``` diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 32111eabc5e9..12f1ea57e6bc 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -16,7 +16,7 @@ objects: base_url: NotUsedInAzure azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: batch + provider_name: Microsoft.Batch go_client_namespace: batch go_client: batchAccountClient python_client_namespace: azure.mgmt.batch diff --git a/products/azbatchaccount/examples/terraform/basic.yaml b/products/azbatchaccount/examples/terraform/basic.yaml new file mode 100644 index 000000000000..89dc65f0f75c --- /dev/null +++ b/products/azbatchaccount/examples/terraform/basic.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_batch_account +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azstorageaccount + example: basic +properties: + name: "<%= get_resource_name('batch_accounts', 'batch') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} + poolAllocationMode: BatchService + storageAccountId: ${azurerm_storage_account.<%= resource_id_hint -%>.id} \ No newline at end of file diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml index f452c10cb29f..0f7cfa72c438 100644 --- a/products/azbatchaccount/terraform.yaml +++ b/products/azbatchaccount/terraform.yaml @@ -1,10 +1,23 @@ --- !ruby/object:Provider::Terraform::Config name: azbatchaccount overrides: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Terraform::ResourceOverride - example: - - !ruby/object:Provider::Terraform::Examples - name: "resource_group" - primary_resource_id: "example" - vars: - rg_name: "ExampleRG" + BatchAccount: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validateAzureRMBatchAccountName + autoStorageAccountId: !ruby/object:Provider::Terraform::PropertyOverride + name: storageAccountId + validation: !ruby/object:Provider::Terraform::Validation + function: azure.ValidateResourceIDOrEmpty + custom_code: !ruby/object:Provider::Terraform::CustomCode + extra_functions: products/azbatchaccount/terraform_extra_functions.erb + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroupName: example-rg + storageAccounts: examplesa + batchAccounts: example-batch-account + location: West US diff --git a/products/azbatchaccount/terraform_extra_functions.erb b/products/azbatchaccount/terraform_extra_functions.erb new file mode 100644 index 000000000000..8bff975c6d7f --- /dev/null +++ b/products/azbatchaccount/terraform_extra_functions.erb @@ -0,0 +1,16 @@ +func validateAzureRMBatchAccountName(v interface{}, k string) (warnings []string, errors []error) { + value := v.(string) + if !regexp.MustCompile(`^[a-z0-9]+$`).MatchString(value) { + errors = append(errors, fmt.Errorf("lowercase letters and numbers only are allowed in %q: %q", k, value)) + } + + if 3 > len(value) { + errors = append(errors, fmt.Errorf("%q cannot be less than 3 characters: %q", k, value)) + } + + if len(value) > 24 { + errors = append(errors, fmt.Errorf("%q cannot be longer than 24 characters: %q %d", k, value, len(value))) + } + + return warnings, errors +} \ No newline at end of file diff --git a/products/azstorageaccount/examples/terraform/basic.yaml b/products/azstorageaccount/examples/terraform/basic.yaml new file mode 100644 index 000000000000..09b9c4ffd099 --- /dev/null +++ b/products/azstorageaccount/examples/terraform/basic.yaml @@ -0,0 +1,12 @@ +--- !ruby/object:Provider::Azure::Terraform::Example +resource: azurerm_storage_account +prerequisites: + - !ruby/object:Provider::Azure::Terraform::ExampleReference + product: azresourcegroup + example: basic +properties: + name: "<%= get_resource_name('storage_accounts', 'sa') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} + accountTier: Standard + accountReplicationType: LRS \ No newline at end of file diff --git a/provider/ansible.rb b/provider/ansible.rb index 90c8c9a60de5..a3e477c6db29 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -223,7 +223,7 @@ def generate_resource(data) generate_resource_file data.clone.merge( default_template: 'templates/ansible/resource.erb', out_file: File.join(target_folder, - "lib/ansible/modules/cloud/google/#{name}.py") + "lib/ansible/modules/cloud/azure/#{name}.py") ) end @@ -265,7 +265,7 @@ def compile_datasource(data) generate_resource_file data.clone.merge( default_template: 'templates/ansible/facts.erb', out_file: File.join(target_folder, - "lib/ansible/modules/cloud/google/#{name}.py") + "lib/ansible/modules/cloud/azure/#{name}.py") ) end diff --git a/provider/terraform/custom_code.rb b/provider/terraform/custom_code.rb index dee30f02fc5a..c9ca2bdc36d2 100644 --- a/provider/terraform/custom_code.rb +++ b/provider/terraform/custom_code.rb @@ -256,6 +256,8 @@ class CustomCode < Api::Object # the Read() method to succeed. attr_reader :post_import + attr_reader :extra_functions + def validate super @@ -271,6 +273,7 @@ def validate check_optional_property :pre_delete, String check_optional_property :custom_import, String check_optional_property :post_import, String + check_optional_property :extra_functions, String end end end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 31dfe71b3c0c..476eabdda602 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -176,8 +176,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - if (not default_compare(self.<%= root_object_field -%>, old_response, '', self.results)): - self.to_do = Actions.Update + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the <%= object.name.titlecase -%> instance") diff --git a/templates/azure/terraform/example/import_resource_id.erb b/templates/azure/terraform/example/import_resource_id.erb index ab13f5f1d5a0..4cf51c7711e2 100644 --- a/templates/azure/terraform/example/import_resource_id.erb +++ b/templates/azure/terraform/example/import_resource_id.erb @@ -1,12 +1,12 @@ <% sdk = object.azure_sdk_definition rg_name = "" - sub_ids = [sdk.provider_name] + sub_ids = ['providers/' + sdk.provider_name] sdk.read.request.reject {|k, v| v.id_portion.nil?}.each do |name, value| if value.id_portion == "resourceGroups" rg_name = name_hints[name] else - sub_ids <<= "#{value.id_portion}/#{name_hints[name]}" + sub_ids <<= "#{value.id_portion}/#{name_hints[value.id_portion]}" end end -%> diff --git a/templates/terraform/nested_property_documentation.erb b/templates/terraform/nested_property_documentation.erb index c0a6c17d9ab5..05077e8b282b 100644 --- a/templates/terraform/nested_property_documentation.erb +++ b/templates/terraform/nested_property_documentation.erb @@ -3,7 +3,9 @@ nested_properties = nested_properties(property) if !nested_properties.empty? -%> -The `<%= property.name.underscore -%>` block <%= if property.output then "contains" else "supports" end -%>: +--- + +The `<%= property.name.underscore -%>` block <%= if property.output then "contains" else "supports" end -%> the following: <%- if property.is_a?(Api::Type::Map) %> * `<%= property.key_name.underscore -%>` - (Required) The identifier for this object. Format specified above. <% end -%> diff --git a/templates/terraform/property_documentation.erb b/templates/terraform/property_documentation.erb index 37103c8984d0..d80d1e6ca064 100644 --- a/templates/terraform/property_documentation.erb +++ b/templates/terraform/property_documentation.erb @@ -10,7 +10,8 @@ default_value_postfix = "" default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil -%> -* `<%= property.name.underscore -%>` - <%= prefix %><%= property.description.strip.gsub("\n\n", "\n") -%><%= default_value_postfix -%><%= force_new_postfix -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> - Structure is documented below. +* `<%= property.name.underscore -%>` - <%= prefix %>One<%= ' or more' unless property.is_a?(Api::Type::NestedObject) -%> `<%= property.name.underscore -%>` block defined below.<%= force_new_postfix -%> +<% else -%> +* `<%= property.name.underscore -%>` - <%= prefix %><%= property.description.strip.gsub("\n\n", "\n") -%><%= default_value_postfix -%><%= force_new_postfix -%> <% end -%> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 861da23a4df5..b2af7bf16e27 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -274,4 +274,8 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% while !flatten_queue.empty? -%> <% descriptor = flatten_queue.shift -%> <%= lines(build_flatten_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, flatten_queue, object)) -%> +<% end -%> + +<% if object.custom_code.extra_functions -%> +<%= lines(compile(object.custom_code.extra_functions)) -%> <% end -%> \ No newline at end of file diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 14a545c5a19b..2252f30ac323 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -98,16 +98,16 @@ To get more information about <%= object.name -%>, see: ## Argument Reference The following arguments are supported: -<% properties.select(&:required).each do |prop| -%> +<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> -<% properties.select(&:required).each do |prop| -%> +<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> -<% properties.reject(&:required).reject(&:output).each do |prop| -%> +<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> -<% properties.reject(&:required).reject(&:output).each do |prop| -%> +<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> @@ -133,9 +133,9 @@ The following attributes are exported: <% if object.instance_variable_defined?(:@document_examples) && !object.document_examples.nil? && !object.document_examples.empty? -%> ## Import -<%= object.name -%> can be imported using the `resource id`, e.g. -```shell -$ terraform import azurerm_<%= resource_name -%>.example <%= build_documentation_import_resource_id(object, object.document_examples[0]) -%> +<%= object.name.titlecase -%> can be imported using the `resource id`, e.g. +```shell +$ terraform import azurerm_<%= resource_name -%>.example <%= lines(build_documentation_import_resource_id(object, object.document_examples[0])) -%> ``` <% end -%> diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index d98c4554b4b6..ac2e12698e9e 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -3,35 +3,35 @@ -%> <% if tf_types.include?(property.class) -%> "<%= property.name.underscore -%>": { - <% if property.is_set -%> - Type: schema.TypeSet, - <% else -%> - Type: <%= tf_type(property) %>, - <% end -%> -<% if property.default_from_api -%> - Computed: true, - Optional: true, -<% elsif property.required -%> - Required: true, -<% elsif property.output -%> - Computed: true, -<% else -%> - Optional: true, -<% end -%> +<% if property.is_set -%> + Type: schema.TypeSet, +<% else -%> + Type: <%= tf_type(property) %>, +<% end -%> +<% if property.default_from_api -%> + Computed: true, + Optional: true, +<% elsif property.required -%> + Required: true, +<% elsif property.output -%> + Computed: true, +<% else -%> + Optional: true, +<% end -%> <% if force_new?(property, object) -%> ForceNew: true, <% end -%> <% unless property.validation.nil? || property.output -%> - <% if !property.validation.regex.nil? -%> +<% if !property.validation.regex.nil? -%> ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), - <% elsif !property.validation.function.nil? -%> +<% elsif !property.validation.function.nil? -%> ValidateFunc: <%= property.validation.function -%>, - <% end # property.validation.nil? -%> +<% end # property.validation.nil? -%> <% end # property.validation.nil? -%> <% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> <% - enum_values = property.values - # enum_values.push "" unless property.required + enum_values = property.values + # enum_values.push "" unless property.required -%> ValidateFunc: validation.StringInSlice([]string{ <% enum_values.each do |val| -%> From 92f33ab6694f2df7b0b296e29b77c6d220578aab Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 11 Apr 2019 17:47:15 -0700 Subject: [PATCH 059/175] Apply the latest api.yaml schema to all api.yaml files. --- api/azure/sdk_definition.rb | 10 ++--- .../resource_arm_api_management_policy.go | 2 - ...resource_arm_automation_string_variable.go | 42 ++++++++++++------- ...rce_arm_automation_string_variable_test.go | 2 +- .../r/api_management_policy.html.markdown | 5 ++- .../automation_string_variable.html.markdown | 11 ++--- .../examples/terraform/basic.yaml | 2 +- products/azapimngpolicy/api.yaml | 11 +++-- products/azapimngpolicy/terraform.yaml | 8 ++-- .../examples/terraform/basic.yaml | 2 +- products/azautomationstringvariable/api.yaml | 38 ++++------------- .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/complete.yaml | 2 +- .../azautomationstringvariable/terraform.yaml | 6 +-- .../examples/terraform/basic.yaml | 2 +- products/azbatchaccount/terraform.yaml | 2 +- .../examples/terraform/basic.yaml | 2 +- .../examples/terraform/basic.yaml | 2 +- provider/azure/terraform/example/helpers.rb | 2 +- .../azure/terraform/example/sub_template.rb | 2 +- .../terraform/example/import_resource_id.erb | 2 +- templates/terraform/resource.erb | 2 +- 22 files changed, 72 insertions(+), 87 deletions(-) diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 0afb909ee933..9d0e0d8f1dab 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -16,11 +16,11 @@ class SDKDefinition < Api::Object def validate super - check_optional_property :provider_name, String - check_optional_property :go_client_namespace, String - check_optional_property :go_client, String - check_optional_property :python_client_namespace, String - check_optional_property :python_client, String + check_property :provider_name, String + check_property :go_client_namespace, String + check_property :go_client, String + check_property :python_client_namespace, String + check_property :python_client, String check_property :create, Api::Azure::SDKOperationDefinition check_property :read, Api::Azure::SDKOperationDefinition check_optional_property :update, Api::Azure::SDKOperationDefinition diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy.go b/build/azterraform/azurerm/resource_arm_api_management_policy.go index 683dbe7d9d03..c37d0de7d43b 100644 --- a/build/azterraform/azurerm/resource_arm_api_management_policy.go +++ b/build/azterraform/azurerm/resource_arm_api_management_policy.go @@ -128,8 +128,6 @@ func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{} } - - d.Set("resource_group_name", resourceGroup) if properties := resp.PolicyContractProperties; properties != nil { d.Set("xml_content", "") d.Set("xml_link", "") diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go index 4366fd2ff95a..d380a1e1a536 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -32,18 +32,18 @@ func resourceArmAutomationStringVariable() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, "resource_group_name": resourceGroupNameSchema(), "automation_account_name": { Type: schema.TypeString, Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, "description": { Type: schema.TypeString, @@ -71,6 +71,19 @@ func resourceArmAutomationStringVariableCreateUpdate(d *schema.ResourceData, met name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) accountName := d.Get("automation_account_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_automation_string_variable", *resp.ID) + } + } + description := d.Get("description").(string) encrypted := d.Get("encrypted").(bool) value := strconv.Quote(d.Get("value").(string)) @@ -86,16 +99,16 @@ func resourceArmAutomationStringVariableCreateUpdate(d *schema.ResourceData, met if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { - return fmt.Errorf("Error creating Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error creating Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) } resp, err := client.Get(ctx, resourceGroup, accountName, name) if err != nil { - return fmt.Errorf("Error retrieving Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error retrieving Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Automation String Variable %q (Resource Group %q, Automation Account Name %q) ID", name, resourceGroup, accountName) + return fmt.Errorf("Cannot read Automation String Variable %q (Automation Account Name %q / Resource Group %q) ID", name, accountName, resourceGroup) } d.SetId(*resp.ID) @@ -108,7 +121,7 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Automation String Variable ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] @@ -121,17 +134,14 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf d.SetId("") return nil } - return fmt.Errorf("Error reading Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error reading Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) } if err := validateAzureRmAutomationVariableType("azurerm_automation_string_variable"); err != nil { return err } - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("automation_account_name", accountName) if properties := resp.VariableProperties; properties != nil { d.Set("description", properties.Description) d.Set("encrypted", properties.IsEncrypted) @@ -154,14 +164,14 @@ func resourceArmAutomationStringVariableDelete(d *schema.ResourceData, meta inte id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Automation String Variable ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup accountName := id.Path["automationAccounts"] name := id.Path["variables"] if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { - return fmt.Errorf("Error deleting Automation String Variable %q (Resource Group %q, Automation Account Name %q): %+v", name, resourceGroup, accountName, err) + return fmt.Errorf("Error deleting Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go index 758ea0fb2665..7ec849edd2f9 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go @@ -130,7 +130,7 @@ func testCheckAzureRMAutomationStringVariableExists(resourceName string) resourc if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Automation String Variable %q (Resource Group %q, Automation Account Name %q) does not exist", name, resourceGroup, accountName) + return fmt.Errorf("Bad: Automation String Variable %q (Automation Account Name %q / Resource Group %q) does not exist", name, accountName, resourceGroup) } return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) } diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown index 0580a2a56b42..917eb40c3c18 100644 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -73,7 +73,8 @@ The following attributes are exported: ## Import -ApiManagementPolicy can be imported using the `resource id`, e.g. +Api Management Policy can be imported using the `resource id`, e.g. + ```shell -$ terraform import azurerm_api_management_policy.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/Microsoft.ApiManagement/service/ +$ terraform import azurerm_api_management_policy.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.ApiManagement/service/example-apim ``` diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index e4e7372a4133..9e517da8a670 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -62,20 +62,21 @@ The following arguments are supported: * `description` - (Optional) The description of the Automation Variable. -* `value` - (Optional) The value of the Automation Variable. - * `encrypted` - (Optional) The encrypted flag of the Automation Variable. Defaults to `false`. +* `value` - (Optional) The value of the Automation Variable. + ## Attributes Reference The following attributes are exported: -* `id` - The automation string variable ID. +* `id` - The ID of the Automation String Variable. ## Import -AutomationStringVariable can be imported using the `resource id`, e.g. +Automation String Variable can be imported using the `resource id`, e.g. + ```shell -$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/Microsoft.Automation/automationAccounts/example-account/variables/example-var +$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Automation/automationAccounts/example-account/variables/example-var ``` diff --git a/products/azapimanagement/examples/terraform/basic.yaml b/products/azapimanagement/examples/terraform/basic.yaml index 48abbd80787c..792d6258a4aa 100644 --- a/products/azapimanagement/examples/terraform/basic.yaml +++ b/products/azapimanagement/examples/terraform/basic.yaml @@ -5,7 +5,7 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= get_resource_name('api_management_name', 'AM') -%>" + name: "<%= get_resource_name('service', 'AM') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} publisher_name: pub1 diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml index 6f21589e6cce..77291e29c152 100644 --- a/products/azapimngpolicy/api.yaml +++ b/products/azapimngpolicy/api.yaml @@ -17,10 +17,13 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: Microsoft.ApiManagement + go_client_namespace: apimanagement + go_client: apiManagementPolicyClient python_client_namespace: azure.mgmt.apimanagement python_client: APIManagementClient create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate + python_func_name: create_or_update request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -41,6 +44,7 @@ objects: go_field_name: PolicyContent read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get + python_func_name: get request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -49,10 +53,6 @@ objects: id_portion: service go_variable_name: serviceName response: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: resourceGroup - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: servicebusName '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: PolicyContract '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -68,6 +68,7 @@ objects: go_field_name: PolicyContent delete: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Delete + python_func_name: delete request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -86,14 +87,12 @@ objects: description: The name of the Resource Group in which the API Management Service exists. required: true input: true - order: 991 azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: apiManagementName description: The name of the API Management Service where this Policy should be created. required: true input: true - order: 992 azure_sdk_references: ['serviceName'] properties: - !ruby/object:Api::Type::String diff --git a/products/azapimngpolicy/terraform.yaml b/products/azapimngpolicy/terraform.yaml index 497c78b24cf0..f22a6ff3d1fd 100644 --- a/products/azapimngpolicy/terraform.yaml +++ b/products/azapimngpolicy/terraform.yaml @@ -10,12 +10,12 @@ overrides: !ruby/object:Provider::ResourceOverrides format: !ruby/object:Provider::Azure::Terraform::PropertyOverride hide_from_schema: true custom_schema_get: products/azapimngpolicy/terraform_format_get.erb - custom_schema_set: templates/terraform/schemas/empty.erb + custom_schema_set: products/azapimngpolicy/terraform_format_content_set.erb custom_sdkfield_assign: products/azapimngpolicy/terraform_format_field_assign.erb xmlContent: !ruby/object:Provider::Azure::Terraform::PropertyOverride conflicts_with: [xml_link] diff_suppress_func: 'suppress.SuppressXmlDiff' - custom_schema_set: products/azapimngpolicy/terraform_format_content_set.erb + custom_schema_set: templates/terraform/schemas/empty.erb custom_sdkfield_assign: products/azapimngpolicy/terraform_content_field_assign.erb xmlLink: !ruby/object:Provider::Azure::Terraform::PropertyOverride conflicts_with: [xml_content] @@ -36,6 +36,6 @@ overrides: !ruby/object:Provider::ResourceOverrides title: Example Usage example_name: findReplace resource_name_hints: - resourceGroupName: example-rg - apiManagementName: example-apim + resourceGroups: example-rg + service: example-apim location: West US diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index 6490fc838f42..1dda5bf897b5 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -5,7 +5,7 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= get_resource_name('automation_account_name', 'AutoAcct') -%>" + name: "<%= get_resource_name('automationAccounts', 'AutoAcct') -%>" location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} sku: diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 03bc88c84458..ef0fef3b5614 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -17,8 +17,13 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate + python_func_name: create_or_update request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -45,6 +50,7 @@ objects: go_field_name: Value read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get + python_func_name: get request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -56,10 +62,6 @@ objects: id_portion: variables go_variable_name: name response: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: accountName '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Variable '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -74,32 +76,9 @@ objects: go_field_name: IsEncrypted '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Value - update: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value delete: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Delete + python_func_name: delete request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -119,14 +98,12 @@ objects: description: 'The name of the resource group in which to create the Automation Variable.' required: true input: true - order: 991 azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: 'automationAccountName' description: 'The name of the automation account in which the Variable is created.' required: true input: true - order: 992 azure_sdk_references: ['automationAccountName'] properties: - !ruby/object:Api::Type::String @@ -134,7 +111,6 @@ objects: description: 'The name of the Automation Variable.' required: true input: true - order: 990 azure_sdk_references: ['variableName', '/name'] - !ruby/object:Api::Type::String name: 'description' diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml index be37e345077f..02c69dc0e5e9 100644 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -8,7 +8,7 @@ prerequisites: product: azautomationaccount example: basic properties: - name: "<%= get_resource_name('variable_name', 'AutoVar') -%>" + name: "<%= get_resource_name('variables', 'AutoVar') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/examples/terraform/complete.yaml b/products/azautomationstringvariable/examples/terraform/complete.yaml index 778b06ab222f..286b2fb9ac7a 100644 --- a/products/azautomationstringvariable/examples/terraform/complete.yaml +++ b/products/azautomationstringvariable/examples/terraform/complete.yaml @@ -8,7 +8,7 @@ prerequisites: product: azautomationaccount example: basic properties: - name: "<%= get_resource_name('variable_name_hint', 'AutoVar') -%>" + name: "<%= get_resource_name('variables', 'AutoVar') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} description: This variable is created by Terraform acceptance test. diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index df65d4012edb..1c1509b019fb 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -30,7 +30,7 @@ overrides: !ruby/object:Provider::ResourceOverrides title: Example Usage example_name: basic resource_name_hints: - resourceGroupName: example-rg - automationAccountName: example-account - variableName: example-var + resourceGroups: example-rg + automationAccounts: example-account + variables: example-var location: West US diff --git a/products/azbatchaccount/examples/terraform/basic.yaml b/products/azbatchaccount/examples/terraform/basic.yaml index 89dc65f0f75c..7573bb057941 100644 --- a/products/azbatchaccount/examples/terraform/basic.yaml +++ b/products/azbatchaccount/examples/terraform/basic.yaml @@ -8,7 +8,7 @@ prerequisites: product: azstorageaccount example: basic properties: - name: "<%= get_resource_name('batch_accounts', 'batch') -%>" + name: "<%= get_resource_name('batchAccounts', 'batch') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} poolAllocationMode: BatchService diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml index 0f7cfa72c438..fe934d996919 100644 --- a/products/azbatchaccount/terraform.yaml +++ b/products/azbatchaccount/terraform.yaml @@ -17,7 +17,7 @@ overrides: !ruby/object:Provider::ResourceOverrides title: Example Usage example_name: basic resource_name_hints: - resourceGroupName: example-rg + resourceGroups: example-rg storageAccounts: examplesa batchAccounts: example-batch-account location: West US diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml index 3331154430bb..1a5c94e1db2b 100644 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Terraform::Example resource: azurerm_resource_group properties: - name: "<%= get_resource_name('resource_group_name', 'RG') -%>" + name: "<%= get_resource_name('resourceGroups', 'RG') -%>" location: "<%= get_location() -%>" \ No newline at end of file diff --git a/products/azstorageaccount/examples/terraform/basic.yaml b/products/azstorageaccount/examples/terraform/basic.yaml index 09b9c4ffd099..ac9f8d2cb725 100644 --- a/products/azstorageaccount/examples/terraform/basic.yaml +++ b/products/azstorageaccount/examples/terraform/basic.yaml @@ -5,7 +5,7 @@ prerequisites: product: azresourcegroup example: basic properties: - name: "<%= get_resource_name('storage_accounts', 'sa') -%>" + name: "<%= get_resource_name('storageAccounts', 'sa') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} accountTier: Standard diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index 7ed9230973ba..f93a4cffeeb9 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -7,7 +7,7 @@ class Example < Api::Object module Helpers def get_example_properties_to_check(product_name, example_name, object) request = object.azure_sdk_definition.read.request - param_props = object.all_user_properties.select{|p| azure_sdk_references.any?{|ref| request.has_key?(ref)}} + param_props = object.all_user_properties.select{|p| p.azure_sdk_references.any?{|ref| request.has_key?(ref)}} params = param_props.map{|p| p.name.underscore}.to_set example = get_example_from_file(product_name, example_name) diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index 4dfe2c4b8ee1..bc805fa6c4a4 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -57,7 +57,7 @@ class ExampleContextBinding def initialize(resource_id_hint, name_hints, random_vars) @my_binding = binding @my_binding.local_variable_set(:resource_id_hint, resource_id_hint) - @name_hints = name_hints.transform_keys(&:underscore) + @name_hints = name_hints @random_variables = random_vars end diff --git a/templates/azure/terraform/example/import_resource_id.erb b/templates/azure/terraform/example/import_resource_id.erb index 4cf51c7711e2..22ffe148468f 100644 --- a/templates/azure/terraform/example/import_resource_id.erb +++ b/templates/azure/terraform/example/import_resource_id.erb @@ -4,7 +4,7 @@ sub_ids = ['providers/' + sdk.provider_name] sdk.read.request.reject {|k, v| v.id_portion.nil?}.each do |name, value| if value.id_portion == "resourceGroups" - rg_name = name_hints[name] + rg_name = name_hints[value.id_portion] else sub_ids <<= "#{value.id_portion}/#{name_hints[value.id_portion]}" end diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index b2af7bf16e27..baae0f835199 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -24,7 +24,7 @@ package azurerm # can just be read in anyways, and after a Read they will need to be set in every Update. settable_properties = properties.reject{ |v| v.output && !v.is_a?(Api::Type::Fingerprint) }.reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH - updatable_properties = settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} + updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager api_name_lower = String.new(product_ns) api_name_lower[0] = api_name_lower[0].downcase From ee9b3f380da3916f5ed2a8724910f99c220f3280 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 12 Apr 2019 16:37:40 -0700 Subject: [PATCH 060/175] Add output field to BatchAccount. --- api/azure/type.rb | 6 +++++- .../ansible/modules/cloud/azure/azure_rm_batchaccount.py | 8 +++++++- build/azterraform/azurerm/resource_arm_batch_account.go | 6 ++++++ .../website/docs/r/batch_account.html.markdown | 2 ++ products/azbatchaccount/api.yaml | 7 ++++++- provider/ansible/documentation.rb | 2 +- provider/azure/terraform/schema.rb | 1 + provider/terraform.rb | 3 ++- .../azure/ansible/module/response_properties_update.erb | 2 +- templates/terraform/schemas/primitive.erb | 2 +- 10 files changed, 32 insertions(+), 7 deletions(-) diff --git a/api/azure/type.rb b/api/azure/type.rb index 3ae844e84f4d..03b84808e4f5 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -3,7 +3,6 @@ module Api module Azure module Type - class ResourceGroupName < Api::Type::String def validate @order ||= 550 @@ -25,6 +24,11 @@ def validate end end + class ResourceReference < Api::Type::String + def validate + super + end + end end end end diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 4e4e5bb89887..5668b8e62a30 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -106,6 +106,11 @@ - The identifier of the Batch Account resource. returned: always type: str +account_endpoint: + description: + - The account endpoint used to interact with the Batch service. + returned: always + type: str ''' import time @@ -245,7 +250,8 @@ def exec_module(self, **kwargs): if self.state == 'present': self.results.update({ - 'id': response.get('id', None) + 'id': response.get('id', None), + 'account_endpoint': response.get('account_endpoint', None) }) return self.results diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index e84b552a71d6..79a533b5610c 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -79,6 +79,11 @@ func resourceArmBatchAccount() *schema.Resource { }, "tags": tagsSchema(), + + "account_endpoint": { + Type: schema.TypeString, + Computed: true, + }, }, } } @@ -169,6 +174,7 @@ func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error d.Set("location", azureRMNormalizeLocation(*location)) } if properties := resp.AccountProperties; properties != nil { + d.Set("account_endpoint", properties.AccountEndpoint) if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) } diff --git a/build/azterraform/website/docs/r/batch_account.html.markdown b/build/azterraform/website/docs/r/batch_account.html.markdown index 517d43599535..35d94ee8505d 100644 --- a/build/azterraform/website/docs/r/batch_account.html.markdown +++ b/build/azterraform/website/docs/r/batch_account.html.markdown @@ -81,6 +81,8 @@ The following attributes are exported: * `id` - The ID of the Batch Account. +* `account_endpoint` - The account endpoint used to interact with the Batch service. + ## Import diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 12f1ea57e6bc..5530c31c0be7 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -191,7 +191,7 @@ objects: name: tags description: A mapping of tags to assign to the batch account. azure_sdk_references: ['tags', '/tags'] - - !ruby/object:Api::Type::String + - !ruby/object:Api::Azure::Type::ResourceReference name: autoStorageAccountId description: The ID of the Batch Account auto storage account. azure_sdk_references: ['autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] @@ -222,3 +222,8 @@ objects: required: true input: true azure_sdk_references: ['/properties/keyVaultReference/url'] + - !ruby/object:Api::Type::String + name: accountEndpoint + description: The account endpoint used to interact with the Batch service. + output: true + azure_sdk_references: ['/properties/accountEndpoint'] diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 6959e4c36733..78fd5ff79aac 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -71,7 +71,7 @@ def returns_for_property(prop) || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) { - prop.name => { + prop.name.underscore => { 'description' => format_description(prop.description), 'returned' => 'always', 'type' => type, diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index d4439a74762a..f3fae2f3befd 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -28,6 +28,7 @@ def expand_funcs Api::Type::String => 'utils.String', Api::Azure::Type::Location => "utils.String", Api::Azure::Type::Tags => 'expandTags', + Api::Azure::Type::ResourceReference => "utils.String" } end diff --git a/provider/terraform.rb b/provider/terraform.rb index 8009ae0057fd..89b1b26c978b 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -61,7 +61,8 @@ def tf_types Api::Type::Array => 'schema.TypeList', Api::Type::KeyValuePairs => 'schema.TypeMap', Api::Type::Map => 'schema.TypeSet', - Api::Type::Fingerprint => 'schema.TypeString' + Api::Type::Fingerprint => 'schema.TypeString', + Api::Azure::Type::ResourceReference => 'schema.TypeString' } end diff --git a/templates/azure/ansible/module/response_properties_update.erb b/templates/azure/ansible/module/response_properties_update.erb index e300439158e2..c2ff6ef93025 100644 --- a/templates/azure/ansible/module/response_properties_update.erb +++ b/templates/azure/ansible/module/response_properties_update.erb @@ -1,4 +1,4 @@ 'id': response.get('id', None) <% properties.each do |prop| -%> -'<%= prop.name -%>': response.get('??', None) +'<%= prop.name.underscore -%>': response.get('<%= prop.name.underscore -%>', None) <% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index ac2e12698e9e..18aa8baddfa8 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -127,5 +127,5 @@ <% end -%> }, <% else -%> - // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported +// TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> From 570b2cc19dafc7c0c2cf3a18103b9f67b2907200 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 12 Apr 2019 18:24:51 -0700 Subject: [PATCH 061/175] Add ID output property. --- api/type.rb | 3 +++ .../cloud/azure/azure_rm_batchaccount.py | 20 ++++++++-------- .../docs/r/batch_account.html.markdown | 2 +- products/azbatchaccount/api.yaml | 9 ++++++++ provider/ansible/documentation.rb | 3 ++- provider/ansible/module.rb | 2 +- provider/azure/ansible/helpers.rb | 10 +++++++- templates/ansible/resource.erb | 23 ++++++++----------- .../module/response_properties_update.erb | 1 - templates/terraform/resource.erb | 8 ++++--- .../terraform/resource.html.markdown.erb | 2 -- 11 files changed, 49 insertions(+), 34 deletions(-) diff --git a/api/type.rb b/api/type.rb index bc32b4516dba..6452997ae50b 100644 --- a/api/type.rb +++ b/api/type.rb @@ -43,6 +43,7 @@ module Fields attr_reader :new_type attr_reader :order + attr_reader :sample_value attr_reader :azure_sdk_references end @@ -75,6 +76,8 @@ def validate check_optional_property :order, ::Integer @order ||= 750 + check_optional_property :sample_value, ::String + check_property :azure_sdk_references, ::Array check_property_non_empty_list :azure_sdk_references, ::String diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 5668b8e62a30..04761c1126ff 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -48,7 +48,6 @@ location: description: - Specifies the supported Azure location where the resource exists. - required: true auto_storage_account: description: - The ID of the Batch Account auto storage account. @@ -103,18 +102,20 @@ RETURN = ''' id: description: - - The identifier of the Batch Account resource. + - The ID of the Batch account. returned: always type: str + sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct" account_endpoint: description: - The account endpoint used to interact with the Batch service. returned: always type: str + sample: sampleacct.westus.batch.azure.com ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.azure_rm_common import AzureRMModuleBase, normalize_location_name from ansible.module_utils.common.dict_transformations import _snake_to_camel try: @@ -146,7 +147,6 @@ def __init__(self): type='str' ), location=dict( - required=True, type='str' ), auto_storage_account=dict( @@ -186,14 +186,9 @@ def __init__(self): self.state = None self.to_do = Actions.NoAction - required_if = [ - ('state', 'present', []) - ] - super(AzureRMBatchAccount, self).__init__(derived_arg_spec=self.module_arg_spec, supports_check_mode=True, - supports_tags=True, - required_if=required_if) + supports_tags=True) def exec_module(self, **kwargs): """Main module execution method""" @@ -203,6 +198,11 @@ def exec_module(self, **kwargs): setattr(self, key, kwargs[key]) elif kwargs[key] is not None: self.batch_account[key] = kwargs[key] + + resource_group = self.get_resource_group(self.resource_group) + if not self.location: + self.location = resource_group.location + self.location = normalize_location_name(self.location) self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None diff --git a/build/azterraform/website/docs/r/batch_account.html.markdown b/build/azterraform/website/docs/r/batch_account.html.markdown index 35d94ee8505d..04d728c9fda3 100644 --- a/build/azterraform/website/docs/r/batch_account.html.markdown +++ b/build/azterraform/website/docs/r/batch_account.html.markdown @@ -79,7 +79,7 @@ The `key_vault_reference` block supports the following: The following attributes are exported: -* `id` - The ID of the Batch Account. +* `id` - The ID of the Batch account. * `account_endpoint` - The account endpoint used to interact with the Batch service. diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 5530c31c0be7..e14136655ad2 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -80,6 +80,8 @@ objects: response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_type_name: Account + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Name '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -222,8 +224,15 @@ objects: required: true input: true azure_sdk_references: ['/properties/keyVaultReference/url'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Batch account. + output: true + azure_sdk_references: ['/id'] + sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct' - !ruby/object:Api::Type::String name: accountEndpoint description: The account endpoint used to interact with the Batch service. output: true azure_sdk_references: ['/properties/accountEndpoint'] + sample_value: 'sampleacct.westus.batch.azure.com' diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 78fd5ff79aac..f40964b58a4c 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -41,7 +41,7 @@ def documentation_for_property(prop, object) (resourceref_description(prop) \ if prop.is_a?(Api::Type::ResourceRef) && !prop.resource_ref.readonly) ].flatten.compact, - 'required' => (true if required), + 'required' => (true if required && !is_location?(prop)), 'default' => (prop.default_value.to_s.underscore if prop.default_value), 'type' => ('bool' if prop.is_a? Api::Type::Boolean), 'aliases' => (prop.aliases if prop.aliases), @@ -75,6 +75,7 @@ def returns_for_property(prop) 'description' => format_description(prop.description), 'returned' => 'always', 'type' => type, + 'sample' => (prop.sample_value unless prop.sample_value.nil?), 'contains' => ( if prop.is_a?(Api::Type::NestedObject) prop.properties.map { |p| returns_for_property(p) }.reduce({}, :merge) diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index dd1cca44a443..09c45f17ed1a 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -53,7 +53,7 @@ def nested_obj_dict(prop, object, properties, spaces) # Returns an array of all base options for a given property. def prop_options(prop, _object, spaces) [ - ('required=True' if prop.required && !prop.default_value), + ('required=True' if prop.required && !prop.default_value && !is_location?(prop)), ("default=#{python_literal(prop.default_value)}" \ if prop.default_value), "type=#{quote_string(python_type(prop))}", diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index d257409a193f..99135133abb5 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -5,12 +5,20 @@ module Azure module Ansible module Helpers def is_tags?(property) - property.is_a?(Api::Azure::Type::Tags) + property.is_a? Api::Azure::Type::Tags end def is_tags_defined?(object) object.all_user_properties.any?{|p| is_tags?(p)} end + + def is_location?(property) + property.is_a? Api::Azure::Type::Location + end + + def is_location_defined?(object) + object.all_user_properties.any?{|p| is_location?(p)} + end end end end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 476eabdda602..bd0ad93d6d6f 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -84,17 +84,11 @@ EXAMPLES = ''' <% end -%> RETURN = ''' -<%= to_yaml(output_properties.map{|p| returns_for_property(p)}.reduce({ - 'id'=> { - 'description' => ["The identifier of the #{object.name.titlecase} resource."], - 'returned' => 'always', - 'type' => 'str', - } -}, :merge)) -%> +<%= to_yaml(output_properties.map{|p| returns_for_property(p)}.reduce({}, :merge)) -%> ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.azure_rm_common import AzureRMModuleBase<%= lines(', normalize_location_name') if is_location_defined?(object) -%> from ansible.module_utils.common.dict_transformations import _snake_to_camel try: @@ -133,15 +127,10 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.state = None self.to_do = Actions.NoAction - required_if = [ - ('state', 'present', []) - ] - <%= lines(build_multiline_method_call("super(AzureRM#{object.name}, self).__init__(", [ "derived_arg_spec=self.module_arg_spec", "supports_check_mode=True", - "supports_tags=#{python_literal(is_tags_defined?(object))}", - "required_if=required_if" + "supports_tags=#{python_literal(is_tags_defined?(object))}" ], ")", 8)) -%> def exec_module(self, **kwargs): @@ -152,9 +141,15 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): setattr(self, key, kwargs[key]) elif kwargs[key] is not None: self.<%= root_object_field -%>[key] = kwargs[key] + <% input_properties.each do |prop| -%> <% if prop.is_a? Api::Type::Enum -%> self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], True) +<% elsif is_location? prop -%> + resource_group = self.get_resource_group(self.resource_group) + if not self.location: + self.location = resource_group.location + self.location = normalize_location_name(self.location) <% end -%> <% end -%> diff --git a/templates/azure/ansible/module/response_properties_update.erb b/templates/azure/ansible/module/response_properties_update.erb index c2ff6ef93025..6c1df72d1ed8 100644 --- a/templates/azure/ansible/module/response_properties_update.erb +++ b/templates/azure/ansible/module/response_properties_update.erb @@ -1,4 +1,3 @@ -'id': response.get('id', None) <% properties.each do |prop| -%> '<%= prop.name.underscore -%>': response.get('<%= prop.name.underscore -%>', None) <% end -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index baae0f835199..640d59c2c483 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -20,11 +20,13 @@ package azurerm <% properties = object.all_user_properties + schema_properties = properties.reject{|p| p.name == 'id' || get_property_value(p, 'hide_from_schema', false)} # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. settable_properties = properties.reject{ |v| v.output && !v.is_a?(Api::Type::Fingerprint) }.reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} + output_properties = properties.reject{|p| p.name == 'id'} # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager api_name_lower = String.new(product_ns) api_name_lower[0] = api_name_lower[0].downcase @@ -80,7 +82,7 @@ func resource<%= resource_name -%>() *schema.Resource { <%= lines(compile(object.custom_code.resource_definition)) if object.custom_code.resource_definition -%> Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> -<% order_azure_properties(properties.reject{|p| get_property_value(p, 'hide_from_schema', false)}).each do |prop| -%> +<% order_azure_properties(schema_properties).each do |prop| -%> <%= lines_before(build_schema_property(prop, object, 12)) -%> <% end -%> @@ -181,12 +183,12 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) d.SetId("") return nil } - return <%= lines(build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, properties, object)) -%> + return <%= lines(build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, output_properties, object)) -%> } <%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> -<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read.response, resource_name, flatten_queue, properties, object)) -%> +<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read.response, resource_name, flatten_queue, output_properties, object)) -%> return nil } diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 2252f30ac323..83745a9b53b2 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -114,8 +114,6 @@ The following arguments are supported: ## Attributes Reference The following attributes are exported: - -* `id` - The ID of the <%= resource_name.titlecase -%>. <% properties.select(&:output).each do |prop| -%> <%= lines(build_property_documentation(prop)) -%> <% end -%> From 9d18f3ec2ef739ef77dde6b5a195b25e08a90348 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 12 Apr 2019 18:46:07 -0700 Subject: [PATCH 062/175] Add ID output to all api.yaml for Azure. --- .../cloud/azure/azure_rm_batchaccount.py | 2 +- .../resource_arm_container_registry.go | 71 ++++++++++--------- .../resource_arm_container_registry_test.go | 5 +- .../azurerm/resource_arm_resource_group.go | 18 ++++- ...rm_service_bus_disaster_recovery_config.go | 34 +++++---- ...rvice_bus_disaster_recovery_config_test.go | 12 +--- .../r/api_management_policy.html.markdown | 2 +- .../automation_string_variable.html.markdown | 2 +- .../docs/r/container_registry.html.markdown | 8 +-- .../docs/r/resource_group.html.markdown | 2 +- ...bus_disaster_recovery_config.html.markdown | 6 +- products/azapimngpolicy/api.yaml | 5 ++ products/azautomationstringvariable/api.yaml | 5 ++ products/azbatchaccount/ansible.yaml | 2 +- products/azcontainerregistry/api.yaml | 16 ++++- products/azresourcegroup/api.yaml | 26 +++---- products/azservicebusrecovery/api.yaml | 11 +-- .../sdk/errorf_with_resource_name.erb | 2 +- 18 files changed, 134 insertions(+), 95 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 04761c1126ff..735eb33c8498 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -29,7 +29,7 @@ DOCUMENTATION = ''' --- module: azure_rm_batchaccount -version_added: "2.8" +version_added: "2.9" short_description: Manages a Batch Account on Azure. diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 2fadf8c2450e..66b307934fca 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -32,7 +32,7 @@ func resourceArmContainerRegistry() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ForceNew: true, + ForceNew: true, }, "resource_group_name": resourceGroupNameSchema(), @@ -48,13 +48,13 @@ func resourceArmContainerRegistry() *schema.Resource { "sku": { Type: schema.TypeString, Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(containerregistry.Classic), - string(containerregistry.Basic), - string(containerregistry.Standard), - string(containerregistry.Premium), - }, false), - Default: "Classic", + ValidateFunc: validation.StringInSlice([]string{ + string(containerregistry.Classic), + string(containerregistry.Basic), + string(containerregistry.Standard), + string(containerregistry.Premium), + }, false), + Default: string(containerregistry.Classic), }, "storage_account_id": { @@ -78,23 +78,36 @@ func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{} name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_container_registry", *resp.ID) + } + } + location := azureRMNormalizeLocation(d.Get("location").(string)) - sku := d.Get("sku").(string) adminEnabled := d.Get("admin_enabled").(bool) storageAccountId := d.Get("storage_account_id").(string) + sku := d.Get("sku").(string) tags := d.Get("tags").(map[string]interface{}) parameters := containerregistry.Registry{ Location: utils.String(location), - Sku: &containerregistry.Sku{ - Name: containerregistry.SkuName(sku), - }, RegistryProperties: &containerregistry.RegistryProperties{ AdminUserEnabled: utils.Bool(adminEnabled), StorageAccount: &containerregistry.StorageAccountProperties{ ID: utils.String(storageAccountId), }, }, + Sku: &containerregistry.Sku{ + Name: containerregistry.SkuName(sku), + }, Tags: expandTags(tags), } @@ -126,7 +139,7 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup name := id.Path["registries"] @@ -142,15 +155,11 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) } - d.Set("name", resp.Name) d.Set("resource_group_name", resourceGroup) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } - if sku := resp.Sku; sku != nil { - d.Set("sku", string(sku.Name)) - } if registryProperties := resp.RegistryProperties; registryProperties != nil { d.Set("admin_enabled", registryProperties.AdminUserEnabled) if storageAccount := registryProperties.StorageAccount; storageAccount != nil { @@ -158,6 +167,9 @@ func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) } } d.Set("login_server", resp.LoginServer) + if sku := resp.Sku; sku != nil { + d.Set("sku", string(sku.Name)) + } flattenAndSetTags(d, resp.Tags) return nil @@ -167,38 +179,29 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} client := meta.(*ArmClient).containerRegistryClient ctx := meta.(*ArmClient).StopContext - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) - } - resourceGroup := id.ResourceGroup - name := id.Path["registries"] - - sku := d.Get("sku").(string) + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) adminEnabled := d.Get("admin_enabled").(bool) storageAccountId := d.Get("storage_account_id").(string) + sku := d.Get("sku").(string) tags := d.Get("tags").(map[string]interface{}) parameters := containerregistry.RegistryUpdateParameters{ - Sku: &containerregistry.Sku{ - Name: containerregistry.SkuName(sku), - }, RegistryPropertiesUpdateParameters: &containerregistry.RegistryPropertiesUpdateParameters{ AdminUserEnabled: utils.Bool(adminEnabled), StorageAccount: &containerregistry.StorageAccountProperties{ ID: utils.String(storageAccountId), }, }, + Sku: &containerregistry.Sku{ + Name: containerregistry.SkuName(sku), + }, Tags: expandTags(tags), } - future, err := client.Update(ctx, resourceGroup, name, parameters) - if err != nil { + if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { return fmt.Errorf("Error updating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for update of Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } return resourceArmContainerRegistryRead(d, meta) } @@ -210,7 +213,7 @@ func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{} id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Container Registry ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup name := id.Path["registries"] diff --git a/build/azterraform/azurerm/resource_arm_container_registry_test.go b/build/azterraform/azurerm/resource_arm_container_registry_test.go index 5c70ae8d74f5..7b9be6724116 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry_test.go +++ b/build/azterraform/azurerm/resource_arm_container_registry_test.go @@ -33,10 +33,7 @@ func testCheckAzureRMContainerRegistryExists(resourceName string) resource.TestC } name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group name found in state for Container Registry: %q", name) - } + resourceGroup := rs.Primary.Attributes["resource_group_name"] client := testAccProvider.Meta().(*ArmClient).containerRegistryClient ctx := testAccProvider.Meta().(*ArmClient).StopContext diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go index 35feea8dbc7e..d5868a00e66d 100644 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ b/build/azterraform/azurerm/resource_arm_resource_group.go @@ -43,6 +43,19 @@ func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface ctx := meta.(*ArmClient).StopContext name := d.Get("name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Resource Group %q: %+v", name, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_resource_group", *resp.ID) + } + } + location := azureRMNormalizeLocation(d.Get("location").(string)) tags := d.Get("tags").(map[string]interface{}) @@ -75,7 +88,7 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Resource Group ID %q: %+v", d.Id(), err) + return err } name := id.ResourceGroup @@ -90,7 +103,6 @@ func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) erro } - d.Set("name", resp.Name) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) @@ -108,7 +120,7 @@ func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) er id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Resource Group ID %q: %+v", d.Id(), err) + return err } name := id.ResourceGroup diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go index 9495884f6ec9..b7a70f813fb2 100644 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go @@ -32,7 +32,7 @@ func resourceArmServiceBusDisasterRecoveryConfig() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ForceNew: true, + ForceNew: true, }, "resource_group_name": resourceGroupNameSchema(), @@ -40,7 +40,7 @@ func resourceArmServiceBusDisasterRecoveryConfig() *schema.Resource { "namespace_name": { Type: schema.TypeString, Required: true, - ForceNew: true, + ForceNew: true, }, "alternate_name": { @@ -63,6 +63,19 @@ func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceD name := d.Get("name").(string) resourceGroup := d.Get("resource_group_name").(string) servicebusName := d.Get("namespace_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, servicebusName, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_service_bus_disaster_recovery_config", *resp.ID) + } + } + alternateName := d.Get("alternate_name").(string) partnerNamespace := d.Get("partner_namespace").(string) @@ -75,16 +88,16 @@ func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceD if _, err := client.CreateOrUpdate(ctx, resourceGroup, servicebusName, name, parameters); err != nil { - return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) } resp, err := client.Get(ctx, resourceGroup, servicebusName, name) if err != nil { - return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q) ID", name, resourceGroup, servicebusName) + return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q) ID", name, servicebusName, resourceGroup) } d.SetId(*resp.ID) @@ -97,7 +110,7 @@ func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, met id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Service Bus Disaster Recovery Config ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup servicebusName := id.Path["namespaces"] @@ -110,14 +123,11 @@ func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, met d.SetId("") return nil } - return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) } - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("namespace_name", servicebusName) if armDisasterRecoveryProperties := resp.ArmDisasterRecoveryProperties; armDisasterRecoveryProperties != nil { d.Set("alternate_name", armDisasterRecoveryProperties.AlternateName) d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) @@ -134,14 +144,14 @@ func resourceArmServiceBusDisasterRecoveryConfigDelete(d *schema.ResourceData, m id, err := parseAzureResourceID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Service Bus Disaster Recovery Config ID %q: %+v", d.Id(), err) + return err } resourceGroup := id.ResourceGroup servicebusName := id.Path["namespaces"] name := id.Path["disasterRecoveryConfigs"] if _, err := client.Delete(ctx, resourceGroup, servicebusName, name); err != nil { - return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) + return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go index 7565d9b38ed5..48fbfc0c3e79 100644 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go @@ -33,21 +33,15 @@ func testCheckAzureRMServiceBusDisasterRecoveryConfigExists(resourceName string) } name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group name found in state for Service Bus Disaster Recovery Config: %q", name) - } - servicebusName, hasServicebusName := rs.Primary.Attributes["namespace_name"] - if !hasServicebusName { - return fmt.Errorf("Bad: no namespace name found in state for Service Bus Disaster Recovery Config: %q", name) - } + resourceGroup := rs.Primary.Attributes["resource_group_name"] + servicebusName := rs.Primary.Attributes["namespace_name"] client := testAccProvider.Meta().(*ArmClient).serviceBusRecoveryClient ctx := testAccProvider.Meta().(*ArmClient).StopContext if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Resource Group %q, Namespace Name %q) does not exist", name, resourceGroup, servicebusName) + return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q) does not exist", name, servicebusName, resourceGroup) } return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) } diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown index 917eb40c3c18..340f0768d59c 100644 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -68,7 +68,7 @@ The following arguments are supported: The following attributes are exported: -* `id` - The ID of the Api Management Policy. +* `id` - The ID of the API Management Service. ## Import diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index 9e517da8a670..6ba199ab0017 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -70,7 +70,7 @@ The following arguments are supported: The following attributes are exported: -* `id` - The ID of the Automation String Variable. +* `id` - The ID of the Automation Variable. ## Import diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown index edc193260a01..3ccbc710c170 100644 --- a/build/azterraform/website/docs/r/container_registry.html.markdown +++ b/build/azterraform/website/docs/r/container_registry.html.markdown @@ -61,18 +61,18 @@ The following arguments are supported: * `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. -* `sku` - (Optional) The SKU name of the the container registry. Defaults to `Classic`. - * `admin_enabled` - (Optional) Specifies whether the admin user is enabled. Defaults to `false`. * `storage_account_id` - (Optional) The ID of a Storage Account which must be located in the same Azure Region as the Container Registry. +* `sku` - (Optional) The SKU name of the the container registry. Defaults to `Classic`. + * `tags` - (Optional) A mapping of tags to assign to the container registry. ## Attributes Reference The following attributes are exported: -* `id` - The container registry ID. - * `login_server` - The URL that can be used to log into the container registry. + +* `id` - The ID of the container registry. diff --git a/build/azterraform/website/docs/r/resource_group.html.markdown b/build/azterraform/website/docs/r/resource_group.html.markdown index 666e237fb34f..6608cb290d55 100644 --- a/build/azterraform/website/docs/r/resource_group.html.markdown +++ b/build/azterraform/website/docs/r/resource_group.html.markdown @@ -52,4 +52,4 @@ The following arguments are supported: The following attributes are exported: -* `id` - The resource group ID. +* `id` - The ID of the resource group. diff --git a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown index c3c83a826802..dcb154d16a54 100644 --- a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown +++ b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown @@ -48,12 +48,12 @@ The following arguments are supported: * `namespace_name` - (Required) The name of the service bus namespace in which the config is created. Changing this forces a new resource to be created. -* `partner_namespace` - (Optional) The parter namespace of the service bus disaster recovery. - * `alternate_name` - (Optional) The alternative name of the service bus disaster recovery. +* `partner_namespace` - (Optional) The parter namespace of the service bus disaster recovery. + ## Attributes Reference The following attributes are exported: -* `id` - The service bus disaster recovery config ID. +* `id` - The ID of the service bus disaster recovery. diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml index 77291e29c152..9d41b7cde107 100644 --- a/products/azapimngpolicy/api.yaml +++ b/products/azapimngpolicy/api.yaml @@ -111,3 +111,8 @@ objects: description: 'The content format of the Policy.' order: 1100 azure_sdk_references: ['/properties/contentFormat'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the API Management Policy. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index ef0fef3b5614..75aed574a957 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -125,3 +125,8 @@ objects: description: 'The encrypted flag of the Automation Variable.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index a7eb41f2811a..63d5c9ab9787 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -7,7 +7,7 @@ manifest: !ruby/object:Provider::Ansible::Manifest requirements: - python >= 2.6 - requests >= 2.18.4 - version_added: '2.8' + version_added: '2.9' author: Junyi Yi (@JunyiYi) overrides: !ruby/object:Provider::ResourceOverrides BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index 7ece3d5983b4..af527d3404bd 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -17,8 +17,13 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: Microsoft.ContainerRegistry + go_client_namespace: containerregistry + go_client: containerRegistryClient + python_client_namespace: '?' + python_client: '?' create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Create + python_func_name: create async: true request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -54,6 +59,7 @@ objects: go_field_name: Tags read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get + python_func_name: get request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -94,6 +100,7 @@ objects: go_field_name: Tags update: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Update + python_func_name: update request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -126,6 +133,7 @@ objects: go_field_name: Tags delete: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Delete + python_func_name: delete async: true request: 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -144,21 +152,18 @@ objects: required: true input: true azure_sdk_references: ['registryName', '/name'] - order: 800 - !ruby/object:Api::Azure::Type::ResourceGroupName name: 'resourceGroupName' description: 'The name of the resource group in which to create the Container Registry.' required: true input: true azure_sdk_references: ['resourceGroupName'] - order: 810 - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'Specifies the supported Azure location where the resource exists.' required: true input: true azure_sdk_references: ['/location'] - order: 820 - !ruby/object:Api::Type::Enum name: 'sku' values: @@ -188,3 +193,8 @@ objects: name: 'tags' description: 'A mapping of tags to assign to the container registry.' azure_sdk_references: ['/tags'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the container registry. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 867ae606af87..325e4c773bb1 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -16,8 +16,14 @@ objects: base_url: NotUsedInAzure azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Resources + go_client_namespace: resources + go_client: resourceGroupsClient + python_client_namespace: '?' + python_client: '?' create: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: CreateOrUpdate + python_func_name: create_or_update request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -31,6 +37,7 @@ objects: go_field_name: Tags read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get + python_func_name: get request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: resourceGroups @@ -44,21 +51,9 @@ objects: go_field_name: Location '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Tags - update: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags delete: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Delete + python_func_name: delete async: true request: 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject @@ -86,3 +81,8 @@ objects: name: 'tags' description: 'A mapping of tags to assign to the resource group.' azure_sdk_references: ['/tags'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the resource group. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index e421b75f1bb8..c1989be24176 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -17,6 +17,8 @@ objects: azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition provider_name: servicebus + go_client_namespace: servicebus + go_client: serviceBusRecoveryClient python_client_namespace: azure.mgmt.servicebus python_client: ServiceBusManagementClient.disaster_recovery_configs create: !ruby/object:Api::Azure::SDKOperationDefinition @@ -63,10 +65,6 @@ objects: go_variable_name: name python_parameter_name: name response: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: resourceGroup - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: servicebusName '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters go_type_name: ArmDisasterRecovery @@ -128,3 +126,8 @@ objects: name: 'AlternateName' description: 'The alternative name of the service bus disaster recovery.' azure_sdk_references: ['/properties/alternateName'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the service bus disaster recovery. + output: true + azure_sdk_references: ['/id'] diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index fb63af1767ac..6c58cb8c3152 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -20,4 +20,4 @@ res_name = "#{get_property_value(object, "name_in_logs", nil) || object.name.titlecase}" if res_name == "" res_name += " (#{depends.reverse.join(' / ')})" unless depends.empty? -%> -fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= res_var != "" ? "#{res_var}, " : "" -%><%= depends_vars.reverse.join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file +fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= ([res_var] + (depends_vars.reverse)).join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file From fbe532670255e64064c085c2314b706a03700472 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 12 Apr 2019 19:07:20 -0700 Subject: [PATCH 063/175] Add idempotency and resource ref to Ansible. --- .../lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py | 5 +++-- products/azbatchaccount/api.yaml | 1 + products/azresourcegroup/api.yaml | 2 -- provider/ansible.rb | 1 + provider/ansible/documentation.rb | 1 + templates/ansible/resource.erb | 4 +++- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 735eb33c8498..9b0895fdc332 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -150,7 +150,7 @@ def __init__(self): type='str' ), auto_storage_account=dict( - type='str' + type='raw' ), key_vault_reference=dict( type='dict', @@ -203,6 +203,7 @@ def exec_module(self, **kwargs): if not self.location: self.location = resource_group.location self.location = normalize_location_name(self.location) + self.batch_account['auto_storage_account'] = self.normalize_resource_id(self.batch_account['auto_storage_account'], '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct') self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None @@ -223,7 +224,7 @@ def exec_module(self, **kwargs): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - self.to_do = Actions.Update + self.idempotency_check(old_response, self.batch_account) if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the Batch Account instance") diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index e14136655ad2..8ced4f404f33 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -197,6 +197,7 @@ objects: name: autoStorageAccountId description: The ID of the Batch Account auto storage account. azure_sdk_references: ['autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] + sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct' - !ruby/object:Api::Type::Enum name: poolAllocationMode description: The pool acclocation mode of the Batch Account. diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index 325e4c773bb1..dc47c6b65b3b 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -69,14 +69,12 @@ objects: required: true input: true azure_sdk_references: ['name', '/name'] - order: 800 - !ruby/object:Api::Azure::Type::Location name: 'location' description: 'The location where the resource group should be created.' required: true input: true azure_sdk_references: ['/location'] - order: 900 - !ruby/object:Api::Azure::Type::Tags name: 'tags' description: 'A mapping of tags to assign to the resource group.' diff --git a/provider/ansible.rb b/provider/ansible.rb index a3e477c6db29..5809bd526f14 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -62,6 +62,7 @@ def python_type(prop) return 'str' if prop.resource_ref.readonly return 'dict' end + return 'raw' if prop.is_a? Api::Azure::Type::ResourceReference PYTHON_TYPE_FROM_MM_TYPE.fetch(prop.class.to_s, 'str') end diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index f40964b58a4c..650905766bad 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -64,6 +64,7 @@ def documentation_for_property(prop, object) # This will eventually be converted to YAML def returns_for_property(prop) type = python_type(prop) + type = 'str' if prop.is_a? Api::Azure::Type::ResourceReference # Complex types only mentioned in reference to RETURNS YAML block # Complex types are nested objects traditionally, but arrays of nested # objects will be included to avoid linting errors. diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index bd0ad93d6d6f..6d01d3a96508 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -150,6 +150,8 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): if not self.location: self.location = resource_group.location self.location = normalize_location_name(self.location) +<% elsif prop.is_a? Api::Azure::Type::ResourceReference -%> + self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = self.normalize_resource_id(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], <%= python_literal(prop.sample_value) -%>) <% end -%> <% end -%> @@ -171,7 +173,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - self.to_do = Actions.Update + self.idempotency_check(old_response, self.<%= root_object_field -%>) if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the <%= object.name.titlecase -%> instance") From 31aa9ddd26527170b20f7aa25014294431ebfa50 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 17 Apr 2019 17:27:35 -0700 Subject: [PATCH 064/175] Fix Ansible runtime errors. --- .../cloud/azure/azure_rm_batchaccount.py | 20 ++++++++++--------- .../azurerm/resource_arm_batch_account.go | 17 ++++++++++------ products/azbatchaccount/api.yaml | 8 ++++---- products/azbatchaccount/terraform.yaml | 4 +++- .../terraform_storage_id_assign.erb | 13 ++++++++++++ provider/azure/terraform/property_override.rb | 2 ++ provider/azure/terraform/sdk/sub_template.rb | 10 ++++++++++ templates/ansible/resource.erb | 16 +++++++++------ .../sdktypes/property_to_sdkobject.erb | 2 +- .../sdktypes/sdkfield_block_assignments.erb | 3 +++ templates/terraform/resource.erb | 3 +++ 11 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 products/azbatchaccount/terraform_storage_id_assign.erb create mode 100644 templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 9b0895fdc332..cb85ea218a54 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -200,10 +200,12 @@ def exec_module(self, **kwargs): self.batch_account[key] = kwargs[key] resource_group = self.get_resource_group(self.resource_group) - if not self.location: - self.location = resource_group.location - self.location = normalize_location_name(self.location) - self.batch_account['auto_storage_account'] = self.normalize_resource_id(self.batch_account['auto_storage_account'], '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct') + if self.batch_account.get('location') is None: + self.batch_account['location'] = resource_group.location + if self.batch_account.get('auto_storage_account') is not None: + self.batch_account['auto_storage_account'] = self.normalize_resource_id( + self.batch_account['auto_storage_account'], + '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct') self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None @@ -267,14 +269,14 @@ def create_update_batchaccount(self): try: if self.to_do == Actions.Create: response = self.mgmt_client.batch_account.create(resource_group_name=self.resource_group, - name=self.name, + account_name=self.name, parameters=self.batch_account) else: response = self.mgmt_client.batch_account.update(resource_group_name=self.resource_group, - name=self.name, + account_name=self.name, tags=self.tags, auto_storage=self.auto_storage) - if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): + if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): response = self.get_poller_result(response) except CloudError as exc: self.log('Error attempting to create the Batch Account instance.') @@ -290,7 +292,7 @@ def delete_batchaccount(self): self.log("Deleting the Batch Account instance {0}".format(self.name)) try: response = self.mgmt_client.batch_account.delete(resource_group_name=self.resource_group, - name=self.name) + account_name=self.name) except CloudError as e: self.log('Error attempting to delete the Batch Account instance.') self.fail("Error deleting the Batch Account instance: {0}".format(str(e))) @@ -308,7 +310,7 @@ def get_batchaccount(self): found = False try: response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, - name=self.name) + account_name=self.name) found = True self.log("Response : {0}".format(response)) self.log("Batch Account instance : {0} found".format(response.name)) diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 79a533b5610c..8f9f1d3f7e9b 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -116,15 +116,17 @@ func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) err parameters := batch.AccountCreateParameters{ Location: utils.String(location), AccountCreateProperties: &batch.AccountCreateProperties{ - AutoStorage: &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(storageAccountId), - }, KeyVaultReference: expandArmBatchAccountKeyVaultReference(keyVaultReference), PoolAllocationMode: batch.PoolAllocationMode(poolAllocationMode), }, Tags: expandTags(tags), } + if storageAccountId != "" { + parameters.AccountCreateProperties.AutoStorage = &batch.AutoStorageBaseProperties{ + StorageAccountID: &storageAccountId, + } + } future, err := client.Create(ctx, resourceGroup, name, parameters) if err != nil { @@ -198,12 +200,15 @@ func resourceArmBatchAccountUpdate(d *schema.ResourceData, meta interface{}) err tags := d.Get("tags").(map[string]interface{}) parameters := batch.AccountUpdateParameters{ - AccountUpdateProperties: &batch.AccountUpdateProperties{ + Tags: expandTags(tags), + } + + if storageAccountId != "" { + parameters.AccountUpdateProperties = &batch.AccountUpdateProperties{ AutoStorage: &batch.AutoStorageBaseProperties{ StorageAccountID: utils.String(storageAccountId), }, - }, - Tags: expandTags(tags), + } } if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 8ced4f404f33..47c16e6554e1 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -34,7 +34,7 @@ objects: 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name - python_parameter_name: name + python_parameter_name: account_name python_variable_name: name '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject go_variable_name: parameters @@ -75,7 +75,7 @@ objects: 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name - python_parameter_name: name + python_parameter_name: account_name python_variable_name: name response: '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject @@ -121,7 +121,7 @@ objects: 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name - python_parameter_name: name + python_parameter_name: account_name python_variable_name: name 'tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject applicable_to: [python] @@ -164,7 +164,7 @@ objects: 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject id_portion: batchAccounts go_variable_name: name - python_parameter_name: name + python_parameter_name: account_name python_variable_name: name description: | diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml index fe934d996919..0bec1c103398 100644 --- a/products/azbatchaccount/terraform.yaml +++ b/products/azbatchaccount/terraform.yaml @@ -6,10 +6,12 @@ overrides: !ruby/object:Provider::ResourceOverrides name: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation function: validateAzureRMBatchAccountName - autoStorageAccountId: !ruby/object:Provider::Terraform::PropertyOverride + autoStorageAccountId: !ruby/object:Provider::Azure::Terraform::PropertyOverride name: storageAccountId validation: !ruby/object:Provider::Terraform::Validation function: azure.ValidateResourceIDOrEmpty + sdkfield_assign_type: block + custom_sdkfield_assign: products/azbatchaccount/terraform_storage_id_assign.erb custom_code: !ruby/object:Provider::Terraform::CustomCode extra_functions: products/azbatchaccount/terraform_extra_functions.erb document_examples: diff --git a/products/azbatchaccount/terraform_storage_id_assign.erb b/products/azbatchaccount/terraform_storage_id_assign.erb new file mode 100644 index 000000000000..7997e4a32891 --- /dev/null +++ b/products/azbatchaccount/terraform_storage_id_assign.erb @@ -0,0 +1,13 @@ +<% if sdk_type_defs == object.azure_sdk_definition.create.request -%> +if storageAccountId != "" { + parameters.AccountCreateProperties.AutoStorage = &batch.AutoStorageBaseProperties{ + StorageAccountID: &storageAccountId, + } +} +<% elsif sdk_type_defs == object.azure_sdk_definition.update.request -%> +parameters.AccountUpdateProperties = &batch.AccountUpdateProperties{ + AutoStorage: &batch.AutoStorageBaseProperties{ + StorageAccountID: utils.String(storageAccountId), + }, +} +<% end -%> \ No newline at end of file diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 6a9277f7df29..3548141f4931 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -6,6 +6,7 @@ module Terraform module OverrideFields attr_reader :name_in_logs attr_reader :hide_from_schema + attr_reader :sdkfield_assign_type attr_reader :custom_schema_definition attr_reader :custom_schema_get attr_reader :custom_schema_set @@ -25,6 +26,7 @@ def validate check_optional_property :custom_schema_get, String check_optional_property :custom_schema_set, String check_optional_property :custom_sdkfield_assign, String + check_property_oneof_default :sdkfield_assign_type, ['inline', 'block'], 'inline' end private diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 82af7ce8c444..f6eafc93bea3 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -48,6 +48,16 @@ def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_ object: object end + def build_sdkfield_block_assignments(resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) + compile_template 'templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb', + indentation: indentation, + resource_name: resource_name, + sdk_type_defs: sdk_type_defs, + expand_queue: expand_queue, + properties: properties, + object: object + end + def build_schema_assignment(input, output, property, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object) compile_template property_to_schema_assignment_template(property, sdk_type_defs[api_path]), input_statement: input, diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 6d01d3a96508..d2b8fc131935 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -131,7 +131,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): "derived_arg_spec=self.module_arg_spec", "supports_check_mode=True", "supports_tags=#{python_literal(is_tags_defined?(object))}" - ], ")", 8)) -%> + ], ')', 8)) -%> def exec_module(self, **kwargs): """Main module execution method""" @@ -147,11 +147,15 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], True) <% elsif is_location? prop -%> resource_group = self.get_resource_group(self.resource_group) - if not self.location: - self.location = resource_group.location - self.location = normalize_location_name(self.location) + if self.<%= root_object_field -%>.get('location') is None: + self.<%= root_object_field -%>['location'] = resource_group.location <% elsif prop.is_a? Api::Azure::Type::ResourceReference -%> - self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = self.normalize_resource_id(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], <%= python_literal(prop.sample_value) -%>) +<% prop_field_name = python_field_name(prop, object.azure_sdk_definition.create) -%> +<% prop_expr = "self.#{root_object_field}['#{prop_field_name}']" -%> + if self.<%= root_object_field -%>.get('<%= prop_field_name -%>') is not None: + <%= prop_expr -%> = self.normalize_resource_id( + <%= prop_expr -%>, + <%= python_literal(prop.sample_value) -%>) <% end -%> <% end -%> @@ -221,7 +225,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): else: <%= lines(build_sdk_method_invocation(python_sdk_sub_client, object.azure_sdk_definition.update, 16)) -%> <% end -%> - if isinstance(response, LROPoller) or isinstance(response.AzureOperationPoller): + if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): response = self.get_poller_result(response) except CloudError as exc: self.log('Error attempting to create the <%= object.name.titlecase -%> instance.') diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 0ddeeff83a80..6a75fb9fe751 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -3,7 +3,7 @@ sdk_type = sdk_type_defs[api_path] direct_children = Set.new - properties.each do |prop| + properties.select{|p| get_property_value(p, 'sdkfield_assign_type', 'inline') == 'inline'}.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| if api_path == '/' && child_api_path.start_with?(api_path) sub_paths = child_api_path.split('/') diff --git a/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb b/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb new file mode 100644 index 000000000000..76a361e0eae8 --- /dev/null +++ b/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb @@ -0,0 +1,3 @@ +<% properties.select{|p| get_property_value(p, 'sdkfield_assign_type', 'inline') == 'block'}.each do |prop| -%> +<%= lines(build_sdk_field_assignment(prop, get_applicable_reference(prop.azure_sdk_references, sdk_type_defs), sdk_type_defs, resource_name, expand_queue, properties, object)) -%> +<% end -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 640d59c2c483..9dc953a3aff4 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -133,6 +133,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, settable_properties, object, 8)) -%> } +<%= lines(build_sdkfield_block_assignments(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") if err != nil { @@ -211,6 +212,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, updatable_properties, object, 8)) -%> } +<%= lines(build_sdkfield_block_assignments(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> + <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { return <%= lines(build_errorf_with_resource_name("Error updating %s", true, sdk_operation, properties, object)) -%> From 1e3bc73fa18c48fe8945c03fddf2edbc7b67db7b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 18 Apr 2019 17:06:21 -0700 Subject: [PATCH 065/175] Add Azure SDK definition overrides. --- api/azure/sdk_definition.rb | 17 ++++++--- api/azure/sdk_definition_override.rb | 2 +- api/azure/sdk_operation_definition.rb | 32 +++++++++++++---- .../sdk_operation_definition_override.rb | 4 +-- api/azure/sdk_type_definition.rb | 13 +++++++ api/azure/sdk_type_definition_override.rb | 6 ++++ api/compiler.rb | 1 + api/resource.rb | 6 ++-- .../azurerm/resource_arm_batch_account.go | 12 +++---- products/azbatchaccount/terraform.yaml | 7 ++-- provider/azure/terraform/property_override.rb | 2 -- provider/azure/terraform/resource_override.rb | 3 ++ provider/azure/terraform/schema.rb | 9 +++++ provider/azure/terraform/sdk/sub_template.rb | 10 +++--- provider/resource_override.rb | 9 +++-- .../terraform/sdktypes/enum_field_assign.erb | 2 +- .../sdktypes/expand_func_field_assign.erb | 4 +-- .../sdktypes/nested_object_field_assign.erb | 4 +-- .../sdktypes/property_to_sdkobject.erb | 6 ++-- .../property_to_sdkobject_empty_sensitive.erb | 35 +++++++++++++++++++ .../sdktypes/sdkfield_block_assignments.erb | 3 -- templates/terraform/resource.erb | 4 +-- 22 files changed, 144 insertions(+), 47 deletions(-) create mode 100644 templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb delete mode 100644 templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 9d0e0d8f1dab..bcd26e8069c1 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -27,11 +27,18 @@ def validate check_property :delete, Api::Azure::SDKOperationDefinition end - def merge_overrides(overrides, language) - @create.merge_overrides(nil, language) unless @create.nil? - @read.merge_overrides(nil, language) unless @read.nil? - @update.merge_overrides(nil, language) unless @update.nil? - @delete.merge_overrides(nil, language) unless @delete.nil? + def filter_language!(language) + @create.filter_language!(language) unless @create.nil? + @read.filter_language!(language) unless @read.nil? + @update.filter_language!(language) unless @update.nil? + @delete.filter_language!(language) unless @delete.nil? + end + + def merge_overrides!(overrides) + @create.merge_overrides!(overrides.create) if !@create.nil? && !overrides.create.nil? + @read.merge_overrides!(nil) if !@read.nil? && !overrides.read.nil? + @update.merge_overrides!(nil) if !@update.nil? && !overrides.update.nil? + @delete.merge_overrides!(nil) if !@delete.nil? && !overrides.delete.nil? end end end diff --git a/api/azure/sdk_definition_override.rb b/api/azure/sdk_definition_override.rb index 014eabc70b3a..8b17fbc00450 100644 --- a/api/azure/sdk_definition_override.rb +++ b/api/azure/sdk_definition_override.rb @@ -3,7 +3,7 @@ module Api module Azure - module SDKDefinitionOverride < Api::Object + class SDKDefinitionOverride < Api::Object attr_reader :create attr_reader :read attr_reader :update diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb index 094507fad786..8628ddbb765b 100644 --- a/api/azure/sdk_operation_definition.rb +++ b/api/azure/sdk_operation_definition.rb @@ -12,25 +12,45 @@ class SDKOperationDefinition < Api::Object def validate super + @request ||= Hash.new + @response ||= Hash.new + check_property :go_func_name, String check_property :python_func_name, String check_optional_property :async, :boolean check_property :request, Hash check_property_hash :request, String, Api::Azure::SDKTypeDefinition - check_optional_property :response, Hash - check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinition + check_property :response, Hash + check_property_hash :response, String, Api::Azure::SDKTypeDefinition + end + + def filter_language!(language) + filter_applicable! @request, language + filter_applicable!(@response, language) unless @response.nil? end - def merge_overrides(overrides, language) - filter_applicable(@request, language) unless @request.nil? - filter_applicable(@response, language) unless @response.nil? + def merge_overrides!(overrides) + merge_hash_table!(@request, overrides.request) unless overrides.request.nil? + merge_hash_table!(@response, overrides.response) unless overrides.response.nil? end private - def filter_applicable(fields, language) + def filter_applicable!(fields, language) fields.reject!{|name, value| !value.applicable_to.nil? && !value.applicable_to.include?(language)} end + + def merge_hash_table!(fields, overrides) + overrides.each do |name, value| + if value.remove + fields.delete(name) + elsif !fields.has_key?(name) + fields[name] = value + else + fields[name].merge_overrides! value + end + end + end end end end diff --git a/api/azure/sdk_operation_definition_override.rb b/api/azure/sdk_operation_definition_override.rb index 94bdd2106d41..fa1ac22910bb 100644 --- a/api/azure/sdk_operation_definition_override.rb +++ b/api/azure/sdk_operation_definition_override.rb @@ -9,8 +9,8 @@ class SDKOperationDefinitionOverride < Api::Object def validate super - check_property :request, Hash - check_property_hash :request, String, Api::Azure::SDKTypeDefinitionOverride + check_optional_property :request, Hash + check_optional_property_hash :request, String, Api::Azure::SDKTypeDefinitionOverride check_optional_property :response, Hash check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinitionOverride end diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index c077268bb10f..764c06c39a29 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -5,6 +5,7 @@ module Azure class SDKTypeDefinition < Api::Object attr_reader :id_portion attr_reader :applicable_to + attr_reader :empty_value_sensitive attr_reader :go_variable_name attr_reader :go_field_name attr_reader :python_parameter_name @@ -12,8 +13,11 @@ class SDKTypeDefinition < Api::Object def validate super + @empty_value_sensitive ||= false + check_optional_property :id_portion, String check_optional_property :applicable_to, Array + check_property :empty_value_sensitive, :boolean check_optional_property_list_oneof :applicable_to, ['go', 'python'], String check_optional_property :go_variable_name, String check_optional_property :go_field_name, String @@ -21,6 +25,15 @@ def validate check_optional_property :python_variable_name, String end + def merge_overrides!(overrides) + @id_portion = overrides.id_portion unless overrides.id_portion.nil? + @empty_value_sensitive = overrides.empty_value_sensitive unless overrides.empty_value_sensitive.nil? + @go_variable_name = overrides.go_variable_name unless overrides.go_variable_name.nil? + @go_field_name = overrides.go_field_name unless overrides.go_field_name.nil? + @python_parameter_name = overrides.python_parameter_name unless overrides.python_parameter_name.nil? + @python_variable_name = overrides.python_variable_name unless overrides.python_variable_name.nil? + end + class BooleanObject < SDKTypeDefinition end diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index 67f35b64b00c..722a2ce0f5a8 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -3,7 +3,9 @@ module Api module Azure class SDKTypeDefinitionOverride < Api::Object + attr_reader :remove attr_reader :id_portion + attr_reader :empty_value_sensitive attr_reader :go_variable_name attr_reader :go_field_name attr_reader :python_parameter_name @@ -11,7 +13,11 @@ class SDKTypeDefinitionOverride < Api::Object def validate super + @remove ||= false + + check_optional_property :remove, :boolean check_optional_property :id_portion, String + check_optional_property :empty_value_sensitive, :boolean check_optional_property :go_variable_name, String check_optional_property :go_field_name, String check_optional_property :python_parameter_name, String diff --git a/api/compiler.rb b/api/compiler.rb index 352af2cac53b..9a55636b2597 100644 --- a/api/compiler.rb +++ b/api/compiler.rb @@ -21,6 +21,7 @@ require 'api/azure/type' require 'api/azure/sdk_definition' +require 'api/azure/sdk_definition_override' module Api # Process .yaml and produces output module diff --git a/api/resource.rb b/api/resource.rb index 09762b31ff93..6a55ef634c4b 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -62,13 +62,13 @@ module Properties attr_reader :update_verb attr_reader :input # If true, resource is not updatable as a whole unit attr_reader :min_version # Minimum API version this resource is in - - # Azure Specific Attributes - attr_reader :azure_sdk_definition end include Properties + # Azure Specific Attributes (Skip default override process) + attr_reader :azure_sdk_definition + # Parameters can be overridden via Provider::PropertyOverride # A custom getter is used for :parameters instead of `attr_reader` diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 8f9f1d3f7e9b..188521f73a34 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -124,7 +124,7 @@ func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) err if storageAccountId != "" { parameters.AccountCreateProperties.AutoStorage = &batch.AutoStorageBaseProperties{ - StorageAccountID: &storageAccountId, + StorageAccountID: utils.String(storageAccountId), } } @@ -200,17 +200,15 @@ func resourceArmBatchAccountUpdate(d *schema.ResourceData, meta interface{}) err tags := d.Get("tags").(map[string]interface{}) parameters := batch.AccountUpdateParameters{ - Tags: expandTags(tags), - } - - if storageAccountId != "" { - parameters.AccountUpdateProperties = &batch.AccountUpdateProperties{ + AccountUpdateProperties: &batch.AccountUpdateProperties{ AutoStorage: &batch.AutoStorageBaseProperties{ StorageAccountID: utils.String(storageAccountId), }, - } + }, + Tags: expandTags(tags), } + if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { return fmt.Errorf("Error updating Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) } diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml index 0bec1c103398..3c9f4b63313c 100644 --- a/products/azbatchaccount/terraform.yaml +++ b/products/azbatchaccount/terraform.yaml @@ -2,6 +2,11 @@ name: azbatchaccount overrides: !ruby/object:Provider::ResourceOverrides BatchAccount: !ruby/object:Provider::Azure::Terraform::ResourceOverride + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinitionOverride + create: !ruby/object:Api::Azure::SDKOperationDefinitionOverride + request: + '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinitionOverride + empty_value_sensitive: true properties: name: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation @@ -10,8 +15,6 @@ overrides: !ruby/object:Provider::ResourceOverrides name: storageAccountId validation: !ruby/object:Provider::Terraform::Validation function: azure.ValidateResourceIDOrEmpty - sdkfield_assign_type: block - custom_sdkfield_assign: products/azbatchaccount/terraform_storage_id_assign.erb custom_code: !ruby/object:Provider::Terraform::CustomCode extra_functions: products/azbatchaccount/terraform_extra_functions.erb document_examples: diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 3548141f4931..6a9277f7df29 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -6,7 +6,6 @@ module Terraform module OverrideFields attr_reader :name_in_logs attr_reader :hide_from_schema - attr_reader :sdkfield_assign_type attr_reader :custom_schema_definition attr_reader :custom_schema_get attr_reader :custom_schema_set @@ -26,7 +25,6 @@ def validate check_optional_property :custom_schema_get, String check_optional_property :custom_schema_set, String check_optional_property :custom_sdkfield_assign, String - check_property_oneof_default :sdkfield_assign_type, ['inline', 'block'], 'inline' end private diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index 74a07b3a4b22..099749b6f53d 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -1,10 +1,12 @@ require 'provider/terraform/resource_override' +require 'api/azure/sdk_definition_override' module Provider module Azure module Terraform module OverrideProperties attr_reader :name_in_logs + attr_reader :azure_sdk_definition attr_reader :acctests attr_reader :document_examples include Provider::Terraform::OverrideProperties @@ -17,6 +19,7 @@ def validate super @acctests ||= Array.new check_optional_property :name_in_logs, String + check_optional_property :azure_sdk_definition, Api::Azure::SDKDefinitionOverride check_optional_property :acctests, Array check_optional_property_list :acctests, AccTestDefinition check_optional_property :document_examples, Array diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index f3fae2f3befd..59bd473af023 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -18,6 +18,15 @@ def go_type(property) end end + def go_empty_value(property) + case property + when Api::Type::Enum, Api::Type::String + '""' + else + 'nil' + end + end + def expand_func(property) expand_funcs[property.class] end diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index f6eafc93bea3..cd469443275c 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -26,7 +26,7 @@ def build_schema_property_set(input, output, api_path, sdk_type_defs, resource_n flatten_queue: flatten_queue end - def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, expand_queue, properties, object) + def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, expand_queue, properties, object, in_structure = true) compile_template property_to_sdk_field_assignment_template(property, sdk_type_defs[api_path]), property: property, api_path: api_path, @@ -34,22 +34,24 @@ def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, resource_name: resource_name, expand_queue: expand_queue, properties: properties, + in_structure: in_structure, object: object end - def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) + def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4, include_empty = false) compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb', indentation: indentation, resource_name: resource_name, api_path: api_path, sdk_type_defs: sdk_type_defs, expand_queue: expand_queue, + include_empty: include_empty, properties: properties, object: object end - def build_sdkfield_block_assignments(resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) - compile_template 'templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb', + def build_property_to_sdk_object_empty_sensitive(resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) + compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb', indentation: indentation, resource_name: resource_name, sdk_type_defs: sdk_type_defs, diff --git a/provider/resource_override.rb b/provider/resource_override.rb index 6ff0a03d6c63..57e2ade7fcf8 100644 --- a/provider/resource_override.rb +++ b/provider/resource_override.rb @@ -73,7 +73,7 @@ def update_overriden_properties(api_resource) prop_name = "@#{method.id2name}".to_sym var_value = instance_variable_get(prop_name) api_resource.instance_variable_set(prop_name, var_value) \ - unless var_value.nil? + unless var_value.nil? || prop_name == :@azure_sdk_definition end end end @@ -95,8 +95,11 @@ def require_module(clazz) end def update_overriden_azure_sdk_definition(api_resource) - override = instance_variable_get('@azure_sdk_definition') - api_resource.azure_sdk_definition.merge_overrides override, @azure_sdk_language + unless api_resource.azure_sdk_definition.nil? + api_resource.azure_sdk_definition.filter_language! @azure_sdk_language + override = instance_variable_get('@azure_sdk_definition') + api_resource.azure_sdk_definition.merge_overrides!(override) unless override.nil? + end end def update_name_property_sort_order(api_resource) diff --git a/templates/azure/terraform/sdktypes/enum_field_assign.erb b/templates/azure/terraform/sdktypes/enum_field_assign.erb index 035279fd4054..3c8afe1eab9d 100644 --- a/templates/azure/terraform/sdktypes/enum_field_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_field_assign.erb @@ -1,3 +1,3 @@ <% sdk_package = object.azure_sdk_definition.go_client_namespace -%> <% sdk_type = sdk_type_defs[api_path] -%> -<%= sdk_type.go_field_name -%>: <%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>), \ No newline at end of file +<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 14bcea575c2c..bc1f2ae3841a 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,7 +1,7 @@ <% sdk_type = sdk_type_defs[api_path] -%> <% if expand_funcs.include?(property.class) -%> -<%= sdk_type.go_field_name -%>: <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>), +<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> <% else -%> <% expand_or_flatten_enqueue(expand_queue, property, api_path, sdk_type_defs) -%> -<%= sdk_type.go_field_name -%>: expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>), +<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb index 5ec2874e3522..d0b474c9c4e3 100644 --- a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb +++ b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb @@ -1,5 +1,5 @@ <% sdk_package = object.azure_sdk_definition.go_client_namespace -%> <% sdk_type = sdk_type_defs[api_path] -%> -<%= sdk_type.go_field_name -%>: &<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ +<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>&<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ <%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object)) -%> -}, \ No newline at end of file +}<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 6a75fb9fe751..24e84c317e17 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -3,15 +3,17 @@ sdk_type = sdk_type_defs[api_path] direct_children = Set.new - properties.select{|p| get_property_value(p, 'sdkfield_assign_type', 'inline') == 'inline'}.each do |prop| + properties.each do |prop| prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| + child_type_def = sdk_type_defs[child_api_path] if api_path == '/' && child_api_path.start_with?(api_path) sub_paths = child_api_path.split('/') api_path = '' elsif child_api_path.start_with?(api_path + '/') sub_paths = child_api_path[api_path.length..-1].split('/') end - if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == '' + skip_empty = child_type_def.empty_value_sensitive && !include_empty + if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == '' && !skip_empty sub_api_path = api_path + '/' + sub_paths[1] direct_children << sub_api_path if sub_paths.length > 2 direct_children << child_api_path if sub_paths.length == 2 diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb new file mode 100644 index 000000000000..940087472eaf --- /dev/null +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb @@ -0,0 +1,35 @@ +<% + sdk_package = object.azure_sdk_definition.go_client_namespace + properties.each do |prop| + prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |sdk_reference| + sdk_type = sdk_type_defs[sdk_reference] + if sdk_type.empty_value_sensitive + # Get the first initialized ancester + ancesters = [sdk_reference] + begin + parent_ref = ancesters[-1].split('/')[0..-2].join('/') + parent_type = sdk_type_defs[parent_ref] + initialized = properties.any? do |p| + p.azure_sdk_references.select{|r| sdk_type_defs.has_key?(r)}.any? do |r| + r.start_with?(parent_ref) && !sdk_type_defs[r].empty_value_sensitive + end + end + ancesters <<= parent_ref + end until !parent_type.empty_value_sensitive && initialized + + local_var = sdk_type.go_variable_name || prop.name.camelcase(:lower) +-%> +if <%= local_var -%> != <%= go_empty_value(prop) -%> { +<% if ancesters.size() == 2 -%> + parameters.<%= ancesters.reverse[0..-2].map{|r| sdk_type_defs[r].go_field_name}.join('.') -%>.<%= lines(build_sdk_field_assignment(prop, sdk_reference, sdk_type_defs, resource_name, expand_queue, [prop], object, false)) -%> +} +<% else -%> + parameters.<%= ancesters.reverse[0..1].map{|r| sdk_type_defs[r].go_field_name}.join('.') -%> = &<%= sdk_package -%>.<%= sdk_type_defs[ancesters[-2]].go_type_name -%>{ +<%= lines(build_property_to_sdk_object(ancesters[-2], resource_name, sdk_type_defs, expand_queue, [prop], object, 8, true)) -%> + } +} + +<% end -%> +<% end -%> +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb b/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb deleted file mode 100644 index 76a361e0eae8..000000000000 --- a/templates/azure/terraform/sdktypes/sdkfield_block_assignments.erb +++ /dev/null @@ -1,3 +0,0 @@ -<% properties.select{|p| get_property_value(p, 'sdkfield_assign_type', 'inline') == 'block'}.each do |prop| -%> -<%= lines(build_sdk_field_assignment(prop, get_applicable_reference(prop.azure_sdk_references, sdk_type_defs), sdk_type_defs, resource_name, expand_queue, properties, object)) -%> -<% end -%> \ No newline at end of file diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 9dc953a3aff4..91a240d7f1ae 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -133,7 +133,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, settable_properties, object, 8)) -%> } -<%= lines(build_sdkfield_block_assignments(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> +<%= lines(build_property_to_sdk_object_empty_sensitive(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") if err != nil { @@ -212,7 +212,7 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, updatable_properties, object, 8)) -%> } -<%= lines(build_sdkfield_block_assignments(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> +<%= lines(build_property_to_sdk_object_empty_sensitive(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { From e992e2b3fa8d21bec5fe4bbcb04eedc0a6b774a2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 19 Apr 2019 18:14:57 -0700 Subject: [PATCH 066/175] Complete documentation part of Ansible info module. --- .../cloud/azure/azure_rm_batchaccount.py | 12 +- .../cloud/azure/azure_rm_batchaccount_info.py | 197 ++++++++++++++++++ .../azure_rm_batchaccount/tasks/main.yml | 6 +- products/azbatchaccount/ansible.yaml | 16 +- .../examples/ansible/basic.yaml | 9 + .../examples/ansible/batch_account.yaml | 10 - .../examples/ansible/infoget.yaml | 6 + .../examples/ansible/infolist.yaml | 5 + .../examples/terraform/basic.yaml | 6 +- provider/ansible.rb | 3 +- provider/ansible/documentation.rb | 8 +- provider/ansible/facts_override.rb | 2 +- provider/ansible/resource_override.rb | 8 +- provider/azure/ansible.rb | 4 +- .../azure/ansible/example/sub_template.rb | 18 ++ provider/azure/ansible/helpers.rb | 4 + provider/azure/core.rb | 20 ++ provider/azure/example/example.rb | 33 +++ provider/azure/terraform.rb | 1 - provider/azure/terraform/example/example.rb | 37 ---- provider/core.rb | 4 + provider/resource_override.rb | 14 +- provider/terraform.rb | 5 + templates/ansible/facts.erb | 49 +++-- templates/ansible/resource.erb | 23 +- 25 files changed, 382 insertions(+), 118 deletions(-) create mode 100644 build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py create mode 100644 products/azbatchaccount/examples/ansible/basic.yaml delete mode 100644 products/azbatchaccount/examples/ansible/batch_account.yaml create mode 100644 products/azbatchaccount/examples/ansible/infoget.yaml create mode 100644 products/azbatchaccount/examples/ansible/infolist.yaml create mode 100644 provider/azure/ansible/example/sub_template.rb create mode 100644 provider/azure/core.rb create mode 100644 provider/azure/example/example.rb delete mode 100644 provider/azure/terraform/example/example.rb diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index cb85ea218a54..737fbfcbc667 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -30,9 +30,7 @@ --- module: azure_rm_batchaccount version_added: "2.9" - short_description: Manages a Batch Account on Azure. - description: - Create, update and delete instance of Azure Batch Account. @@ -92,11 +90,11 @@ EXAMPLES = ''' - name: Create (or update) Batch Account azure_rm_batchaccount: - resource_group: MyResGroup - name: "test_object" - location: West US - auto_storage_account: MyStorageAccountId - state: present + resource_group: MyResGroup + name: test_object + location: West US + auto_storage_account: MyStorageAccountId + state: present ''' RETURN = ''' diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py new file mode 100644 index 000000000000..73eb765935cf --- /dev/null +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -0,0 +1,197 @@ +#!/usr/bin/python +# +# Copyright (C) 2019 Junyi Yi (@JunyiYi) +# +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ["preview"], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: azure_rm_batchaccount_info +version_added: "2.9" +short_description: Gather info for Azure Batch Account +description: + - Gather info for Azure Batch Account. + +options: + resource_group: + description: + - The name of the resource group in which to create the Batch Account. + required: true + name: + description: + - The name of the Batch Account. + tags: + description: + - A mapping of tags to assign to the batch account. + +extends_documentation_fragment: + - azure + +author: + - "Junyi Yi (@JunyiYi)" +''' + +EXAMPLES = ''' + - name: Get instance of Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup + name: test_object + + - name: List instances of Batch Account + azure_rm_batchaccount: + resource_group: MyResGroup +''' + +RETURN = ''' +items: + description: List of items + returned: always + type: complex + contains: + id: + description: + - The ID of the Batch account. + returned: always + type: str + sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct" + resource_group: + description: + - The name of the resource group in which to create the Batch Account. + returned: always + type: str + name: + description: + - The name of the Batch Account. + returned: always + type: str + location: + description: + - Specifies the supported Azure location where the resource exists. + returned: always + type: str + account_endpoint: + description: + - The account endpoint used to interact with the Batch service. + returned: always + type: str + sample: sampleacct.westus.batch.azure.com + auto_storage_account: + description: + - The ID of the Batch Account auto storage account. + returned: always + type: str + sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct" + key_vault_reference: + description: + - A reference to the Azure key vault associated with the Batch account. + returned: always + type: complex + contains: + id: + description: + - The resource ID of the Azure key vault associated with the Batch + account. + returned: always + type: str + url: + description: + - The URL of the Azure key vault associated with the Batch account. + returned: always + type: str + pool_allocation_mode: + description: + - The pool acclocation mode of the Batch Account. + returned: always + type: str + tags: + description: + - A mapping of tags to assign to the batch account. + returned: always + type: str +''' + +################################################################################ +# Imports +################################################################################ +from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest +import json + +################################################################################ +# Main +################################################################################ + + +def main(): + module = GcpModule( + argument_spec=dict( + ) + ) + + if not module.params['scopes']: + module.params['scopes'] = ['NotUsedInAzure'] + + items = fetch_list(module, collection(module)) + if items.get('items'): + items = items.get('items') + else: + items = [] + return_value = { + 'items': items + } + module.exit_json(**return_value) + + +def collection(module): + return "NotUsedInAzureNotUsedInAzure".format(**module.params) + + +def fetch_list(module, link): + auth = GcpSession(module, 'zbatchaccount') + response = auth.get(link) + return return_if_object(module, response) + + +def return_if_object(module, response): + # If not found, return nothing. + if response.status_code == 404: + return None + + # If no content, return nothing. + if response.status_code == 204: + return None + + try: + module.raise_for_status(response) + result = response.json() + except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: + module.fail_json(msg="Invalid JSON response with error: %s" % inst) + + if navigate_hash(result, ['error', 'errors']): + module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) + + return result + + +if __name__ == "__main__": + main() diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml index f292cd91af63..7b8feeb84416 100644 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml @@ -35,8 +35,6 @@ - result.changed == true - name: verify that batch_account was created gcp_zbatchaccount_batch_account_facts: - filters: - - name = {{ resource_name }} project: "{{ gcp_project }}" auth_kind: "{{ gcp_cred_kind }}" service_account_file: "{{ gcp_cred_file }}" @@ -46,7 +44,7 @@ - name: verify that command succeeded assert: that: - - results['items'] | length == 1 + - results['items'] | length >= 1 # ---------------------------------------------------------------------------- - name: Create (or update) Batch Account azure_rm_batchaccount: @@ -75,8 +73,6 @@ - result.changed == true - name: verify that batch_account was deleted gcp_zbatchaccount_batch_account_facts: - filters: - - name = {{ resource_name }} project: "{{ gcp_project }}" auth_kind: "{{ gcp_cred_kind }}" service_account_file: "{{ gcp_cred_file }}" diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 63d5c9ab9787..9d4441c45e9e 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -9,8 +9,22 @@ manifest: !ruby/object:Provider::Ansible::Manifest - requests >= 2.18.4 version_added: '2.9' author: Junyi Yi (@JunyiYi) +datasources: !ruby/object:Provider::ResourceOverrides + BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride + version_added: '2.9' + properties: + name: !ruby/object:Provider::Ansible::PropertyOverride + required: false + examples: + - !ruby/object:Provider::Azure::ExampleReference + example: infoget + - !ruby/object:Provider::Azure::ExampleReference + example: infolist overrides: !ruby/object:Provider::ResourceOverrides BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride properties: autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride - name: autoStorageAccount \ No newline at end of file + name: autoStorageAccount + examples: + - !ruby/object:Provider::Azure::ExampleReference + example: basic \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/basic.yaml b/products/azbatchaccount/examples/ansible/basic.yaml new file mode 100644 index 000000000000..5c3e9fbe11de --- /dev/null +++ b/products/azbatchaccount/examples/ansible/basic.yaml @@ -0,0 +1,9 @@ +--- !ruby/object:Provider::Azure::Example +resource: azure_rm_batchaccount +description: Create (or update) Batch Account +properties: + resourceGroup: MyResGroup + name: test_object + location: West US + autoStorageAccount: MyStorageAccountId + state: present \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/batch_account.yaml b/products/azbatchaccount/examples/ansible/batch_account.yaml deleted file mode 100644 index fbce75453625..000000000000 --- a/products/azbatchaccount/examples/ansible/batch_account.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- !ruby/object:Provider::Ansible::Example -task: !ruby/object:Provider::Ansible::Task - name: azure_rm_batchaccount - description: Create (or update) Batch Account - code: - resource_group: myResourceGroup - name: <%= ctx[:name] %> - resource_group: MyResGroup - location: West US - auto_storage_account: MyStorageAccountId diff --git a/products/azbatchaccount/examples/ansible/infoget.yaml b/products/azbatchaccount/examples/ansible/infoget.yaml new file mode 100644 index 000000000000..ab739b887196 --- /dev/null +++ b/products/azbatchaccount/examples/ansible/infoget.yaml @@ -0,0 +1,6 @@ +--- !ruby/object:Provider::Azure::Example +resource: azure_rm_batchaccount +description: Get instance of Batch Account +properties: + resourceGroup: MyResGroup + name: test_object \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/infolist.yaml b/products/azbatchaccount/examples/ansible/infolist.yaml new file mode 100644 index 000000000000..4fb02a308c00 --- /dev/null +++ b/products/azbatchaccount/examples/ansible/infolist.yaml @@ -0,0 +1,5 @@ +--- !ruby/object:Provider::Azure::Example +resource: azure_rm_batchaccount +description: List instances of Batch Account +properties: + resourceGroup: MyResGroup \ No newline at end of file diff --git a/products/azbatchaccount/examples/terraform/basic.yaml b/products/azbatchaccount/examples/terraform/basic.yaml index 7573bb057941..a849b81666a3 100644 --- a/products/azbatchaccount/examples/terraform/basic.yaml +++ b/products/azbatchaccount/examples/terraform/basic.yaml @@ -1,10 +1,10 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_batch_account prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azstorageaccount example: basic properties: diff --git a/provider/ansible.rb b/provider/ansible.rb index 5809bd526f14..51dda7c30c7f 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -51,6 +51,7 @@ class Core < Provider::Core def initialize(config, api) super(config, api) @max_columns = 160 + @provider = 'ansible' end # Returns a string representation of the corresponding Python type @@ -262,7 +263,7 @@ def generate_resource_tests(data) def compile_datasource(data) target_folder = data[:output_folder] FileUtils.mkpath target_folder - name = "#{module_name(data[:object])}_facts" + name = "#{module_name(data[:object])}_info" generate_resource_file data.clone.merge( default_template: 'templates/ansible/facts.erb', out_file: File.join(target_folder, diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 650905766bad..e929310d33ae 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -62,7 +62,7 @@ def documentation_for_property(prop, object) # Builds out the RETURNS for a property. # This will eventually be converted to YAML - def returns_for_property(prop) + def returns_for_property(prop, object) type = python_type(prop) type = 'str' if prop.is_a? Api::Azure::Type::ResourceReference # Complex types only mentioned in reference to RETURNS YAML block @@ -72,16 +72,16 @@ def returns_for_property(prop) || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) { - prop.name.underscore => { + python_field_name(prop, object.azure_sdk_definition.read) => { 'description' => format_description(prop.description), 'returned' => 'always', 'type' => type, 'sample' => (prop.sample_value unless prop.sample_value.nil?), 'contains' => ( if prop.is_a?(Api::Type::NestedObject) - prop.properties.map { |p| returns_for_property(p) }.reduce({}, :merge) + prop.properties.map { |p| returns_for_property(p, object) }.reduce({}, :merge) elsif prop.is_a?(Api::Type::Array) && prop.item_type.is_a?(Api::Type::NestedObject) - prop.item_type.properties.map { |p| returns_for_property(p) }.reduce({}, :merge) + prop.item_type.properties.map { |p| returns_for_property(p, object) }.reduce({}, :merge) end ) }.reject { |_, v| v.nil? } diff --git a/provider/ansible/facts_override.rb b/provider/ansible/facts_override.rb index eb1c1691f08c..e7fb4f81a7bd 100644 --- a/provider/ansible/facts_override.rb +++ b/provider/ansible/facts_override.rb @@ -25,7 +25,7 @@ class FactsOverride < Api::Object def validate super - default_value_property :has_filters, true + default_value_property :has_filters, false default_value_property :filter, FilterProp.new default_value_property :query_options, true default_value_property :filter_api_param, 'filter' diff --git a/provider/ansible/resource_override.rb b/provider/ansible/resource_override.rb index d37a8ce6c0bd..af3c674a6cec 100644 --- a/provider/ansible/resource_override.rb +++ b/provider/ansible/resource_override.rb @@ -14,6 +14,8 @@ require 'provider/resource_override' require 'provider/ansible/facts_override' +require 'provider/azure/example/example' + module Provider module Ansible # Ansible specific properties to be added to Api::Resource @@ -35,8 +37,9 @@ module OverrideProperties attr_reader :unwrap_resource attr_reader :update attr_reader :version_added - attr_reader :facts + + attr_reader :examples end # Product specific overriden properties for Ansible @@ -78,6 +81,9 @@ def validate @facts ||= FactsOverride.new check_property :facts, FactsOverride + + default_value_property :examples, [] + check_optional_property_list :examples, Provider::Azure::ExampleReference end private diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 95fffd5ca3c0..00bd424a8783 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -3,6 +3,7 @@ require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' +require 'provider/azure/ansible/example/sub_template' module Provider module Azure @@ -12,6 +13,7 @@ module Ansible include Provider::Azure::Ansible::SubTemplate include Provider::Azure::Ansible::Module::SubTemplate include Provider::Azure::Ansible::SDK::SubTemplate + include Provider::Azure::Ansible::Example::SubTemplate end end -end \ No newline at end of file +end diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb new file mode 100644 index 000000000000..883c653d897d --- /dev/null +++ b/provider/azure/ansible/example/sub_template.rb @@ -0,0 +1,18 @@ +module Provider + module Azure + module Ansible + module Example + module SubTemplate + def build_yaml_from_example(example) + yaml = to_yaml({ + 'name' => example.description, + example.resource => example.properties.transform_keys(&:underscore) + }) + lines = yaml.split("\n") + lines('- ' + lines[0]) + indent(lines[1..-1], 2) + end + end + end + end + end +end diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index 99135133abb5..e193034f4e25 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -12,6 +12,10 @@ def is_tags_defined?(object) object.all_user_properties.any?{|p| is_tags?(p)} end + def get_tags_property(object) + object.all_user_properties.find{|p| is_tags?(p)} + end + def is_location?(property) property.is_a? Api::Azure::Type::Location end diff --git a/provider/azure/core.rb b/provider/azure/core.rb new file mode 100644 index 000000000000..b68112db9900 --- /dev/null +++ b/provider/azure/core.rb @@ -0,0 +1,20 @@ +require 'provider/azure/example/example' + +module Provider + module Azure + module Core + def get_example_by_reference(reference) + get_example_by_names reference.example, reference.product + end + + def get_example_by_names(example_name, product_name = nil) + product_name ||= @api.prefix + example_yaml = "products/#{product_name}/examples/#{@provider}/#{example_name}.yaml" + example = Google::YamlValidator.parse(File.read(example_yaml)) + raise "#{example_yaml}(#{example.class}) is not Provider::Azure::Example" unless example.is_a?(Provider::Azure::Example) + example.validate + example + end + end + end +end diff --git a/provider/azure/example/example.rb b/provider/azure/example/example.rb new file mode 100644 index 000000000000..d51bf1f5bfaf --- /dev/null +++ b/provider/azure/example/example.rb @@ -0,0 +1,33 @@ +require 'provider/core' +require 'api/object' + +module Provider + module Azure + class ExampleReference < Api::Object + attr_reader :product + attr_reader :example + + def validate + super + check_optional_property :product, String + check_property :example, String + end + end + + class Example < Api::Object + attr_reader :resource + attr_reader :description + attr_reader :prerequisites + attr_reader :properties + + def validate + super + check_property :resource, String + check_optional_property :description, String + check_optional_property :prerequisites, Array + check_optional_property_list :prerequisites, ExampleReference + check_property :properties, Hash + end + end + end +end diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 03577769c772..2087b8f48a45 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -4,7 +4,6 @@ require 'provider/azure/terraform/sdk/expand_flatten_descriptor' require 'provider/azure/terraform/sdk/sub_template' require 'provider/azure/terraform/sdk/helpers' -require 'provider/azure/terraform/example/example' require 'provider/azure/terraform/example/sub_template' require 'provider/azure/terraform/example/helpers' require 'provider/azure/terraform/acctest/sub_template' diff --git a/provider/azure/terraform/example/example.rb b/provider/azure/terraform/example/example.rb deleted file mode 100644 index dab3b48a2196..000000000000 --- a/provider/azure/terraform/example/example.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'provider/core' -require 'api/object' - -module Provider - module Azure - module Terraform - class ExampleReference < Api::Object - attr_reader :product - attr_reader :example - - def validate - super - check_property :product, String - check_property :example, String - end - end - - class Example < Api::Object - attr_reader :resource - attr_reader :name_in_documentation - attr_reader :name_in_test - attr_reader :prerequisites - attr_reader :properties - - def validate - super - check_property :resource, String - check_optional_property :name_in_documentation, String - check_optional_property :name_in_test, String - check_optional_property :prerequisites, Array - check_optional_property_list :prerequisites, ExampleReference - check_property :properties, Hash - end - end - end - end -end diff --git a/provider/core.rb b/provider/core.rb index b98f53bf0d4e..b70eb3da3b2a 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -18,6 +18,8 @@ require 'google/hash_utils' require 'pathname' +require 'provider/azure/core' + module Provider DEFAULT_FORMAT_OPTIONS = { indent: 0, @@ -30,11 +32,13 @@ module Provider # such as compiling and including files, formatting data, etc. class Core include Compile::Core + include Provider::Azure::Core def initialize(config, api) @config = config @api = api @max_columns = DEFAULT_FORMAT_OPTIONS[:max_columns] + @provider = '' end # Main entry point for the compiler. As this method is simply invoking other diff --git a/provider/resource_override.rb b/provider/resource_override.rb index 57e2ade7fcf8..82786ac4bc49 100644 --- a/provider/resource_override.rb +++ b/provider/resource_override.rb @@ -31,7 +31,7 @@ def apply(api_resource) ensure_resource_properties update_overriden_properties(api_resource) update_overriden_azure_sdk_definition(api_resource) - update_name_property_sort_order(api_resource) + update_properties_default_sort_order(api_resource) # TODO(nelsonjr): Enable revalidate the object to make sure we did not # break the object during the override process @@ -41,6 +41,7 @@ def apply(api_resource) def validate super + @id_default_order = 400 @name_default_order = 750 @azure_sdk_language = 'csharp' @@ -102,12 +103,11 @@ def update_overriden_azure_sdk_definition(api_resource) end end - def update_name_property_sort_order(api_resource) - name_index = api_resource.properties.find_index{|p| p.name == 'name'} - unless name_index.nil? - name_prop = api_resource.properties[name_index] - name_prop.instance_variable_set('@order', @name_default_order) - end + def update_properties_default_sort_order(api_resource) + name = api_resource.all_user_properties.find{|p| p.name == 'name'} + name.instance_variable_set('@order', @name_default_order) unless name.nil? + id = api_resource.all_user_properties.find{|p| p.name == 'id'} + id.instance_variable_set('@order', @id_default_order) unless id.nil? end # Returns the module that provides overriden properties for this provider. diff --git a/provider/terraform.rb b/provider/terraform.rb index 89b1b26c978b..9d46127f0823 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -32,6 +32,11 @@ class Terraform < Provider::AbstractCore include Provider::Azure::Terraform + def initialize(config, api) + super(config, api) + @provider = 'terraform' + end + # Sorts properties in the order they should appear in the TF schema: # Required, Optional, Computed def order_properties(properties) diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 4fbe4cb27178..96fdf462a298 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -1,17 +1,14 @@ #!/usr/bin/python -# -*- coding: utf-8 -*- # -# Copyright (C) 2017 Google +# Copyright (C) 2019 <%= lines(@config.manifest.get('author', object)) -%> +# # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + <%= lines(autogen_notice :python) -%> from __future__ import absolute_import, division, print_function __metaclass__ = type -################################################################################ -# Documentation -################################################################################ - <% metadata_version = quote_string(@config.manifest.get('metadata_version', object)) @@ -19,34 +16,40 @@ __metaclass__ = type uri_props = object.uri_properties.reject { |para| para.nil? || para.name == 'name' } -%> +<% + input_properties = object.all_user_properties.reject{|p| p.output || get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.read.request).nil?}.sort_by{|p| [p.order, p.name]} + output_properties = object.all_user_properties.sort_by{|p| [p.order, p.name]} +-%> ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, 'status': <%= @config.manifest.get('status', object) -%>, 'supported_by': <%= supported_by -%>} DOCUMENTATION = ''' --- +module: <%= module_name(object) -%>_info +version_added: "<%= @config.manifest.get('version_added', object).to_f -%>" +short_description: Gather info for Azure <%= lines(object.name.titlecase) -%> +description: + - Gather info for Azure <%= object.name.titlecase -%>. + <%= to_yaml({ - 'module' => "#{module_name(object)}_facts", - 'description' => ["Gather facts for GCP #{object.name}"], - 'short_description' => "Gather facts for GCP #{object.name}", - 'version_added' => @config.manifest.get('version_added', object).to_f, - 'author' => @config.manifest.get('author', object), - 'requirements' => @config.manifest.get('requirements', object), 'options' => [ - ({ - object.facts.filter.name.underscore => { - 'description' => format_description(object.facts.filter.description) - } - } if object.facts.has_filters), - uri_props.map { |p| documentation_for_property(p) } - ].flatten.compact.reduce({}, :merge), - 'extends_documentation_fragment' => 'gcp' + input_properties.map{|p| documentation_for_property(p, object)}, + (documentation_for_property(get_tags_property(object), object) if is_tags_defined?(object)) + ].flatten.compact.reduce({}, :merge) })-%> + +extends_documentation_fragment: + - azure + +author: + - "<%= @config.manifest.get('author', object) -%>" ''' -<% if example and example.facts -%> +<% unless object.examples.empty? -%> +<% code = object.examples.map{|exref| lines(build_yaml_from_example(get_example_by_reference(exref)))} -%> EXAMPLES = ''' -<%= lines(example.facts.build_example('facts', object)) -%> +<%= lines(indent(code.join("\n"), 2)) -%> ''' <% end -%> @@ -56,7 +59,7 @@ RETURN = ''' 'description' => 'List of items', 'returned' => 'always', 'type' => 'complex', - 'contains' => object.all_user_properties.map { |p| returns_for_property(p) }.reduce({}, :merge) + 'contains' => output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge) } })-%> ''' diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index d2b8fc131935..cdeda6dd296b 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -1,7 +1,6 @@ #!/usr/bin/python # -# Copyright (C) 2019 <%= @config.manifest.get('author', object) -%> - +# Copyright (C) 2019 <%= lines(@config.manifest.get('author', object)) -%> # # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) @@ -32,12 +31,9 @@ ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, DOCUMENTATION = ''' --- -module: <%= module_name(object) -%> - +module: <%= lines(module_name(object)) -%> version_added: "<%= @config.manifest.get('version_added', object).to_f -%>" - -short_description: <%= object.description -%> - +short_description: <%= lines(object.description) -%> description: - Create, update and delete instance of Azure <%= object.name.titlecase -%>. @@ -71,20 +67,15 @@ author: - "<%= @config.manifest.get('author', object) -%>" ''' -<% if example -%> +<% unless object.examples.empty? -%> +<% code = object.examples.map{|exref| lines(build_yaml_from_example(get_example_by_reference(exref)))} -%> EXAMPLES = ''' -<% res_readable_name = object.name.uncombine -%> -<% if example.dependencies -%> -<% example.dependencies.each do |depend| -%> -<%= lines(depend.build_test('present', object, false), 1) -%> -<% end # example.dependencies.each -%> -<% end # if example.dependencies -%> -<%= lines(example.task.build_example('present', object)) -%> +<%= lines(indent(code.join("\n"), 2)) -%> ''' <% end -%> RETURN = ''' -<%= to_yaml(output_properties.map{|p| returns_for_property(p)}.reduce({}, :merge)) -%> +<%= to_yaml(output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge)) -%> ''' import time From 1f38885ecf5c8ea82d9b494c3f1534b725e3dfae Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 19 Apr 2019 18:28:13 -0700 Subject: [PATCH 067/175] Unify Terraform example with Ansible example. --- .../azurerm/resource_arm_container_registry.go | 1 + .../docs/r/api_management_policy.html.markdown | 2 +- .../azapimanagement/examples/terraform/basic.yaml | 4 ++-- .../azapimngpolicy/examples/terraform/basic.yaml | 6 +++--- .../examples/terraform/findReplace.yaml | 6 +++--- .../examples/terraform/basic.yaml | 4 ++-- .../examples/terraform/basic.yaml | 6 +++--- .../examples/terraform/complete.yaml | 6 +++--- products/azbatchaccount/ansible.yaml | 2 +- .../azresourcegroup/examples/terraform/basic.yaml | 2 +- .../azstorageaccount/examples/terraform/basic.yaml | 4 ++-- provider/azure/terraform/example/helpers.rb | 2 +- provider/azure/terraform/example/sub_template.rb | 12 +----------- .../terraform/sdk/errorf_with_resource_name.erb | 4 ++-- 14 files changed, 26 insertions(+), 35 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go index 66b307934fca..fc739974076c 100644 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ b/build/azterraform/azurerm/resource_arm_container_registry.go @@ -199,6 +199,7 @@ func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{} Tags: expandTags(tags), } + if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { return fmt.Errorf("Error updating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) } diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown index 340f0768d59c..eebeb499ee88 100644 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ b/build/azterraform/website/docs/r/api_management_policy.html.markdown @@ -68,7 +68,7 @@ The following arguments are supported: The following attributes are exported: -* `id` - The ID of the API Management Service. +* `id` - The ID of the API Management Policy. ## Import diff --git a/products/azapimanagement/examples/terraform/basic.yaml b/products/azapimanagement/examples/terraform/basic.yaml index 792d6258a4aa..eebbd7e42f1a 100644 --- a/products/azapimanagement/examples/terraform/basic.yaml +++ b/products/azapimanagement/examples/terraform/basic.yaml @@ -1,7 +1,7 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_api_management prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic properties: diff --git a/products/azapimngpolicy/examples/terraform/basic.yaml b/products/azapimngpolicy/examples/terraform/basic.yaml index 9a7e0a929b89..8c5fc38a16d0 100644 --- a/products/azapimngpolicy/examples/terraform/basic.yaml +++ b/products/azapimngpolicy/examples/terraform/basic.yaml @@ -1,10 +1,10 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_api_management_policy prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azapimanagement example: basic properties: diff --git a/products/azapimngpolicy/examples/terraform/findReplace.yaml b/products/azapimngpolicy/examples/terraform/findReplace.yaml index 0f3cdeac25e2..6f50b28b5f22 100644 --- a/products/azapimngpolicy/examples/terraform/findReplace.yaml +++ b/products/azapimngpolicy/examples/terraform/findReplace.yaml @@ -1,10 +1,10 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_api_management_policy prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azapimanagement example: basic properties: diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index 1dda5bf897b5..5edf3c8d265c 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -1,7 +1,7 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_automation_account prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic properties: diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml index 02c69dc0e5e9..6861d18f2337 100644 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ b/products/azautomationstringvariable/examples/terraform/basic.yaml @@ -1,10 +1,10 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_automation_string_variable prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azautomationaccount example: basic properties: diff --git a/products/azautomationstringvariable/examples/terraform/complete.yaml b/products/azautomationstringvariable/examples/terraform/complete.yaml index 286b2fb9ac7a..8268f4f900b2 100644 --- a/products/azautomationstringvariable/examples/terraform/complete.yaml +++ b/products/azautomationstringvariable/examples/terraform/complete.yaml @@ -1,10 +1,10 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_automation_string_variable prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azautomationaccount example: basic properties: diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 9d4441c45e9e..b00b35c049ae 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -15,7 +15,7 @@ datasources: !ruby/object:Provider::ResourceOverrides properties: name: !ruby/object:Provider::Ansible::PropertyOverride required: false - examples: + example: - !ruby/object:Provider::Azure::ExampleReference example: infoget - !ruby/object:Provider::Azure::ExampleReference diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml index 1a5c94e1db2b..07684ef6c218 100644 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ b/products/azresourcegroup/examples/terraform/basic.yaml @@ -1,4 +1,4 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_resource_group properties: name: "<%= get_resource_name('resourceGroups', 'RG') -%>" diff --git a/products/azstorageaccount/examples/terraform/basic.yaml b/products/azstorageaccount/examples/terraform/basic.yaml index ac9f8d2cb725..e067ed81cd1b 100644 --- a/products/azstorageaccount/examples/terraform/basic.yaml +++ b/products/azstorageaccount/examples/terraform/basic.yaml @@ -1,7 +1,7 @@ ---- !ruby/object:Provider::Azure::Terraform::Example +--- !ruby/object:Provider::Azure::Example resource: azurerm_storage_account prerequisites: - - !ruby/object:Provider::Azure::Terraform::ExampleReference + - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic properties: diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index f93a4cffeeb9..e467c284f077 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -10,7 +10,7 @@ def get_example_properties_to_check(product_name, example_name, object) param_props = object.all_user_properties.select{|p| p.azure_sdk_references.any?{|ref| request.has_key?(ref)}} params = param_props.map{|p| p.name.underscore}.to_set - example = get_example_from_file(product_name, example_name) + example = get_example_by_names(example_name, product_name) example.properties.reject{|pn, pv| params.include?(pn)} end end diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index bc805fa6c4a4..9be05031cb45 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -15,7 +15,7 @@ def build_documentation_hcl_from_example(product_name, example_name, name_hints, def build_hcl_from_example(product_name, example_name, id_hint, name_hints, random_vars, with_dependencies = false) hcl_raw = compile_template 'templates/azure/terraform/example/example_hcl.erb', - example: get_example_from_file(product_name, example_name), + example: get_example_by_names(example_name, product_name), random_variables: random_vars, resource_id_hint: id_hint, name_hints: name_hints, @@ -35,16 +35,6 @@ def build_hcl_properties(properties_hash, indentation = 2) properties: properties_hash, indentation: indentation end - - private - - def get_example_from_file(product_name, example_name) - example_yaml = "products/#{product_name}/examples/terraform/#{example_name}.yaml" - example = Google::YamlValidator.parse(File.read(example_yaml)) - raise "#{example_yaml}(#{example.class}) is not Provider::Azure::Terraform::Example" unless example.is_a?(Provider::Azure::Terraform::Example) - example.validate - example - end end private diff --git a/templates/azure/terraform/sdk/errorf_with_resource_name.erb b/templates/azure/terraform/sdk/errorf_with_resource_name.erb index 6c58cb8c3152..3770ad6e3348 100644 --- a/templates/azure/terraform/sdk/errorf_with_resource_name.erb +++ b/templates/azure/terraform/sdk/errorf_with_resource_name.erb @@ -1,6 +1,6 @@ <% res_name = "" - res_var = "" + res_var = nil depends = [] depends_vars = [] properties.select{|p| !get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil? && !get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).start_with?("/") }.each do |prop| @@ -20,4 +20,4 @@ res_name = "#{get_property_value(object, "name_in_logs", nil) || object.name.titlecase}" if res_name == "" res_name += " (#{depends.reverse.join(' / ')})" unless depends.empty? -%> -fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= ([res_var] + (depends_vars.reverse)).join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file +fmt.Errorf("<%= format_string % [res_name] -%><%= include_error ? ": %+v" : "" -%>", <%= (([res_var] + (depends_vars.reverse)).compact).join(", ") -%><%= include_error ? ", err" : "" -%>) \ No newline at end of file From a438abb4c0f573ec1f3847c530290e1d422654f6 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 22 Apr 2019 17:57:43 -0700 Subject: [PATCH 068/175] Implement info module in Ansible. --- api/azure/sdk_definition.rb | 2 + api/azure/sdk_type_definition.rb | 8 +- api/azure/sdk_type_definition_override.rb | 2 + .../cloud/azure/azure_rm_batchaccount_info.py | 152 ++++++++----- google/python_utils.rb | 2 +- products/azbatchaccount/ansible.yaml | 2 +- products/azbatchaccount/api.yaml | 85 ++++++- provider/ansible.rb | 1 + provider/ansible/documentation.rb | 4 +- provider/ansible/module.rb | 4 +- provider/azure/ansible/module/sub_template.rb | 2 +- templates/ansible/facts.erb | 211 +++++++++--------- templates/ansible/resource.erb | 6 +- .../module/class_instance_variable_init.erb | 2 +- 14 files changed, 303 insertions(+), 180 deletions(-) diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index bcd26e8069c1..a42ce602e9f9 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -13,6 +13,7 @@ class SDKDefinition < Api::Object attr_reader :read attr_reader :update attr_reader :delete + attr_reader :list_by_rg def validate super @@ -25,6 +26,7 @@ def validate check_property :read, Api::Azure::SDKOperationDefinition check_optional_property :update, Api::Azure::SDKOperationDefinition check_property :delete, Api::Azure::SDKOperationDefinition + check_optional_property :list_by_rg, Api::Azure::SDKOperationDefinition end def filter_language!(language) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 764c06c39a29..88e37f05ae23 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -10,6 +10,7 @@ class SDKTypeDefinition < Api::Object attr_reader :go_field_name attr_reader :python_parameter_name attr_reader :python_variable_name + attr_reader :python_field_name def validate super @@ -23,6 +24,7 @@ def validate check_optional_property :go_field_name, String check_optional_property :python_parameter_name, String check_optional_property :python_variable_name, String + check_optional_property :python_field_name, String end def merge_overrides!(overrides) @@ -32,6 +34,7 @@ def merge_overrides!(overrides) @go_field_name = overrides.go_field_name unless overrides.go_field_name.nil? @python_parameter_name = overrides.python_parameter_name unless overrides.python_parameter_name.nil? @python_variable_name = overrides.python_variable_name unless overrides.python_variable_name.nil? + @python_field_name = overrides.python_field_name unless overrides.python_field_name.nil? end class BooleanObject < SDKTypeDefinition @@ -45,7 +48,7 @@ class EnumObject < SDKTypeDefinition def validate super - check_property :go_enum_type_name, String + check_optional_property :go_enum_type_name, String end end @@ -58,6 +61,9 @@ def validate end end + class ComplexArray < ComplexObject + end + end end end diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index 722a2ce0f5a8..a06622e703b8 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -10,6 +10,7 @@ class SDKTypeDefinitionOverride < Api::Object attr_reader :go_field_name attr_reader :python_parameter_name attr_reader :python_variable_name + attr_reader :python_field_name def validate super @@ -22,6 +23,7 @@ def validate check_optional_property :go_field_name, String check_optional_property :python_parameter_name, String check_optional_property :python_variable_name, String + check_optional_property :python_field_name, String end end end diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py index 73eb765935cf..70a3fc021b5e 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -128,69 +128,105 @@ description: - A mapping of tags to assign to the batch account. returned: always - type: str + type: list ''' -################################################################################ -# Imports -################################################################################ -from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest -import json - -################################################################################ -# Main -################################################################################ - - -def main(): - module = GcpModule( - argument_spec=dict( +from ansible.module_utils.azure_rm_common import AzureRMModuleBase + +try: + from msrestazure.azure_exceptions import CloudError + from azure.mgmt.batch import BatchManagementClient from msrest.serialization import Model +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMBatchAccountInfo(AzureRMModuleBase): + def __init__(self): + # define user inputs into argument + self.module_arg_spec = dict( + resource_group=dict( + required=True, + type='str' + ), + name=dict( + type='str' + ), + tags=dict( + type='list' + ) ) - ) - - if not module.params['scopes']: - module.params['scopes'] = ['NotUsedInAzure'] - - items = fetch_list(module, collection(module)) - if items.get('items'): - items = items.get('items') - else: - items = [] - return_value = { - 'items': items - } - module.exit_json(**return_value) - - -def collection(module): - return "NotUsedInAzureNotUsedInAzure".format(**module.params) - - -def fetch_list(module, link): - auth = GcpSession(module, 'zbatchaccount') - response = auth.get(link) - return return_if_object(module, response) - - -def return_if_object(module, response): - # If not found, return nothing. - if response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) + # store the results of the module operation + self.results = dict( + changed=False + ) + self.mgmt_client = None + self.resource_group = None + self.name = None + self.tags = None + super(AzureRMBatchAccountInfo, self).__init__(self.module_arg_spec, supports_tags=False) + + def exec_module(self, **kwargs): + for key in self.module_arg_spec: + setattr(self, key, kwargs[key]) + self.mgmt_client = self.get_mgmt_svc_client(BatchManagementClient, + base_url=self._cloud_environment.endpoints.resource_manager) + + if (self.name): + self.results['items'] = self.get() + else: + self.results['items'] = self.list() + return self.results + + def get(self): + response = None + results = [] + try: + response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, + account_name=self.name) + self.log("Response : {0}".format(response)) + except CloudError as e: + self.log('Could not get info for Batch Account.') + + if response and self.has_tags(response.tags, self.tags): + results.append(self.format_response(response)) + + return results + + def list(self): + response = None + results = [] + try: + response = self.mgmt_client.batch_account.list_by_resource_group(resource_group_name=self.resource_group) + self.log("Response : {0}".format(response)) + except CloudError as e: + self.log('Could not get info for Batch Account.') + + if response is not None: + for item in response: + if self.has_tags(item.tags, self.tags): + results.append(self.format_response(item)) + + return results + + def format_response(self, item): + d = item.as_dict() + d = { + 'id': d['id'], + 'resource_group': self.resource_group, + 'name': d['name'], + 'location': d['location'], + 'account_endpoint': d['account_endpoint'], + 'auto_storage_account': d['auto_storage']['storage_account_id'], + 'key_vault_reference': d['key_vault_reference'], + 'pool_allocation_mode': d['pool_allocation_mode'], + 'tags': d['tags'], + } + return d - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - return result +def main(): + AzureRMBatchAccountInfo() if __name__ == "__main__": diff --git a/google/python_utils.rb b/google/python_utils.rb index a01138ac1ae1..03a57e44d712 100644 --- a/google/python_utils.rb +++ b/google/python_utils.rb @@ -54,7 +54,7 @@ def method_call(name, args) "#{name}(#{args.compact.join(', ')})" end - def python_field_name(property, sdk_op_def) + def python_variable_name(property, sdk_op_def) sdk_ref = get_applicable_reference(property.azure_sdk_references, sdk_op_def.request) return property.out_name.underscore if sdk_ref.nil? python_var = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_op_def.request).python_variable_name diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index b00b35c049ae..9d4441c45e9e 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -15,7 +15,7 @@ datasources: !ruby/object:Provider::ResourceOverrides properties: name: !ruby/object:Provider::Ansible::PropertyOverride required: false - example: + examples: - !ruby/object:Provider::Azure::ExampleReference example: infoget - !ruby/object:Provider::Azure::ExampleReference diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 47c16e6554e1..75e32f25092d 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -82,31 +82,63 @@ objects: go_type_name: Account '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: ID + python_field_name: id '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Name + python_field_name: name '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location + python_field_name: location '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: AccountProperties go_type_name: AccountProperties go_variable_name: properties '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: AccountEndpoint '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: AutoStorage go_type_name: AutoStorageProperties '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: StorageAccountID '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: KeyVaultReference go_type_name: KeyVaultReference '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: ID '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: URL '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] go_field_name: PoolAllocationMode go_enum_type_name: PoolAllocationMode + '/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: account_endpoint + '/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [python] + python_field_name: auto_storage + '/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: storage_account_id + '/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [python] + python_field_name: key_vault_reference + '/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: id + '/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: url + '/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [python] + python_field_name: pool_allocation_mode '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Tags update: !ruby/object:Api::Azure::SDKOperationDefinition @@ -166,6 +198,47 @@ objects: go_variable_name: name python_parameter_name: account_name python_variable_name: name + list_by_rg: !ruby/object:Api::Azure::SDKOperationDefinition + python_func_name: list_by_resource_group + go_func_name: ListByResourceGroup + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + python_parameter_name: resource_group_name + python_variable_name: resource_group + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArray + go_type_name: Account + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AccountProperties + go_type_name: AccountProperties + go_variable_name: properties + '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: AccountEndpoint + '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: AutoStorage + go_type_name: AutoStorageProperties + '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: StorageAccountID + '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: KeyVaultReference + go_type_name: KeyVaultReference + '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: URL + '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: PoolAllocationMode + go_enum_type_name: PoolAllocationMode + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Tags + description: | Manages a Batch Account on Azure. @@ -196,7 +269,7 @@ objects: - !ruby/object:Api::Azure::Type::ResourceReference name: autoStorageAccountId description: The ID of the Batch Account auto storage account. - azure_sdk_references: ['autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] + azure_sdk_references: ['/autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct' - !ruby/object:Api::Type::Enum name: poolAllocationMode @@ -206,25 +279,25 @@ objects: - :BatchService - :UserSubscription default_value: :BatchService - azure_sdk_references: ['/properties/poolAllocationMode'] + azure_sdk_references: ['/poolAllocationMode', '/properties/poolAllocationMode'] - !ruby/object:Api::Type::NestedObject name: keyVaultReference description: A reference to the Azure key vault associated with the Batch account. input: true - azure_sdk_references: ['/properties/keyVaultReference'] + azure_sdk_references: ['/keyVaultReference', '/properties/keyVaultReference'] properties: - !ruby/object:Api::Type::String name: id description: The resource ID of the Azure key vault associated with the Batch account. required: true input: true - azure_sdk_references: ['/properties/keyVaultReference/id'] + azure_sdk_references: ['/keyVaultReference/id', '/properties/keyVaultReference/id'] - !ruby/object:Api::Type::String name: url description: The URL of the Azure key vault associated with the Batch account. required: true input: true - azure_sdk_references: ['/properties/keyVaultReference/url'] + azure_sdk_references: ['/keyVaultReference/url', '/properties/keyVaultReference/url'] - !ruby/object:Api::Azure::Type::ResourceReference name: id description: The ID of the Batch account. @@ -235,5 +308,5 @@ objects: name: accountEndpoint description: The account endpoint used to interact with the Batch service. output: true - azure_sdk_references: ['/properties/accountEndpoint'] + azure_sdk_references: ['/accountEndpoint', '/properties/accountEndpoint'] sample_value: 'sampleacct.westus.batch.azure.com' diff --git a/provider/ansible.rb b/provider/ansible.rb index 51dda7c30c7f..12f29086ce98 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -64,6 +64,7 @@ def python_type(prop) return 'dict' end return 'raw' if prop.is_a? Api::Azure::Type::ResourceReference + return 'list' if prop.is_a? Api::Azure::Type::Tags PYTHON_TYPE_FROM_MM_TYPE.fetch(prop.class.to_s, 'str') end diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index e929310d33ae..63d8de27b17e 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -35,7 +35,7 @@ def to_yaml(obj) def documentation_for_property(prop, object) required = prop.required && !prop.default_value ? true : false { - python_field_name(prop, object.azure_sdk_definition.create) => { + python_variable_name(prop, object.azure_sdk_definition.create) => { 'description' => [ format_description(prop.description), (resourceref_description(prop) \ @@ -72,7 +72,7 @@ def returns_for_property(prop, object) || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) { - python_field_name(prop, object.azure_sdk_definition.read) => { + python_variable_name(prop, object.azure_sdk_definition.read) => { 'description' => format_description(prop.description), 'returned' => 'always', 'type' => type, diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index 09c45f17ed1a..4157dc12846c 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -28,7 +28,7 @@ def python_dict_for_property(prop, object, spaces = 0) elsif prop.is_a? Api::Type::NestedObject nested_obj_dict(prop, object, prop.properties, spaces) else - name = python_field_name(prop, object.azure_sdk_definition.create) + name = python_variable_name(prop, object.azure_sdk_definition.create) options = prop_options(prop, object, spaces).join("\n") "#{name}=dict(\n#{indent_list(options, 4)}\n)" end @@ -39,7 +39,7 @@ def python_dict_for_property(prop, object, spaces = 0) # Creates a Python dictionary representing a nested object property # for validation. def nested_obj_dict(prop, object, properties, spaces) - name = python_field_name(prop, object.azure_sdk_definition.create) + name = python_variable_name(prop, object.azure_sdk_definition.create) options = prop_options(prop, object, spaces).join("\n") [ "#{name}=dict(\n#{indent_list(options, 4, true)}\n options=dict(", diff --git a/provider/azure/ansible/module/sub_template.rb b/provider/azure/ansible/module/sub_template.rb index 78eba803bc1c..9e7ee87a8e84 100644 --- a/provider/azure/ansible/module/sub_template.rb +++ b/provider/azure/ansible/module/sub_template.rb @@ -3,7 +3,7 @@ module Azure module Ansible module Module module SubTemplate - def build_class_instance_variable_init(object, indentation = 8) + def build_class_instance_variable_init(sdk_operation, object, indentation = 8) result = compile 'templates/azure/ansible/module/class_instance_variable_init.erb', 1 indent result, indentation end diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 96fdf462a298..0fd37abc6615 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -17,6 +17,9 @@ __metaclass__ = type uri_props = object.uri_properties.reject { |para| para.nil? || para.name == 'name' } -%> <% + python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] + python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] + input_properties = object.all_user_properties.reject{|p| p.output || get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.read.request).nil?}.sort_by{|p| [p.order, p.name]} output_properties = object.all_user_properties.sort_by{|p| [p.order, p.name]} -%> @@ -64,113 +67,113 @@ RETURN = ''' })-%> ''' -################################################################################ -# Imports -################################################################################ -<% - import = 'from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest' - import += ', replace_resource_dict' unless uri_props.select { |p| p.is_a?(Api::Type::ResourceRef) && !p.resource_ref.readonly }.empty? --%> -<%= lines(import) -%> -import json - -################################################################################ -# Main -################################################################################ - - -def main(): -<% - mod_props = object.facts.has_filters ? [python_dict_for_property(object.facts.filter, object)] : [] - mod_props += uri_props.map do |prop| - python_dict_for_property(prop, object) - end --%> - module = GcpModule( - argument_spec=dict( -<%= lines(indent_list(mod_props, 12)) -%> +from ansible.module_utils.azure_rm_common import AzureRMModuleBase + +try: + from msrestazure.azure_exceptions import CloudError + from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= python_sdk_client -%> + from msrest.serialization import Model +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRM<%= object.name -%>Info(AzureRMModuleBase): + def __init__(self): + # define user inputs into argument + self.module_arg_spec = dict( +<%= indent_list(input_properties.map{|p| python_dict_for_property(p, object)}, 12, false) -%> +<%= ",\n" + indent(python_dict_for_property(get_tags_property(object), object), 12) if is_tags_defined?(object) -%> +<%= "\n" -%> ) + # store the results of the module operation + self.results = dict( + changed=False ) - ) - - if not module.params['scopes']: - module.params['scopes'] = <%= python_literal(object.__product.scopes) %> + self.mgmt_client = None +<%= lines(build_class_instance_variable_init(object.azure_sdk_definition.read, object)) -%> +<%= lines(indent('self.tags = None', 8)) if is_tags_defined?(object) -%> + super(AzureRM<%= object.name -%>Info, self).__init__(self.module_arg_spec, supports_tags=False) + + def exec_module(self, **kwargs): + for key in self.module_arg_spec: + setattr(self, key, kwargs[key]) + self.mgmt_client = self.get_mgmt_svc_client(<%= python_sdk_client -%>, + base_url=self._cloud_environment.endpoints.resource_manager) + + if (self.name): + self.results['items'] = self.get() + else: + self.results['items'] = self.list() + return self.results + +<% sdk_operation = object.azure_sdk_definition.read -%> + def get(self): + response = None + results = [] + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + self.log("Response : {0}".format(response)) + except CloudError as e: + self.log('Could not get info for <%= object.name.titlecase -%>.') + +<% if is_tags_defined?(object) -%> + if response and self.has_tags(response.tags, self.tags): + results.append(self.format_response(response)) +<% else -%> + # TODO: Implement format response without tags +<% end -%> + + return results + +<% sdk_operation = object.azure_sdk_definition.list_by_rg -%> +<% unless sdk_operation.nil? -%> + def list(self): + response = None + results = [] + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + self.log("Response : {0}".format(response)) + except CloudError as e: + self.log('Could not get info for <%= object.name.titlecase -%>.') + + if response is not None: + for item in response: +<% if is_tags_defined?(object) -%> + if self.has_tags(item.tags, self.tags): + results.append(self.format_response(item)) +<% else -%> + # TODO: Implement format response without tags +<% end -%> + + return results +<% end -%> + +<% sdk_operation = object.azure_sdk_definition.read -%> + def format_response(self, item): + d = item.as_dict() + d = { +<% output_properties.each do |prop| -%> +<% py_var = python_variable_name(prop, object.azure_sdk_definition.create) -%> +<% py_fields = [] -%> +<% sdk_ref = get_applicable_reference(prop.azure_sdk_references, sdk_operation.response) -%> +<% unless sdk_ref.nil? -%> +<% sdk_refs = sdk_ref.split('/').reject(&:empty?) -%> +<% sdk_ref = '' -%> +<% sdk_refs.each do |ref| -%> +<% sdk_ref += '/' + ref -%> +<% sdk_type_def = sdk_operation.response[sdk_ref] -%> +<% py_fields <<= sdk_type_def.python_field_name || prop.name.underscore -%> +<% end -%> +<% end -%> +<% access_chain = py_fields.map{|f| "['#{f}']"}.join -%> + '<%= py_var -%>': <%= py_fields.empty? ? "self.#{py_var}" : "d#{access_chain}" -%>, +<% end -%> + } + return d -<% - query_param = nil - if object.facts.has_filters - if object.facts.query_options - query_param = "query_options(module.params['#{object.facts.filter.name}'])" - else - query_param = "module.params['#{object.facts.filter.name.underscore}']" - end - end --%> - items = <%= method_call('fetch_list', ['module', 'collection(module)', query_param]) %> - if items.get(<%= quote_string(object.collection_url_response.items) -%>): - items = items.get(<%= quote_string(object.collection_url_response.items) -%>) - else: - items = [] - return_value = { - 'items': items - } - module.exit_json(**return_value) - - -<% if object.collection -%> -<%= lines(emit_link('collection', build_url(object.collection), object)) -%> -<% else # object.collection -%> -<%= lines(emit_link('collection', build_url(object.collection_url), object)) -%> -<% end # object.collection -%> - - -<%= method_decl('fetch_list', ['module', 'link', ('query' if object.facts.has_filters)]) %> -<% prod_name = object.__product.prefix[1..-1] -%> - auth = GcpSession(module, <%= quote_string(prod_name) -%>) - response = <%= method_call('auth.get', ['link', ("params={'#{object.facts.filter_api_param}': query}" if object.facts.has_filters)]) %> - return return_if_object(module, response) - - -<% if object.facts.has_filters && object.facts.query_options -%> -def query_options(filters): - if not filters: - return '' - - if len(filters) == 1: - return filters[0] - else: - queries = [] - for f in filters: - # For multiple queries, all queries should have () - if f[0] != '(' and f[-1] != ')': - queries.append("(%s)" % ''.join(f)) - else: - queries.append(f) - - return ' '.join(queries) - - -<% end -%> -<%= - lines(method_decl('return_if_object', ['module', 'response'])) --%> - # If not found, return nothing. - if response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result +def main(): + AzureRM<%= object.name -%>Info() if __name__ == "__main__": diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index cdeda6dd296b..02007c9bb4ff 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -111,7 +111,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): ) ) -<%= lines(build_class_instance_variable_init(object)) -%> +<%= lines(build_class_instance_variable_init(object.azure_sdk_definition.create, object)) -%> self.results = dict(changed=False) self.mgmt_client = None @@ -135,13 +135,13 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): <% input_properties.each do |prop| -%> <% if prop.is_a? Api::Type::Enum -%> - self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_field_name(prop, object.azure_sdk_definition.create) -%>'], True) + self.<%= root_object_field -%>['<%= python_variable_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_variable_name(prop, object.azure_sdk_definition.create) -%>'], True) <% elsif is_location? prop -%> resource_group = self.get_resource_group(self.resource_group) if self.<%= root_object_field -%>.get('location') is None: self.<%= root_object_field -%>['location'] = resource_group.location <% elsif prop.is_a? Api::Azure::Type::ResourceReference -%> -<% prop_field_name = python_field_name(prop, object.azure_sdk_definition.create) -%> +<% prop_field_name = python_variable_name(prop, object.azure_sdk_definition.create) -%> <% prop_expr = "self.#{root_object_field}['#{prop_field_name}']" -%> if self.<%= root_object_field -%>.get('<%= prop_field_name -%>') is not None: <%= prop_expr -%> = self.normalize_resource_id( diff --git a/templates/azure/ansible/module/class_instance_variable_init.erb b/templates/azure/ansible/module/class_instance_variable_init.erb index e26d40458ec6..2115579e558c 100644 --- a/templates/azure/ansible/module/class_instance_variable_init.erb +++ b/templates/azure/ansible/module/class_instance_variable_init.erb @@ -1,4 +1,4 @@ -<% params = object.azure_sdk_definition.create.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> +<% params = sdk_operation.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> <% params.each do |name, value| -%> <% case value -%> <% when Api::Azure::SDKTypeDefinition::StringObject -%> From 779f1eb3cc135ff5bfd016d1bb919cbc7b148617 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Tue, 23 Apr 2019 17:53:10 -0700 Subject: [PATCH 069/175] Removed unused code for automation string variable --- products/azautomationstringvariable/terraform_get_value.erb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/products/azautomationstringvariable/terraform_get_value.erb b/products/azautomationstringvariable/terraform_get_value.erb index ab5863db92fc..819f62f2c41f 100644 --- a/products/azautomationstringvariable/terraform_get_value.erb +++ b/products/azautomationstringvariable/terraform_get_value.erb @@ -1,5 +1 @@ -<% if input_var == 'd' -%> -<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) -<% else -%> -// Terraform_Get_Value is not supported. -<% end -%> \ No newline at end of file +<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file From 7e6ac82f745b455e98fdb7e2bbfaaf89efbced2b Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Wed, 24 Apr 2019 19:11:21 -0700 Subject: [PATCH 070/175] Fixes for automation string resource --- .../check_type_after_read.erb | 3 --- .../azautomationstringvariable/terraform.yaml | 8 +++----- .../terraform_set_value.erb | 15 ++++++--------- 3 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 products/azautomationstringvariable/check_type_after_read.erb diff --git a/products/azautomationstringvariable/check_type_after_read.erb b/products/azautomationstringvariable/check_type_after_read.erb deleted file mode 100644 index 2a87254ee872..000000000000 --- a/products/azautomationstringvariable/check_type_after_read.erb +++ /dev/null @@ -1,3 +0,0 @@ -if err := validateAzureRmAutomationVariableType("azurerm_automation_string_variable"); err != nil { - return err -} \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index 1c1509b019fb..387ce0f9d5fc 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -13,8 +13,6 @@ overrides: !ruby/object:Provider::ResourceOverrides value: !ruby/object:Provider::Azure::Terraform::PropertyOverride custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb - custom_code: !ruby/object:Provider::Terraform::CustomCode - post_read: products/azautomationstringvariable/check_type_after_read.erb acctests: - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition name: basic @@ -30,7 +28,7 @@ overrides: !ruby/object:Provider::ResourceOverrides title: Example Usage example_name: basic resource_name_hints: - resourceGroups: example-rg - automationAccounts: example-account - variables: example-var + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var location: West US diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb index b255691894d9..883380308253 100644 --- a/products/azautomationstringvariable/terraform_set_value.erb +++ b/products/azautomationstringvariable/terraform_set_value.erb @@ -1,10 +1,7 @@ -<% if output_var == 'd' -%> if !d.Get("encrypted").(bool) { - if quotedValue := <%= input_var -%>; quotedValue != nil { - value, _ := strconv.Unquote(*quotedValue) - d.Set("<%= prop_name -%>", value) - } -} -<% else -%> -// Terraform_Set_Value is not supported. -<% end -%> \ No newline at end of file + value, err := parseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) +} \ No newline at end of file From bb1a06902354e5a99beb1561e5645b1152437063 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Thu, 25 Apr 2019 12:42:07 -0700 Subject: [PATCH 071/175] Update set value code --- products/azautomationstringvariable/terraform_set_value.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb index 883380308253..f2b33613cf40 100644 --- a/products/azautomationstringvariable/terraform_set_value.erb +++ b/products/azautomationstringvariable/terraform_set_value.erb @@ -1,5 +1,5 @@ if !d.Get("encrypted").(bool) { - value, err := parseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) if err != nil { return err } From 6ca9ce3641d3d50982405449b0f94b68919a195b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 25 Apr 2019 14:15:26 -0700 Subject: [PATCH 072/175] Set request-only properties back to TF schema --- ...resource_arm_automation_string_variable.go | 2 ++ products/azbatchaccount/api.yaml | 32 ------------------- provider/azure/terraform/sdk/helpers.rb | 3 +- provider/azure/terraform/sdk/sub_template.rb | 10 +++--- .../terraform/sdktypes/enum_schema_assign.erb | 1 + .../sdktypes/nested_object_schema_assign.erb | 3 +- .../sdktypes/primitive_schema_assign.erb | 1 + .../sdktypes/sdkobject_to_property.erb | 10 ++++-- .../azure/terraform/sdktypes/unsupport.erb | 2 +- .../terraform/flatten_property_method.erb | 3 +- templates/terraform/resource.erb | 2 +- 11 files changed, 24 insertions(+), 45 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go index d380a1e1a536..2d02ae83f4c4 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -142,6 +142,8 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf } d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("automation_account_name", accountName) if properties := resp.VariableProperties; properties != nil { d.Set("description", properties.Description) d.Set("encrypted", properties.IsEncrypted) diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 75e32f25092d..c5618ccd0025 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -206,38 +206,6 @@ objects: id_portion: resourceGroups python_parameter_name: resource_group_name python_variable_name: resource_group - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArray - go_type_name: Account - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: AccountProperties - go_type_name: AccountProperties - go_variable_name: properties - '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: AccountEndpoint - '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: AutoStorage - go_type_name: AutoStorageProperties - '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: StorageAccountID - '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: KeyVaultReference - go_type_name: KeyVaultReference - '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: URL - '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: PoolAllocationMode - go_enum_type_name: PoolAllocationMode - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags description: | diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index cff7554a7375..b24aac72a2e5 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -44,7 +44,8 @@ def property_to_sdk_field_assignment_template(property, sdk_type) end end - def property_to_schema_assignment_template(property, sdk_type) + def property_to_schema_assignment_template(property, sdk_operation, api_path) + sdk_type = sdk_operation.response[api_path] || sdk_operation.request[api_path] case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index cd469443275c..1685b96b80f0 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -60,25 +60,25 @@ def build_property_to_sdk_object_empty_sensitive(resource_name, sdk_type_defs, e object: object end - def build_schema_assignment(input, output, property, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object) - compile_template property_to_schema_assignment_template(property, sdk_type_defs[api_path]), + def build_schema_assignment(input, output, property, api_path, sdk_operation, resource_name, flatten_queue, properties, object) + compile_template property_to_schema_assignment_template(property, sdk_operation, api_path), input_statement: input, output: output, api_path: api_path, - sdk_type_defs: sdk_type_defs, + sdk_operation: sdk_operation, resource_name: resource_name, flatten_queue: flatten_queue, properties: properties, object: object end - def build_sdk_object_to_property(input, output, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object, indentation = 4) + def build_sdk_object_to_property(input, output, api_path, sdk_operation, resource_name, flatten_queue, properties, object, indentation = 4) compile_template 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb', indentation: indentation, input_statement: input, output: output, api_path: api_path, - sdk_type_defs: sdk_type_defs, + sdk_operation: sdk_operation, resource_name: resource_name, flatten_queue: flatten_queue, properties: properties, diff --git a/templates/azure/terraform/sdktypes/enum_schema_assign.erb b/templates/azure/terraform/sdktypes/enum_schema_assign.erb index 285970c3238e..5689f1d284d5 100644 --- a/templates/azure/terraform/sdktypes/enum_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_schema_assign.erb @@ -1,3 +1,4 @@ +<% sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request -%> <% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> <% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> <%= lines(build_schema_property_set(input_var, 'd', api_path, sdk_type_defs, resource_name, flatten_queue, property)) -%> diff --git a/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb index 174980f202d3..8b4eb26d47da 100644 --- a/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb @@ -1,7 +1,8 @@ <% + sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request sdk_type = sdk_type_defs[api_path] temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) || input_statement -%> if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { -<%= lines(build_sdk_object_to_property(temp_var, output, api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) -%> +<%= lines(build_sdk_object_to_property(temp_var, output, api_path, sdk_operation, resource_name, flatten_queue, properties, object)) -%> } \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb index 2fb0a2490d81..eb3cb69e68b7 100644 --- a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb @@ -1,3 +1,4 @@ +<% sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request -%> <% sdk_type = sdk_type_defs[api_path] -%> <% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> <% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index 99bfbcdda4f8..fc8880388de0 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -1,7 +1,11 @@ <% direct_children = Set.new properties.sort_by{|p| [p.order, p.name]}.each do |prop| - prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| + child_api_path = nil + prop.azure_sdk_references.each do |ref| + child_api_path = ref if sdk_operation.response.has_key?(ref) || (sdk_operation.request.has_key?(ref) && child_api_path.nil?) + end + unless child_api_path.nil? if api_path == "" sub_paths = child_api_path.split("/") direct_children << child_api_path if sub_paths.length == 1 @@ -19,8 +23,8 @@ direct_children.each do |child_api_path| matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) -%> -<%= lines(build_schema_assignment(input_statement, output, nil, child_api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) if matched_properties.empty? -%> +<%= lines(build_schema_assignment(input_statement, output, nil, child_api_path, sdk_operation, resource_name, flatten_queue, properties, object)) if matched_properties.empty? -%> <% matched_properties.each do |property| -%> -<%= lines(build_schema_assignment(input_statement, output, property, child_api_path, sdk_type_defs, resource_name, flatten_queue, properties, object)) -%> +<%= lines(build_schema_assignment(input_statement, output, property, child_api_path, sdk_operation, resource_name, flatten_queue, properties, object)) -%> <% end -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/unsupport.erb b/templates/azure/terraform/sdktypes/unsupport.erb index 03fe6de36f4d..e436f35812e7 100644 --- a/templates/azure/terraform/sdktypes/unsupport.erb +++ b/templates/azure/terraform/sdktypes/unsupport.erb @@ -1 +1 @@ -// TODO: SDK Reference <%= api_path -%> with type <%= sdk_type_defs[api_path] -%> is not supported \ No newline at end of file +// TODO: SDK Reference <%= api_path -%> is not supported \ No newline at end of file diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index 8ecc584ed2fe..afd40c498382 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -15,6 +15,7 @@ <% resource_name = "Arm" + object.name sdk_package = object.azure_sdk_definition.go_client_namespace + sdk_type_defs = sdk_operation.response sdk_type = sdk_type_defs[api_path] -%> <% if property.custom_flatten -%> @@ -31,7 +32,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa result := make(map[string]interface{}) -<%= lines(build_sdk_object_to_property('input', 'result', api_path, sdk_type_defs, resource_name, flatten_queue, nested_properties(property), object)) -%> +<%= lines(build_sdk_object_to_property('input', 'result', api_path, sdk_operation, resource_name, flatten_queue, nested_properties(property), object)) -%> return []interface{}{result} <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) -%> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 91a240d7f1ae..6cc7cb3e8d18 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -189,7 +189,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> -<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read.response, resource_name, flatten_queue, output_properties, object)) -%> +<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read, resource_name, flatten_queue, output_properties, object)) -%> return nil } From 8d499f47a9693ddc6bdf47a2f0e767a3aa3dafcd Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 25 Apr 2019 14:16:16 -0700 Subject: [PATCH 073/175] Include the latest changes in tf_string_variable --- .../resource_arm_automation_string_variable.go | 12 +++++------- .../docs/r/automation_string_variable.html.markdown | 8 ++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go index 2d02ae83f4c4..ebeec516de05 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable.go @@ -137,9 +137,6 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf return fmt.Errorf("Error reading Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) } - if err := validateAzureRmAutomationVariableType("azurerm_automation_string_variable"); err != nil { - return err - } d.Set("name", resp.Name) d.Set("resource_group_name", resourceGroup) @@ -148,10 +145,11 @@ func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interf d.Set("description", properties.Description) d.Set("encrypted", properties.IsEncrypted) if !d.Get("encrypted").(bool) { - if quotedValue := properties.Value; quotedValue != nil { - value, _ := strconv.Unquote(*quotedValue) - d.Set("value", value) - } + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) } } diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index 6ba199ab0017..1f413bb21dbe 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -28,12 +28,12 @@ Manages an automation variable on Azure. ```hcl resource "azurerm_resource_group" "example" { - name = "example-rg" + name = "tfex-example-rg" location = "West US" } resource "azurerm_automation_account" "example" { - name = "example-account" + name = "tfex-example-account" location = "${azurerm_resource_group.example.location}" resource_group_name = "${azurerm_resource_group.example.name}" @@ -43,7 +43,7 @@ resource "azurerm_automation_account" "example" { } resource "azurerm_automation_string_variable" "example" { - name = "example-var" + name = "tfex-example-var" resource_group_name = "${azurerm_resource_group.example.name}" automation_account_name = "${azurerm_automation_account.example.name}" value = "Hello, Terraform Basic Test." @@ -78,5 +78,5 @@ The following attributes are exported: Automation String Variable can be imported using the `resource id`, e.g. ```shell -$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Automation/automationAccounts/example-account/variables/example-var +$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/tfex-example-rg/providers/Microsoft.Automation/automationAccounts/tfex-example-account/variables/tfex-example-var ``` From ca424466ec86e88a745f0af27f0154fbae3c5ee5 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Thu, 25 Apr 2019 17:34:43 -0700 Subject: [PATCH 074/175] Add Null Variable --- products/azautomationnullvariable/api.yaml | 132 ++++++++++++++++++ .../examples/terraform/basic.yaml | 13 ++ .../examples/terraform/complete.yaml | 14 ++ .../azautomationnullvariable/terraform.yaml | 35 +++++ 4 files changed, 194 insertions(+) create mode 100644 products/azautomationnullvariable/api.yaml create mode 100644 products/azautomationnullvariable/examples/terraform/basic.yaml create mode 100644 products/azautomationnullvariable/examples/terraform/complete.yaml create mode 100644 products/azautomationnullvariable/terraform.yaml diff --git a/products/azautomationnullvariable/api.yaml b/products/azautomationnullvariable/api.yaml new file mode 100644 index 000000000000..75aed574a957 --- /dev/null +++ b/products/azautomationnullvariable/api.yaml @@ -0,0 +1,132 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: azautomationvariable +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_sdk_references: ['variableName', '/name'] + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_sdk_references: ['/properties/description'] + - !ruby/object:Api::Type::String + name: 'value' + description: 'The value of the Automation Variable.' + azure_sdk_references: ['/properties/value'] + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'The encrypted flag of the Automation Variable.' + default_value: false + azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationnullvariable/examples/terraform/basic.yaml b/products/azautomationnullvariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..f93ad5c61271 --- /dev/null +++ b/products/azautomationnullvariable/examples/terraform/basic.yaml @@ -0,0 +1,13 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_null_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} \ No newline at end of file diff --git a/products/azautomationnullvariable/examples/terraform/complete.yaml b/products/azautomationnullvariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..62fba8e308ff --- /dev/null +++ b/products/azautomationnullvariable/examples/terraform/complete.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_null_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. \ No newline at end of file diff --git a/products/azautomationnullvariable/terraform.yaml b/products/azautomationnullvariable/terraform.yaml new file mode 100644 index 000000000000..b2aa0886ff8d --- /dev/null +++ b/products/azautomationnullvariable/terraform.yaml @@ -0,0 +1,35 @@ +--- !ruby/object:Provider::Terraform::Config +name: azautomationnullvariable +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationNullVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + encrypted: !ruby/object:Provider::Azure::Terraform::PropertyOverride + exclude: true + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + exclude: true + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var + location: West US From 3c688222227a297d4bdc6812a4fceac47e603a27 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Thu, 25 Apr 2019 18:57:43 -0700 Subject: [PATCH 075/175] Added more variable resources --- products/azautomationboolvariable/api.yaml | 132 ++++++++++++++++++ .../examples/terraform/basic.yaml | 14 ++ .../examples/terraform/complete.yaml | 15 ++ .../azautomationboolvariable/terraform.yaml | 35 +++++ .../terraform_get_value.erb | 1 + .../terraform_sdk_value.erb | 1 + .../terraform_set_value.erb | 7 + .../azautomationdatetimevariable/api.yaml | 132 ++++++++++++++++++ .../examples/terraform/basic.yaml | 14 ++ .../examples/terraform/complete.yaml | 15 ++ .../terraform.yaml | 34 +++++ .../terraform_get_value.erb | 1 + .../terraform_set_value.erb | 7 + products/azautomationintvariable/api.yaml | 132 ++++++++++++++++++ .../examples/terraform/basic.yaml | 14 ++ .../examples/terraform/complete.yaml | 15 ++ .../azautomationintvariable/terraform.yaml | 34 +++++ .../terraform_get_value.erb | 1 + .../terraform_set_value.erb | 7 + .../terraform/example/hcl_properties.erb | 2 +- 20 files changed, 612 insertions(+), 1 deletion(-) create mode 100644 products/azautomationboolvariable/api.yaml create mode 100644 products/azautomationboolvariable/examples/terraform/basic.yaml create mode 100644 products/azautomationboolvariable/examples/terraform/complete.yaml create mode 100644 products/azautomationboolvariable/terraform.yaml create mode 100644 products/azautomationboolvariable/terraform_get_value.erb create mode 100644 products/azautomationboolvariable/terraform_sdk_value.erb create mode 100644 products/azautomationboolvariable/terraform_set_value.erb create mode 100644 products/azautomationdatetimevariable/api.yaml create mode 100644 products/azautomationdatetimevariable/examples/terraform/basic.yaml create mode 100644 products/azautomationdatetimevariable/examples/terraform/complete.yaml create mode 100644 products/azautomationdatetimevariable/terraform.yaml create mode 100644 products/azautomationdatetimevariable/terraform_get_value.erb create mode 100644 products/azautomationdatetimevariable/terraform_set_value.erb create mode 100644 products/azautomationintvariable/api.yaml create mode 100644 products/azautomationintvariable/examples/terraform/basic.yaml create mode 100644 products/azautomationintvariable/examples/terraform/complete.yaml create mode 100644 products/azautomationintvariable/terraform.yaml create mode 100644 products/azautomationintvariable/terraform_get_value.erb create mode 100644 products/azautomationintvariable/terraform_set_value.erb diff --git a/products/azautomationboolvariable/api.yaml b/products/azautomationboolvariable/api.yaml new file mode 100644 index 000000000000..709871e42c58 --- /dev/null +++ b/products/azautomationboolvariable/api.yaml @@ -0,0 +1,132 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: azautomationvariable +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_sdk_references: ['variableName', '/name'] + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_sdk_references: ['/properties/description'] + - !ruby/object:Api::Type::Boolean + name: 'value' + description: 'The value of the Automation Variable.' + azure_sdk_references: ['/properties/value'] + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'The encrypted flag of the Automation Variable.' + default_value: false + azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationboolvariable/examples/terraform/basic.yaml b/products/azautomationboolvariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..4f3ca8533126 --- /dev/null +++ b/products/azautomationboolvariable/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_bool_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + value: false \ No newline at end of file diff --git a/products/azautomationboolvariable/examples/terraform/complete.yaml b/products/azautomationboolvariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..6a3fa8eb02b6 --- /dev/null +++ b/products/azautomationboolvariable/examples/terraform/complete.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_bool_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. + value: true \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform.yaml b/products/azautomationboolvariable/terraform.yaml new file mode 100644 index 000000000000..16f91a7f7eff --- /dev/null +++ b/products/azautomationboolvariable/terraform.yaml @@ -0,0 +1,35 @@ +--- !ruby/object:Provider::Terraform::Config +name: azautomationboolvariable +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationBoolVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_get: products/azautomationboolvariable/terraform_get_value.erb + custom_schema_set: products/azautomationboolvariable/terraform_set_value.erb + custom_sdkfield_assign: products/azautomationboolvariable/terraform_sdk_value.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var + location: West US diff --git a/products/azautomationboolvariable/terraform_get_value.erb b/products/azautomationboolvariable/terraform_get_value.erb new file mode 100644 index 000000000000..d5f4e7130dc7 --- /dev/null +++ b/products/azautomationboolvariable/terraform_get_value.erb @@ -0,0 +1 @@ +<%= output_var -%> := strconv.FormatBool(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform_sdk_value.erb b/products/azautomationboolvariable/terraform_sdk_value.erb new file mode 100644 index 000000000000..e9520c1ab0fa --- /dev/null +++ b/products/azautomationboolvariable/terraform_sdk_value.erb @@ -0,0 +1 @@ +Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform_set_value.erb b/products/azautomationboolvariable/terraform_set_value.erb new file mode 100644 index 000000000000..403b1dba98f3 --- /dev/null +++ b/products/azautomationboolvariable/terraform_set_value.erb @@ -0,0 +1,7 @@ +if !d.Get("encrypted").(bool) { + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_bool_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) +} \ No newline at end of file diff --git a/products/azautomationdatetimevariable/api.yaml b/products/azautomationdatetimevariable/api.yaml new file mode 100644 index 000000000000..75aed574a957 --- /dev/null +++ b/products/azautomationdatetimevariable/api.yaml @@ -0,0 +1,132 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: azautomationvariable +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_sdk_references: ['variableName', '/name'] + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_sdk_references: ['/properties/description'] + - !ruby/object:Api::Type::String + name: 'value' + description: 'The value of the Automation Variable.' + azure_sdk_references: ['/properties/value'] + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'The encrypted flag of the Automation Variable.' + default_value: false + azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationdatetimevariable/examples/terraform/basic.yaml b/products/azautomationdatetimevariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..6861d18f2337 --- /dev/null +++ b/products/azautomationdatetimevariable/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationdatetimevariable/examples/terraform/complete.yaml b/products/azautomationdatetimevariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..8268f4f900b2 --- /dev/null +++ b/products/azautomationdatetimevariable/examples/terraform/complete.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. + value: Hello, Terraform Complete Test. \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform.yaml b/products/azautomationdatetimevariable/terraform.yaml new file mode 100644 index 000000000000..387ce0f9d5fc --- /dev/null +++ b/products/azautomationdatetimevariable/terraform.yaml @@ -0,0 +1,34 @@ +--- !ruby/object:Provider::Terraform::Config +name: azautomationstringvariable +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationStringVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb + custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var + location: West US diff --git a/products/azautomationdatetimevariable/terraform_get_value.erb b/products/azautomationdatetimevariable/terraform_get_value.erb new file mode 100644 index 000000000000..819f62f2c41f --- /dev/null +++ b/products/azautomationdatetimevariable/terraform_get_value.erb @@ -0,0 +1 @@ +<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_set_value.erb b/products/azautomationdatetimevariable/terraform_set_value.erb new file mode 100644 index 000000000000..f2b33613cf40 --- /dev/null +++ b/products/azautomationdatetimevariable/terraform_set_value.erb @@ -0,0 +1,7 @@ +if !d.Get("encrypted").(bool) { + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) +} \ No newline at end of file diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml new file mode 100644 index 000000000000..75aed574a957 --- /dev/null +++ b/products/azautomationintvariable/api.yaml @@ -0,0 +1,132 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: azautomationvariable +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_sdk_references: ['variableName', '/name'] + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_sdk_references: ['/properties/description'] + - !ruby/object:Api::Type::String + name: 'value' + description: 'The value of the Automation Variable.' + azure_sdk_references: ['/properties/value'] + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'The encrypted flag of the Automation Variable.' + default_value: false + azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationintvariable/examples/terraform/basic.yaml b/products/azautomationintvariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..6861d18f2337 --- /dev/null +++ b/products/azautomationintvariable/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationintvariable/examples/terraform/complete.yaml b/products/azautomationintvariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..8268f4f900b2 --- /dev/null +++ b/products/azautomationintvariable/examples/terraform/complete.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_string_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. + value: Hello, Terraform Complete Test. \ No newline at end of file diff --git a/products/azautomationintvariable/terraform.yaml b/products/azautomationintvariable/terraform.yaml new file mode 100644 index 000000000000..387ce0f9d5fc --- /dev/null +++ b/products/azautomationintvariable/terraform.yaml @@ -0,0 +1,34 @@ +--- !ruby/object:Provider::Terraform::Config +name: azautomationstringvariable +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationStringVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb + custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var + location: West US diff --git a/products/azautomationintvariable/terraform_get_value.erb b/products/azautomationintvariable/terraform_get_value.erb new file mode 100644 index 000000000000..819f62f2c41f --- /dev/null +++ b/products/azautomationintvariable/terraform_get_value.erb @@ -0,0 +1 @@ +<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_set_value.erb b/products/azautomationintvariable/terraform_set_value.erb new file mode 100644 index 000000000000..f2b33613cf40 --- /dev/null +++ b/products/azautomationintvariable/terraform_set_value.erb @@ -0,0 +1,7 @@ +if !d.Get("encrypted").(bool) { + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) +} \ No newline at end of file diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb index 98f756a6f54f..be26f81059c6 100644 --- a/templates/azure/terraform/example/hcl_properties.erb +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -10,7 +10,7 @@ if prop[1].is_a?(String) -%> <%= prop[0].ljust(prop_alignment) -%> = "<%= prop[1] -%>" -<% elsif prop[1].is_a?(Integer) -%> +<% elsif prop[1].is_a?(Integer) || prop[1].is_a?(TrueClass) || prop[1].is_a?(FalseClass) -%> <%= prop[0].ljust(prop_alignment) -%> = <%= prop[1] -%> <% else -%> // TODO: Unsupported property "<%= prop[0] -%>" value <%= prop[1] -%> From 35b5c479ff9245500a564b9c558fcddcd7573c55 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Fri, 26 Apr 2019 13:07:28 -0700 Subject: [PATCH 076/175] Added int support --- .../azautomationdatetimevariable/api.yaml | 132 ------------------ .../examples/terraform/basic.yaml | 14 -- .../examples/terraform/complete.yaml | 15 -- .../terraform.yaml | 34 ----- .../terraform_get_value.erb | 1 - .../terraform_set_value.erb | 7 - products/azautomationintvariable/api.yaml | 2 +- .../examples/terraform/basic.yaml | 4 +- .../examples/terraform/complete.yaml | 4 +- .../azautomationintvariable/terraform.yaml | 9 +- .../terraform_get_value.erb | 2 +- .../terraform_sdk_value.erb | 1 + .../terraform_set_value.erb | 2 +- provider/azure/terraform/schema.rb | 5 +- .../terraform/expand_property_method.erb | 2 +- .../terraform/flatten_property_method.erb | 2 +- templates/terraform/schemas/primitive.erb | 2 +- 17 files changed, 20 insertions(+), 218 deletions(-) delete mode 100644 products/azautomationdatetimevariable/api.yaml delete mode 100644 products/azautomationdatetimevariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationdatetimevariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationdatetimevariable/terraform.yaml delete mode 100644 products/azautomationdatetimevariable/terraform_get_value.erb delete mode 100644 products/azautomationdatetimevariable/terraform_set_value.erb create mode 100644 products/azautomationintvariable/terraform_sdk_value.erb diff --git a/products/azautomationdatetimevariable/api.yaml b/products/azautomationdatetimevariable/api.yaml deleted file mode 100644 index 75aed574a957..000000000000 --- a/products/azautomationdatetimevariable/api.yaml +++ /dev/null @@ -1,132 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationvariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::String - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'The encrypted flag of the Automation Variable.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationdatetimevariable/examples/terraform/basic.yaml b/products/azautomationdatetimevariable/examples/terraform/basic.yaml deleted file mode 100644 index 6861d18f2337..000000000000 --- a/products/azautomationdatetimevariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationdatetimevariable/examples/terraform/complete.yaml b/products/azautomationdatetimevariable/examples/terraform/complete.yaml deleted file mode 100644 index 8268f4f900b2..000000000000 --- a/products/azautomationdatetimevariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. - value: Hello, Terraform Complete Test. \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform.yaml b/products/azautomationdatetimevariable/terraform.yaml deleted file mode 100644 index 387ce0f9d5fc..000000000000 --- a/products/azautomationdatetimevariable/terraform.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationstringvariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationStringVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb - custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US diff --git a/products/azautomationdatetimevariable/terraform_get_value.erb b/products/azautomationdatetimevariable/terraform_get_value.erb deleted file mode 100644 index 819f62f2c41f..000000000000 --- a/products/azautomationdatetimevariable/terraform_get_value.erb +++ /dev/null @@ -1 +0,0 @@ -<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_set_value.erb b/products/azautomationdatetimevariable/terraform_set_value.erb deleted file mode 100644 index f2b33613cf40..000000000000 --- a/products/azautomationdatetimevariable/terraform_set_value.erb +++ /dev/null @@ -1,7 +0,0 @@ -if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) -} \ No newline at end of file diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml index 75aed574a957..4d8c0f429695 100644 --- a/products/azautomationintvariable/api.yaml +++ b/products/azautomationintvariable/api.yaml @@ -116,7 +116,7 @@ objects: name: 'description' description: 'The description of the Automation Variable.' azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::String + - !ruby/object:Api::Type::Integer name: 'value' description: 'The value of the Automation Variable.' azure_sdk_references: ['/properties/value'] diff --git a/products/azautomationintvariable/examples/terraform/basic.yaml b/products/azautomationintvariable/examples/terraform/basic.yaml index 6861d18f2337..0b8f5d927131 100644 --- a/products/azautomationintvariable/examples/terraform/basic.yaml +++ b/products/azautomationintvariable/examples/terraform/basic.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable +resource: azurerm_automation_int_variable prerequisites: - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup @@ -11,4 +11,4 @@ properties: name: "<%= get_resource_name('variables', 'AutoVar') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: Hello, Terraform Basic Test. \ No newline at end of file + value: 1234 \ No newline at end of file diff --git a/products/azautomationintvariable/examples/terraform/complete.yaml b/products/azautomationintvariable/examples/terraform/complete.yaml index 8268f4f900b2..6866b75f32fa 100644 --- a/products/azautomationintvariable/examples/terraform/complete.yaml +++ b/products/azautomationintvariable/examples/terraform/complete.yaml @@ -1,5 +1,5 @@ --- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable +resource: azurerm_automation_int_variable prerequisites: - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup @@ -12,4 +12,4 @@ properties: resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} description: This variable is created by Terraform acceptance test. - value: Hello, Terraform Complete Test. \ No newline at end of file + value: 12345 \ No newline at end of file diff --git a/products/azautomationintvariable/terraform.yaml b/products/azautomationintvariable/terraform.yaml index 387ce0f9d5fc..3e3007d13ba4 100644 --- a/products/azautomationintvariable/terraform.yaml +++ b/products/azautomationintvariable/terraform.yaml @@ -1,8 +1,8 @@ --- !ruby/object:Provider::Terraform::Config -name: azautomationstringvariable +name: azautomationintvariable overrides: !ruby/object:Provider::ResourceOverrides AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationStringVariable + name: AutomationIntVariable properties: name: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation @@ -11,8 +11,9 @@ overrides: !ruby/object:Provider::ResourceOverrides validation: !ruby/object:Provider::Terraform::Validation function: validate.NoEmptyStrings value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb - custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb + custom_schema_get: products/azautomationintvariable/terraform_get_value.erb + custom_schema_set: products/azautomationintvariable/terraform_set_value.erb + custom_sdkfield_assign: products/azautomationintvariable/terraform_sdk_value.erb acctests: - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition name: basic diff --git a/products/azautomationintvariable/terraform_get_value.erb b/products/azautomationintvariable/terraform_get_value.erb index 819f62f2c41f..551568401104 100644 --- a/products/azautomationintvariable/terraform_get_value.erb +++ b/products/azautomationintvariable/terraform_get_value.erb @@ -1 +1 @@ -<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file +<%= output_var -%> := strconv.Itoa(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_sdk_value.erb b/products/azautomationintvariable/terraform_sdk_value.erb new file mode 100644 index 000000000000..e9520c1ab0fa --- /dev/null +++ b/products/azautomationintvariable/terraform_sdk_value.erb @@ -0,0 +1 @@ +Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_set_value.erb b/products/azautomationintvariable/terraform_set_value.erb index f2b33613cf40..07343a0de429 100644 --- a/products/azautomationintvariable/terraform_set_value.erb +++ b/products/azautomationintvariable/terraform_set_value.erb @@ -1,5 +1,5 @@ if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_int_variable", properties.Value) if err != nil { return err } diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 59bd473af023..e12e3f01fa3b 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -9,6 +9,8 @@ def go_type(property) 'bool' when Api::Type::Enum, Api::Type::String 'string' + when Api::Type::Integer + 'int' when Api::Type::KeyValuePairs 'map[string]interface{}' when Api::Type::NestedObject @@ -35,6 +37,7 @@ def expand_funcs { Api::Type::Boolean => 'utils.Bool', Api::Type::String => 'utils.String', + Api::Type::Integer => 'utils.Int', Api::Azure::Type::Location => "utils.String", Api::Azure::Type::Tags => 'expandTags', Api::Azure::Type::ResourceReference => "utils.String" @@ -50,7 +53,7 @@ def schema_property_template(property) 'templates/azure/terraform/schemas/location.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs, Api::Type::NestedObject + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::KeyValuePairs, Api::Type::NestedObject 'templates/terraform/schemas/primitive.erb' else 'templates/terraform/schemas/unsupport.erb' diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index b54d94ca1372..fa5fd5629f0c 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -126,7 +126,7 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type( <% end -%> <% end # nested_properties, array of resourcerefs, else -%> <% else -%> - // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported + // TODO: Expand Property '<%= property.name -%>' of type <%= property.class -%> is not supported } <% end # tf_types.include?(property.class) -%> <% end # custom_code check -%> diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index afd40c498382..23458b538c72 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -104,6 +104,6 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa <% end -%> <% end -%> <% else -%> - // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported + // TODO: Flatten Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> <% end # custom code check -%> diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index 18aa8baddfa8..af5dd761f1b1 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -127,5 +127,5 @@ <% end -%> }, <% else -%> -// TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported +// TODO: Primitive Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> From a47dbe5840577789eb55b18e8300aad9fa46e965 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 26 Apr 2019 16:12:29 -0700 Subject: [PATCH 077/175] Refactor SDK marshal/unmarshal parameters. --- api/azure/sdk_type_definition.rb | 8 +- .../resource_arm_api_management_policy.go | 2 + .../resource_arm_automation_null_variable.go | 155 +++++++++++++ ...ource_arm_automation_null_variable_test.go | 211 ++++++++++++++++++ .../azurerm/resource_arm_batch_account.go | 1 + ...rm_service_bus_disaster_recovery_config.go | 14 +- ...rvice_bus_disaster_recovery_config_test.go | 2 +- .../r/automation_null_variable.html.markdown | 77 +++++++ products/azservicebusrecovery/api.yaml | 16 +- products/azservicebusrecovery/terraform.yaml | 3 + provider/azure/terraform.rb | 2 + .../sdk/expand_flatten_descriptor.rb | 14 +- provider/azure/terraform/sdk/helpers.rb | 8 +- .../terraform/sdk/sdk_marshal_descriptor.rb | 35 +++ .../sdk/sdk_type_definition_descriptor.rb | 41 ++++ provider/azure/terraform/sdk/sub_template.rb | 71 ++---- provider/terraform/sub_template.rb | 16 +- .../acctest/parameters_from_schema.erb | 2 +- .../terraform/sdktypes/enum_field_assign.erb | 4 +- .../terraform/sdktypes/enum_schema_assign.erb | 7 +- .../sdktypes/expand_func_field_assign.erb | 11 +- .../sdktypes/nested_object_field_assign.erb | 6 +- .../sdktypes/nested_object_schema_assign.erb | 9 +- .../sdktypes/primitive_schema_assign.erb | 8 +- .../sdktypes/property_to_sdkobject.erb | 22 +- .../property_to_sdkobject_empty_sensitive.erb | 21 +- .../sdktypes/sdkobject_to_property.erb | 22 +- .../azure/terraform/sdktypes/unsupport.erb | 2 +- .../terraform/expand_property_method.erb | 31 ++- .../terraform/flatten_property_method.erb | 18 +- templates/terraform/resource.erb | 27 ++- templates/terraform/schemas/flatten_set.erb | 6 +- 32 files changed, 668 insertions(+), 204 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_automation_null_variable.go create mode 100644 build/azterraform/azurerm/resource_arm_automation_null_variable_test.go create mode 100644 build/azterraform/website/docs/r/automation_null_variable.html.markdown create mode 100644 provider/azure/terraform/sdk/sdk_marshal_descriptor.rb create mode 100644 provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 88e37f05ae23..f27a307621a9 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -8,6 +8,7 @@ class SDKTypeDefinition < Api::Object attr_reader :empty_value_sensitive attr_reader :go_variable_name attr_reader :go_field_name + attr_reader :go_type_name attr_reader :python_parameter_name attr_reader :python_variable_name attr_reader :python_field_name @@ -22,6 +23,7 @@ def validate check_optional_property_list_oneof :applicable_to, ['go', 'python'], String check_optional_property :go_variable_name, String check_optional_property :go_field_name, String + check_optional_property :go_type_name, String check_optional_property :python_parameter_name, String check_optional_property :python_variable_name, String check_optional_property :python_field_name, String @@ -53,12 +55,6 @@ def validate end class ComplexObject < SDKTypeDefinition - attr_reader :go_type_name - - def validate - super - check_optional_property :go_type_name, String - end end class ComplexArray < ComplexObject diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy.go b/build/azterraform/azurerm/resource_arm_api_management_policy.go index c37d0de7d43b..0728e2aa2c6a 100644 --- a/build/azterraform/azurerm/resource_arm_api_management_policy.go +++ b/build/azterraform/azurerm/resource_arm_api_management_policy.go @@ -128,6 +128,8 @@ func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{} } + d.Set("resource_group_name", resourceGroup) + d.Set("api_management_name", serviceName) if properties := resp.PolicyContractProperties; properties != nil { d.Set("xml_content", "") d.Set("xml_link", "") diff --git a/build/azterraform/azurerm/resource_arm_automation_null_variable.go b/build/azterraform/azurerm/resource_arm_automation_null_variable.go new file mode 100644 index 000000000000..a47c9b4ed13c --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_automation_null_variable.go @@ -0,0 +1,155 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmAutomationNullVariable() *schema.Resource { + return &schema.Resource{ + Create: resourceArmAutomationNullVariableCreateUpdate, + Read: resourceArmAutomationNullVariableRead, + Update: resourceArmAutomationNullVariableCreateUpdate, + Delete: resourceArmAutomationNullVariableDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "automation_account_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "description": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceArmAutomationNullVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + accountName := d.Get("automation_account_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_automation_null_variable", *resp.ID) + } + } + + description := d.Get("description").(string) + + parameters := automation.VariableCreateOrUpdateParameters{ + Name: utils.String(name), + VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ + Description: utils.String(description), + }, + } + + + if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { + return fmt.Errorf("Error creating Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + return fmt.Errorf("Error retrieving Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Automation Null Variable %q (Automation Account Name %q / Resource Group %q) ID", name, accountName, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmAutomationNullVariableRead(d, meta) +} + +func resourceArmAutomationNullVariableRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + accountName := id.Path["automationAccounts"] + name := id.Path["variables"] + + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Automation Null Variable %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("automation_account_name", accountName) + if properties := resp.VariableProperties; properties != nil { + d.Set("description", properties.Description) + } + + return nil +} + + +func resourceArmAutomationNullVariableDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + accountName := id.Path["automationAccounts"] + name := id.Path["variables"] + + if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { + return fmt.Errorf("Error deleting Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go new file mode 100644 index 000000000000..7ad71e85ceb7 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go @@ -0,0 +1,211 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func TestAccAzureRMAutomationNullVariable_basic(t *testing.T) { + resourceName := "azurerm_automation_null_variable.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAutomationNullVariable_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationNullVariableExists(resourceName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMAutomationNullVariable_complete(t *testing.T) { + resourceName := "azurerm_automation_null_variable.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAutomationNullVariable_complete(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationNullVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMAutomationNullVariable_basicCompleteUpdate(t *testing.T) { + resourceName := "azurerm_automation_null_variable.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAutomationNullVariable_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationNullVariableExists(resourceName), + ), + }, + { + Config: testAccAzureRMAutomationNullVariable_complete(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationNullVariableExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), + ), + }, + { + Config: testAccAzureRMAutomationNullVariable_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAutomationNullVariableExists(resourceName), + ), + }, + }, + }) +} + + +func testCheckAzureRMAutomationNullVariableExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Automation Null Variable not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + accountName := rs.Primary.Attributes["automation_account_name"] + + client := testAccProvider.Meta().(*ArmClient).automationVariableClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Automation Null Variable %q (Automation Account Name %q / Resource Group %q) does not exist", name, accountName, resourceGroup) + } + return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMAutomationNullVariableDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).automationVariableClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_automation_null_variable" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + accountName := rs.Primary.Attributes["automation_account_name"] + + if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) + } + } + + return nil + } + + return nil +} + +func testAccAzureRMAutomationNullVariable_basic(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_automation_account" "test" { + name = "acctestAutoAcct-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + + sku = { + name = "Basic" + } +} + +resource "azurerm_automation_null_variable" "test" { + name = "acctestAutoVar-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + automation_account_name = "${azurerm_automation_account.test.name}" +} +`, rInt, location, rInt, rInt) +} + +func testAccAzureRMAutomationNullVariable_complete(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_automation_account" "test" { + name = "acctestAutoAcct-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + + sku = { + name = "Basic" + } +} + +resource "azurerm_automation_null_variable" "test" { + name = "acctestAutoVar-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + automation_account_name = "${azurerm_automation_account.test.name}" + description = "This variable is created by Terraform acceptance test." +} +`, rInt, location, rInt, rInt) +} diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 188521f73a34..89ae1b86c369 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -172,6 +172,7 @@ func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) if location := resp.Location; location != nil { d.Set("location", azureRMNormalizeLocation(*location)) } diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go index b7a70f813fb2..88f8706c93e9 100644 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go @@ -68,7 +68,7 @@ func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceD resp, err := client.Get(ctx, resourceGroup, servicebusName, name) if err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + return fmt.Errorf("Error checking for present of existing Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) } } if !utils.ResponseWasNotFound(resp.Response) { @@ -88,16 +88,16 @@ func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceD if _, err := client.CreateOrUpdate(ctx, resourceGroup, servicebusName, name, parameters); err != nil { - return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) } resp, err := client.Get(ctx, resourceGroup, servicebusName, name) if err != nil { - return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) } if resp.ID == nil { - return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q) ID", name, servicebusName, resourceGroup) + return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q) ID", name, resourceGroup, servicebusName) } d.SetId(*resp.ID) @@ -123,11 +123,13 @@ func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, met d.SetId("") return nil } - return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) } d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("namespace_name", servicebusName) if armDisasterRecoveryProperties := resp.ArmDisasterRecoveryProperties; armDisasterRecoveryProperties != nil { d.Set("alternate_name", armDisasterRecoveryProperties.AlternateName) d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) @@ -151,7 +153,7 @@ func resourceArmServiceBusDisasterRecoveryConfigDelete(d *schema.ResourceData, m name := id.Path["disasterRecoveryConfigs"] if _, err := client.Delete(ctx, resourceGroup, servicebusName, name); err != nil { - return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q): %+v", name, servicebusName, resourceGroup, err) + return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) } return nil diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go index 48fbfc0c3e79..0a2800c3b24d 100644 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go +++ b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go @@ -41,7 +41,7 @@ func testCheckAzureRMServiceBusDisasterRecoveryConfigExists(resourceName string) if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Namespace Name %q / Resource Group %q) does not exist", name, servicebusName, resourceGroup) + return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q) does not exist", name, resourceGroup, servicebusName) } return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) } diff --git a/build/azterraform/website/docs/r/automation_null_variable.html.markdown b/build/azterraform/website/docs/r/automation_null_variable.html.markdown new file mode 100644 index 000000000000..acb4be8e659d --- /dev/null +++ b/build/azterraform/website/docs/r/automation_null_variable.html.markdown @@ -0,0 +1,77 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_automation_null_variable" +sidebar_current: "docs-azurerm-resource-automation-null-variable" +description: |- + Manages an automation variable on Azure. +--- + +# azurerm_automation_null_variable + +Manages an automation variable on Azure. + + +## Example Usage + +```hcl +resource "azurerm_resource_group" "example" { + name = "tfex-example-rg" + location = "West US" +} + +resource "azurerm_automation_account" "example" { + name = "tfex-example-account" + location = "${azurerm_resource_group.example.location}" + resource_group_name = "${azurerm_resource_group.example.name}" + + sku = { + name = "Basic" + } +} + +resource "azurerm_automation_null_variable" "example" { + name = "tfex-example-var" + resource_group_name = "${azurerm_resource_group.example.name}" + automation_account_name = "${azurerm_automation_account.example.name}" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the Automation Variable. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which to create the Automation Variable. Changing this forces a new resource to be created. + +* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. Changing this forces a new resource to be created. + +* `description` - (Optional) The description of the Automation Variable. + +## Attributes Reference + +The following attributes are exported: + +* `id` - The ID of the Automation Variable. + + +## Import + +Automation Null Variable can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_automation_null_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/tfex-example-rg/providers/Microsoft.Automation/automationAccounts/tfex-example-account/variables/tfex-example-var +``` diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index c1989be24176..1d2368489225 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -96,27 +96,25 @@ objects: description: | Manages a service bus disaster recovery config on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the service bus disaster recovery.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] properties: - !ruby/object:Api::Type::String name: 'name' description: 'The name of the service bus disaster recovery.' required: true input: true - order: 800 azure_sdk_references: ['alias', '/name'] - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the service bus disaster recovery.' - required: true - input: true - order: 810 - azure_sdk_references: ['resourceGroupName'] - !ruby/object:Api::Type::String name: 'namespaceName' description: 'The name of the service bus namespace in which the config is created.' required: true input: true - order: 820 azure_sdk_references: ['namespaceName'] - !ruby/object:Api::Type::String name: 'partnerNamespace' diff --git a/products/azservicebusrecovery/terraform.yaml b/products/azservicebusrecovery/terraform.yaml index 2af7686284ce..88a15aca1350 100644 --- a/products/azservicebusrecovery/terraform.yaml +++ b/products/azservicebusrecovery/terraform.yaml @@ -2,6 +2,9 @@ name: Arm overrides: !ruby/object:Provider::ResourceOverrides ServiceBusDisasterRecoveryConfig: !ruby/object:Provider::Terraform::ResourceOverride + properties: + namespaceName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + order: 700 example: - !ruby/object:Provider::Terraform::Examples name: "resource_group" diff --git a/provider/azure/terraform.rb b/provider/azure/terraform.rb index 2087b8f48a45..5a406dba3269 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform.rb @@ -1,6 +1,8 @@ require 'provider/azure/terraform/helpers' require 'provider/azure/terraform/schema' require 'provider/azure/terraform/sub_template' +require 'provider/azure/terraform/sdk/sdk_type_definition_descriptor' +require 'provider/azure/terraform/sdk/sdk_marshal_descriptor' require 'provider/azure/terraform/sdk/expand_flatten_descriptor' require 'provider/azure/terraform/sdk/sub_template' require 'provider/azure/terraform/sdk/helpers' diff --git a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb index de9875bf155a..ed13c7f9777f 100644 --- a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb +++ b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb @@ -1,21 +1,19 @@ +require 'provider/azure/terraform/sdk/sdk_type_definition_descriptor' + module Provider module Azure module Terraform module SDK class ExpandFlattenDescriptor attr_reader :property - attr_reader :api_path - attr_reader :sdk_type - attr_reader :sdk_type_defs + attr_reader :sdkmarshal - def initialize(property, api_path, sdk_type_defs) + def initialize(property, sdkmarshal) @property = property - @api_path = api_path - @sdk_type_defs = sdk_type_defs - @sdk_type = sdk_type_defs[api_path] + @sdkmarshal = sdkmarshal end end end end end -end \ No newline at end of file +end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index b24aac72a2e5..34128529c028 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -5,7 +5,7 @@ module Azure module Terraform module SDK module Helpers - def get_properties_matching_sdk_reference(properties, sdk_reference, object) + def get_properties_matching_sdk_reference(properties, sdk_reference) properties.select{|p| p.azure_sdk_references.include?(sdk_reference)}.sort_by{|p| [p.order, p.name]} end @@ -22,12 +22,6 @@ def get_sdk_typedef_by_references(references, typedefs) typedefs[ref] end - def expand_or_flatten_enqueue(expand_queue, property, api_path, sdk_type_defs) - sdk_type = sdk_type_defs[api_path] - existed = expand_queue.any?{|exp| exp.property == property && exp.sdk_type.go_type_name == sdk_type.go_type_name} - expand_queue << ExpandFlattenDescriptor.new(property, api_path, sdk_type_defs) unless existed - end - def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) diff --git a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb new file mode 100644 index 000000000000..465a67d9c5f9 --- /dev/null +++ b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb @@ -0,0 +1,35 @@ +require 'provider/azure/terraform/sdk/sdk_type_definition_descriptor' + +module Provider + module Azure + module Terraform + module SDK + class MarshalDescriptor + attr_reader :package + attr_reader :resource + attr_reader :queue + attr_reader :sdktype + attr_reader :properties + + def initialize(package, resource, queue, sdktype, properties) + @package = package + @resource = resource + @queue = queue + @sdktype = sdktype + @properties = properties + end + + def clone(typedef_reference = nil, properties = nil) + sdktype = @sdktype.clone(typedef_reference) + MarshalDescriptor.new @package, @resource, @queue, sdktype, (properties || @properties) + end + + def enqueue(property) + existed = @queue.any?{|e| e.property == property && e.sdktype.go_type_name == @sdktype.go_type_name} + @queue << ExpandFlattenDescriptor.new(property, self) unless existed + end + end + end + end + end +end diff --git a/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb b/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb new file mode 100644 index 000000000000..6240d75138b2 --- /dev/null +++ b/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb @@ -0,0 +1,41 @@ +module Provider + module Azure + module Terraform + module SDK + class TypeDefinitionDescriptor + attr_reader :operation + attr_reader :typedef_reference + + def initialize(operation, isRequest, reference = nil) + @operation = operation + @isRequest = isRequest + @typedef_reference = reference || (@isRequest ? '/' : '') + end + + def clone(typedef_reference = nil) + TypeDefinitionDescriptor.new @operation, @isRequest, (typedef_reference || @typedef_reference) + end + + def type_definitions + return @operation.request if @isRequest + @operation.response.has_key?(@typedef_reference) ? @operation.response : @operation.request + end + + def type_definition + type_definitions[@typedef_reference] + end + + def go_type_name + return type_definition.go_type_name unless type_definition.nil? + nil + end + + def go_field_name + return type_definition.go_field_name unless type_definition.nil? + nil + end + end + end + end + end +end diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 1685b96b80f0..5999635cea97 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -3,86 +3,59 @@ module Azure module Terraform module SDK module SubTemplate - def build_schema_property_get(input, output, property, object, indentation = 0) + def build_schema_property_get(input, output, property, sdk_marshal, indentation = 0) compile_template schema_property_get_template(property), indentation: indentation, input_var: input, output_var: output, - prop_name: property.name.underscore, + sdk_marshal: sdk_marshal, property: property, - object: object + prop_name: property.name.underscore end - def build_schema_property_set(input, output, api_path, sdk_type_defs, resource_name, flatten_queue, property, indentation = 0) + def build_schema_property_set(input, output, property, sdk_marshal, indentation = 0) compile_template schema_property_set_template(property), indentation: indentation, input_var: input, output_var: output, - api_path: api_path, - sdk_type_defs: sdk_type_defs, - prop_name: property.name.underscore, property: property, - resource_name: resource_name, - flatten_queue: flatten_queue + sdk_marshal: sdk_marshal, + prop_name: property.name.underscore end - def build_sdk_field_assignment(property, api_path, sdk_type_defs, resource_name, expand_queue, properties, object, in_structure = true) - compile_template property_to_sdk_field_assignment_template(property, sdk_type_defs[api_path]), + def build_sdk_field_assignment(property, sdk_marshal, in_structure = true) + compile_template property_to_sdk_field_assignment_template(property, sdk_marshal.sdktype.type_definition), property: property, - api_path: api_path, - sdk_type_defs: sdk_type_defs, - resource_name: resource_name, - expand_queue: expand_queue, - properties: properties, - in_structure: in_structure, - object: object + sdk_marshal: sdk_marshal, + in_structure: in_structure end - def build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4, include_empty = false) + def build_property_to_sdk_object(sdk_marshal, indentation = 4, include_empty = false) compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject.erb', indentation: indentation, - resource_name: resource_name, - api_path: api_path, - sdk_type_defs: sdk_type_defs, - expand_queue: expand_queue, - include_empty: include_empty, - properties: properties, - object: object + sdk_marshal: sdk_marshal, + include_empty: include_empty end - def build_property_to_sdk_object_empty_sensitive(resource_name, sdk_type_defs, expand_queue, properties, object, indentation = 4) + def build_property_to_sdk_object_empty_sensitive(sdk_marshal, indentation = 4) compile_template 'templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb', indentation: indentation, - resource_name: resource_name, - sdk_type_defs: sdk_type_defs, - expand_queue: expand_queue, - properties: properties, - object: object + sdk_marshal: sdk_marshal end - def build_schema_assignment(input, output, property, api_path, sdk_operation, resource_name, flatten_queue, properties, object) - compile_template property_to_schema_assignment_template(property, sdk_operation, api_path), - input_statement: input, + def build_schema_assignment(input, output, property, sdk_marshal) + compile_template property_to_schema_assignment_template(property, sdk_marshal.sdktype.operation, sdk_marshal.sdktype.typedef_reference), + input: input, output: output, - api_path: api_path, - sdk_operation: sdk_operation, - resource_name: resource_name, - flatten_queue: flatten_queue, - properties: properties, - object: object + sdk_marshal: sdk_marshal end - def build_sdk_object_to_property(input, output, api_path, sdk_operation, resource_name, flatten_queue, properties, object, indentation = 4) + def build_sdk_object_to_property(input, output, sdk_marshal, indentation = 4) compile_template 'templates/azure/terraform/sdktypes/sdkobject_to_property.erb', indentation: indentation, - input_statement: input, + input: input, output: output, - api_path: api_path, - sdk_operation: sdk_operation, - resource_name: resource_name, - flatten_queue: flatten_queue, - properties: properties, - object: object + sdk_marshal: sdk_marshal end def build_sdk_func_invocation(sdk_op_def) diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 543f2c05a4ee..e1309f81b956 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -27,26 +27,18 @@ def build_schema_property(property, object, indentation = 0) # Transforms a Cloud API representation of a property into a Terraform # schema representation. - def build_flatten_method(prefix, property, api_path, sdk_type_defs, flatten_queue, object) + def build_flatten_method(property, sdk_marshal) compile_template 'templates/terraform/flatten_property_method.erb', - prefix: prefix, property: property, - sdk_type_defs: sdk_type_defs, - api_path: api_path, - flatten_queue: flatten_queue, - object: object + sdk_marshal: sdk_marshal end # Transforms a Terraform schema representation of a property into a # representation used by the Cloud API. - def build_expand_method(prefix, property, api_path, sdk_type_defs, expand_queue, object) + def build_expand_method(property, sdk_marshal) compile_template 'templates/terraform/expand_property_method.erb', - prefix: prefix, property: property, - sdk_type_defs: sdk_type_defs, - api_path: api_path, - expand_queue: expand_queue, - object: object + sdk_marshal: sdk_marshal end def build_expand_resource_ref(var_name, property) diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb index f35618565fea..5350fce0b7de 100644 --- a/templates/azure/terraform/acctest/parameters_from_schema.erb +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -1,4 +1,4 @@ -<% properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil?}.each do |prop| -%> +<% properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil?}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_op_def.request).go_variable_name -%> <%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/enum_field_assign.erb b/templates/azure/terraform/sdktypes/enum_field_assign.erb index 3c8afe1eab9d..9ac558c971e4 100644 --- a/templates/azure/terraform/sdktypes/enum_field_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_field_assign.erb @@ -1,3 +1 @@ -<% sdk_package = object.azure_sdk_definition.go_client_namespace -%> -<% sdk_type = sdk_type_defs[api_path] -%> -<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= sdk_package -%>.<%= sdk_type.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> \ No newline at end of file +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.type_definition.go_enum_type_name -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/enum_schema_assign.erb b/templates/azure/terraform/sdktypes/enum_schema_assign.erb index 5689f1d284d5..2902193f5ab3 100644 --- a/templates/azure/terraform/sdktypes/enum_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_schema_assign.erb @@ -1,5 +1,4 @@ -<% sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request -%> -<% input_var = "string(" + input_statement + "." + sdk_type_defs[api_path].go_field_name + ")" -%> -<% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> -<%= lines(build_schema_property_set(input_var, 'd', api_path, sdk_type_defs, resource_name, flatten_queue, property)) -%> +<% input_var = "string(" + input + "." + sdk_marshal.sdktype.type_definition.go_field_name + ")" -%> +<% get_properties_matching_sdk_reference(sdk_marshal.properties, sdk_marshal.sdktype.typedef_reference).each do |property| -%> +<%= lines(build_schema_property_set(input_var, 'd', property, sdk_marshal.clone())) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index bc1f2ae3841a..cf74b80fcc3a 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,7 +1,8 @@ -<% sdk_type = sdk_type_defs[api_path] -%> +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> <% if expand_funcs.include?(property.class) -%> -<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> +<%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> <% else -%> -<% expand_or_flatten_enqueue(expand_queue, property, api_path, sdk_type_defs) -%> -<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>expand<%= resource_name -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%>)<%= ',' if in_structure -%> -<% end -%> \ No newline at end of file +<% sdk_marshal.enqueue(property) -%> +expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%> +<% end -%> +)<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb index d0b474c9c4e3..961bbc7d9e18 100644 --- a/templates/azure/terraform/sdktypes/nested_object_field_assign.erb +++ b/templates/azure/terraform/sdktypes/nested_object_field_assign.erb @@ -1,5 +1,3 @@ -<% sdk_package = object.azure_sdk_definition.go_client_namespace -%> -<% sdk_type = sdk_type_defs[api_path] -%> -<%= sdk_type.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>&<%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ -<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, properties, object)) -%> +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>&<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ +<%= lines(build_property_to_sdk_object(sdk_marshal)) -%> }<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb index 8b4eb26d47da..51dfe77aa78d 100644 --- a/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/nested_object_schema_assign.erb @@ -1,8 +1,7 @@ <% - sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request - sdk_type = sdk_type_defs[api_path] - temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) || input_statement + sdk_type = sdk_marshal.sdktype.type_definition + temp_var = sdk_type.go_variable_name || sdk_type.go_field_name.camelcase(:lower) || input -%> -if <%= temp_var -%> := <%= input_statement -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { -<%= lines(build_sdk_object_to_property(temp_var, output, api_path, sdk_operation, resource_name, flatten_queue, properties, object)) -%> +if <%= temp_var -%> := <%= input -%>.<%= sdk_type.go_field_name -%>; <%= temp_var -%> != nil { +<%= lines(build_sdk_object_to_property(temp_var, output, sdk_marshal.clone())) -%> } \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb index eb3cb69e68b7..ef3eebb8cfe5 100644 --- a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb @@ -1,6 +1,4 @@ -<% sdk_type_defs = sdk_operation.response.has_key?(api_path) ? sdk_operation.response : sdk_operation.request -%> -<% sdk_type = sdk_type_defs[api_path] -%> -<% input_var = sdk_type.go_variable_name || input_statement + "." + sdk_type.go_field_name -%> -<% get_properties_matching_sdk_reference(properties, api_path, object).each do |property| -%> -<%= lines(build_schema_property_set(input_var, output, api_path, sdk_type_defs, resource_name, flatten_queue, property)) -%> +<% input_var = sdk_marshal.sdktype.type_definition.go_variable_name || input + "." + sdk_marshal.sdktype.type_definition.go_field_name -%> +<% get_properties_matching_sdk_reference(sdk_marshal.properties, sdk_marshal.sdktype.typedef_reference).each do |property| -%> +<%= lines(build_schema_property_set(input_var, output, property, sdk_marshal.clone())) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 24e84c317e17..39003c0c82d9 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -1,11 +1,9 @@ <% - sdk_package = object.azure_sdk_definition.go_client_namespace - sdk_type = sdk_type_defs[api_path] - direct_children = Set.new - properties.each do |prop| - prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |child_api_path| - child_type_def = sdk_type_defs[child_api_path] + sdk_marshal.properties.sort_by{|p| [p.order, p.name]}.each do |prop| + prop.azure_sdk_references.select{|ref| sdk_marshal.sdktype.type_definitions.has_key?(ref)}.each do |child_api_path| + child_type_def = sdk_marshal.sdktype.type_definitions[child_api_path] + api_path = sdk_marshal.sdktype.typedef_reference if api_path == '/' && child_api_path.start_with?(api_path) sub_paths = child_api_path.split('/') api_path = '' @@ -22,12 +20,10 @@ end direct_children.to_a.sort.each do |child_api_path| - matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) + matched_properties = get_properties_matching_sdk_reference(sdk_marshal.properties, child_api_path) -%> -<%= lines(build_sdk_field_assignment(nil, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) if matched_properties.empty? -%> +<%= lines(build_sdk_field_assignment(nil, sdk_marshal.clone(child_api_path))) if matched_properties.empty? -%> <% matched_properties.each do |property| -%> -<%= lines(build_sdk_field_assignment(property, child_api_path, sdk_type_defs, resource_name, expand_queue, properties, object)) -%> -<% - end - end --%> \ No newline at end of file +<%= lines(build_sdk_field_assignment(property, sdk_marshal.clone(child_api_path))) -%> +<% end -%> +<% end -%> diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb index 940087472eaf..d6a863b62894 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject_empty_sensitive.erb @@ -1,17 +1,16 @@ <% - sdk_package = object.azure_sdk_definition.go_client_namespace - properties.each do |prop| - prop.azure_sdk_references.select{|ref| sdk_type_defs.has_key?(ref)}.each do |sdk_reference| - sdk_type = sdk_type_defs[sdk_reference] + sdk_marshal.properties.sort_by{|p| [p.order, p.name]}.each do |prop| + prop.azure_sdk_references.select{|ref| sdk_marshal.sdktype.type_definitions.has_key?(ref)}.each do |sdk_reference| + sdk_type = sdk_marshal.sdktype.type_definitions[sdk_reference] if sdk_type.empty_value_sensitive # Get the first initialized ancester ancesters = [sdk_reference] begin parent_ref = ancesters[-1].split('/')[0..-2].join('/') - parent_type = sdk_type_defs[parent_ref] - initialized = properties.any? do |p| - p.azure_sdk_references.select{|r| sdk_type_defs.has_key?(r)}.any? do |r| - r.start_with?(parent_ref) && !sdk_type_defs[r].empty_value_sensitive + parent_type = sdk_marshal.sdktype.type_definitions[parent_ref] + initialized = sdk_marshal.properties.any? do |p| + p.azure_sdk_references.select{|r| sdk_marshal.sdktype.type_definitions.has_key?(r)}.any? do |r| + r.start_with?(parent_ref) && !sdk_marshal.sdktype.type_definitions[r].empty_value_sensitive end end ancesters <<= parent_ref @@ -21,11 +20,11 @@ -%> if <%= local_var -%> != <%= go_empty_value(prop) -%> { <% if ancesters.size() == 2 -%> - parameters.<%= ancesters.reverse[0..-2].map{|r| sdk_type_defs[r].go_field_name}.join('.') -%>.<%= lines(build_sdk_field_assignment(prop, sdk_reference, sdk_type_defs, resource_name, expand_queue, [prop], object, false)) -%> + parameters.<%= ancesters.reverse[0..-2].map{|r| sdk_marshal.sdktype.type_definitions[r].go_field_name}.join('.') -%>.<%= lines(build_sdk_field_assignment(prop, sdk_marshal.clone(sdk_reference, [prop]), false)) -%> } <% else -%> - parameters.<%= ancesters.reverse[0..1].map{|r| sdk_type_defs[r].go_field_name}.join('.') -%> = &<%= sdk_package -%>.<%= sdk_type_defs[ancesters[-2]].go_type_name -%>{ -<%= lines(build_property_to_sdk_object(ancesters[-2], resource_name, sdk_type_defs, expand_queue, [prop], object, 8, true)) -%> + parameters.<%= ancesters.reverse[0..1].map{|r| sdk_marshal.sdktype.type_definitions[r].go_field_name}.join('.') -%> = &<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.type_definitions[ancesters[-2]].go_type_name -%>{ +<%= lines(build_property_to_sdk_object(sdk_marshal.clone(ancesters[-2], [prop]), 8, true)) -%> } } diff --git a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb index fc8880388de0..fe5cab5b2d60 100644 --- a/templates/azure/terraform/sdktypes/sdkobject_to_property.erb +++ b/templates/azure/terraform/sdktypes/sdkobject_to_property.erb @@ -1,19 +1,19 @@ <% direct_children = Set.new - properties.sort_by{|p| [p.order, p.name]}.each do |prop| + sdk_marshal.properties.sort_by{|p| [p.order, p.name]}.each do |prop| child_api_path = nil prop.azure_sdk_references.each do |ref| - child_api_path = ref if sdk_operation.response.has_key?(ref) || (sdk_operation.request.has_key?(ref) && child_api_path.nil?) + child_api_path = ref if sdk_marshal.sdktype.operation.response.has_key?(ref) || (sdk_marshal.sdktype.operation.request.has_key?(ref) && child_api_path.nil?) end unless child_api_path.nil? - if api_path == "" - sub_paths = child_api_path.split("/") + if sdk_marshal.sdktype.typedef_reference == '' + sub_paths = child_api_path.split('/') direct_children << child_api_path if sub_paths.length == 1 - elsif child_api_path.start_with?(api_path + "/") - sub_paths = child_api_path[api_path.length..-1].split("/") + elsif child_api_path.start_with?(sdk_marshal.sdktype.typedef_reference + '/') + sub_paths = child_api_path[sdk_marshal.sdktype.typedef_reference.length..-1].split('/') end - if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == "" - sub_api_path = api_path + "/" + sub_paths[1] + if !sub_paths.nil? && sub_paths.length > 1 && sub_paths[0] == '' + sub_api_path = sdk_marshal.sdktype.typedef_reference + '/' + sub_paths[1] direct_children << sub_api_path if sub_paths.length > 2 direct_children << child_api_path if sub_paths.length == 2 end @@ -21,10 +21,10 @@ end direct_children.each do |child_api_path| - matched_properties = get_properties_matching_sdk_reference(properties, child_api_path, object) + matched_properties = get_properties_matching_sdk_reference(sdk_marshal.properties, child_api_path) -%> -<%= lines(build_schema_assignment(input_statement, output, nil, child_api_path, sdk_operation, resource_name, flatten_queue, properties, object)) if matched_properties.empty? -%> +<%= lines(build_schema_assignment(input, output, nil, sdk_marshal.clone(child_api_path))) if matched_properties.empty? -%> <% matched_properties.each do |property| -%> -<%= lines(build_schema_assignment(input_statement, output, property, child_api_path, sdk_operation, resource_name, flatten_queue, properties, object)) -%> +<%= lines(build_schema_assignment(input, output, property, sdk_marshal.clone(child_api_path))) -%> <% end -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/unsupport.erb b/templates/azure/terraform/sdktypes/unsupport.erb index e436f35812e7..80eb41ad8cb5 100644 --- a/templates/azure/terraform/sdktypes/unsupport.erb +++ b/templates/azure/terraform/sdktypes/unsupport.erb @@ -1 +1 @@ -// TODO: SDK Reference <%= api_path -%> is not supported \ No newline at end of file +// TODO: SDK Reference <%= sdk_marshal.sdktype.typedef_reference -%> is not supported \ No newline at end of file diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index b54d94ca1372..1e3151c40ade 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -12,18 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> -<% - resource_name = "Arm" + object.name - sdk_package = object.azure_sdk_definition.go_client_namespace - sdk_type = sdk_type_defs[api_path] --%> <% if property.custom_expand -%> <%= lines(compile_template(property.custom_expand, - prefix: prefix, + prefix: sdk_marshal.resource, property: property)) -%> <% else -%> <% if property.is_a?(Api::Type::Map) -%> -func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { +func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { if v == nil { return map[string]interface{}{}, nil } @@ -34,7 +29,7 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d * <% nested_properties(property.value_type).each do |prop| -%> <% next if prop.name == property.key_name -%> - transformed<%= titlelize_property(prop) -%>, err := expand<%= prefix -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) + transformed<%= titlelize_property(prop) -%>, err := expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) if err != nil { return nil, err } @@ -49,10 +44,10 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d * <% nested_properties(property.value_type).each do |prop| -%> <% next if prop.name == property.key_name -%> -<%# lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> +<%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> -func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { +func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { if v == nil { return map[string]string{}, nil } @@ -63,7 +58,7 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d * return m, nil } <% elsif tf_types.include?(property.class) -%> -func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type(property) -%>) *<%= sdk_package -%>.<%= sdk_type.go_type_name -%> { +func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(input <%= go_type(property) -%>) *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% if !nested_properties(property).empty? nested_properties = nested_properties(property) @@ -77,20 +72,20 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type( v := input[0].(map[string]interface{}) <% nested_properties.each do |prop| -%> -<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_type_defs).go_variable_name -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('v', output_var, prop, object, 4)) -%> +<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) -%> <% end -%> - result := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{ -<%= lines(build_property_to_sdk_object(api_path, resource_name, sdk_type_defs, expand_queue, nested_properties, object, 8)) -%> + result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ +<%= lines(build_property_to_sdk_object(sdk_marshal.clone(nil, nested_properties), 8)) -%> } return &result <% elsif property.is_a?(Api::Type::Array) -%> - results := make([]<%= sdk_package -%>.<%= sdk_type.go_type_name -%>, 0) + results := make([]<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>, 0) for _, v := range input { // TODO: Implement Array Expand - item := <%= sdk_package -%>.<%= sdk_type.go_type_name -%>{} + item := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{} results = append(results, item) } return results @@ -98,7 +93,7 @@ func expand<%= prefix -%><%= titlelize_property(property) -%>(input <%= go_type( } <% nested_properties.each do |prop| -%> -<%# lines(build_expand_method(prefix + titlelize_property(property), prop), 1) -%> +<%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%> l := v.([]interface{}) diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index afd40c498382..83adb9bc5d00 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -12,19 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> -<% - resource_name = "Arm" + object.name - sdk_package = object.azure_sdk_definition.go_client_namespace - sdk_type_defs = sdk_operation.response - sdk_type = sdk_type_defs[api_path] --%> <% if property.custom_flatten -%> <%= lines(compile_template(property.custom_flatten, - prefix: prefix, + prefix: sdk_marshal.resource, property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_package -%>.<%= sdk_type.go_type_name -%>) []interface{} { +func flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(input *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> if input == nil { return make([]interface{}, 0) @@ -32,7 +26,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa result := make(map[string]interface{}) -<%= lines(build_sdk_object_to_property('input', 'result', api_path, sdk_operation, resource_name, flatten_queue, nested_properties(property), object)) -%> +<%= lines(build_sdk_object_to_property('input', 'result', sdk_marshal.clone(nil, nested_properties(property)))) -%> return []interface{}{result} <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) -%> @@ -45,7 +39,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa original := raw.(map[string]interface{}) transformed = append(transformed, map[string]interface{}{ <% property.item_type.properties.reject(&:ignore_read).each do |prop| -%> - "<%= prop.name.underscore -%>": flatten<%= prefix -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), + "<%= prop.name.underscore -%>": flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), <% end -%> }) } @@ -61,7 +55,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa transformed = append(transformed, map[string]interface{}{ "<%= property.key_name -%>": k, <% property.value_type.properties.each do |prop| -%> - "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= prefix -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), + "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), <% end -%> }) } @@ -100,7 +94,7 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(input *<%= sdk_pa } <% if !nested_properties(property).empty? -%> <% nested_properties(property).each do |prop| -%> - <%# lines(build_flatten_method(prefix + titlelize_property(property), prop), 1) -%> + <%# lines(build_flatten_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% end -%> <% else -%> diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index 6cc7cb3e8d18..f1581dd2ab8e 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -101,6 +101,8 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff <% end -%> <% sdk_operation = object.azure_sdk_definition.create -%> +<% sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, true -%> +<% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, expand_queue, sdktype, settable_properties -%> func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext @@ -108,7 +110,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> +<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> if requireResourcesToBeImported { @@ -126,14 +128,14 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% settable_properties.select{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> +<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, settable_properties, object, 8)) -%> +<%= lines(build_property_to_sdk_object(sdk_marshal, 8)) -%> } -<%= lines(build_property_to_sdk_object_empty_sensitive(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> +<%= lines(build_property_to_sdk_object_empty_sensitive(sdk_marshal)) -%> <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") if err != nil { @@ -171,6 +173,9 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res return resource<%= resource_name -%>Read(d, meta) } +<% sdk_operation = object.azure_sdk_definition.read -%> +<% sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, false -%> +<% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, output_properties -%> func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> ctx := meta.(*ArmClient).StopContext @@ -189,7 +194,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> -<%= lines(build_sdk_object_to_property('resp', 'd', '', object.azure_sdk_definition.read, resource_name, flatten_queue, output_properties, object)) -%> +<%= lines(build_sdk_object_to_property('resp', 'd', sdk_marshal)) -%> return nil } @@ -204,15 +209,17 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% if prop.name != "location" -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('d', output_var, prop, object, 4)) -%> +<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> <% end -%> <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ -<%= lines(build_property_to_sdk_object("/", resource_name, sdk_operation.request, expand_queue, updatable_properties, object, 8)) -%> +<% sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, true -%> +<% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, expand_queue, sdktype, updatable_properties -%> +<%= lines(build_property_to_sdk_object(sdk_marshal, 8)) -%> } -<%= lines(build_property_to_sdk_object_empty_sensitive(resource_name, sdk_operation.request, expand_queue, settable_properties, object)) -%> +<%= lines(build_property_to_sdk_object_empty_sensitive(sdk_marshal)) -%> <% unless sdk_operation.async -%> if _, err := <%= build_sdk_func_invocation(sdk_operation) -%>; err != nil { @@ -273,12 +280,12 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% while !expand_queue.empty? -%> <% descriptor = expand_queue.shift -%> -<%= lines(build_expand_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, expand_queue, object)) -%> +<%= lines(build_expand_method(descriptor.property, descriptor.sdkmarshal)) -%> <% end -%> <% while !flatten_queue.empty? -%> <% descriptor = flatten_queue.shift -%> -<%= lines(build_flatten_method(resource_name, descriptor.property, descriptor.api_path, descriptor.sdk_type_defs, flatten_queue, object)) -%> +<%= lines(build_flatten_method(descriptor.property, descriptor.sdkmarshal)) -%> <% end -%> <% if object.custom_code.extra_functions -%> diff --git a/templates/terraform/schemas/flatten_set.erb b/templates/terraform/schemas/flatten_set.erb index 17e91757df03..8683e4faee77 100644 --- a/templates/terraform/schemas/flatten_set.erb +++ b/templates/terraform/schemas/flatten_set.erb @@ -1,8 +1,8 @@ -<% expand_or_flatten_enqueue(flatten_queue, property, api_path, sdk_type_defs) -%> +<% sdk_marshal.enqueue(property) -%> <% if output_var == 'd' -%> -if err := d.Set("<%= prop_name -%>", flatten<%= resource_name -%><%= titlelize_property(property) -%>(<%= input_var -%>)); err != nil { +if err := d.Set("<%= prop_name -%>", flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= input_var -%>)); err != nil { return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) } <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = flatten<%= resource_name -%><%= titlelize_property(property) -%>(<%= input_var -%>) +<%= output_var -%>["<%= prop_name -%>"] = flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= input_var -%>) <% end -%> \ No newline at end of file From 37ffba708585d274afa0d0449bac239ca653bf83 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 29 Apr 2019 17:37:04 -0700 Subject: [PATCH 078/175] Supports initial version of Terraform data source. --- .../azurerm/data_source_batch_account.go | 107 ++++++++++++++++++ .../azurerm/data_source_batch_account_test.go | 55 +++++++++ .../resource_arm_batch_account_test.go | 52 +++++++++ .../docs/d/batch_account.html.markdown | 75 ++++++++++++ products/azbatchaccount/terraform.yaml | 15 +++ provider/azure/terraform/example/helpers.rb | 12 +- .../azure/terraform/example/sub_template.rb | 10 +- provider/azure/terraform/resource_override.rb | 13 +++ provider/config.rb | 2 + provider/resource_override.rb | 20 ++++ provider/resource_overrides.rb | 4 + provider/terraform.rb | 28 +++++ provider/terraform/sub_template.rb | 5 +- .../terraform/schemas/datasource_location.erb | 1 + .../datasource_resource_group_name.erb | 1 + .../terraform/schemas/datasource_tags.erb | 1 + templates/terraform/datasource.erb | 58 ++++++++++ .../terraform/datasource.html.markdown.erb | 79 +++++++++++++ .../base_configs/datasource_test.go.erb | 82 ++++++++++++++ .../examples/base_configs/test_file.go.erb | 17 +-- .../terraform/property_documentation.erb | 4 +- .../terraform/resource.html.markdown.erb | 2 +- templates/terraform/schemas/primitive.erb | 4 +- 23 files changed, 626 insertions(+), 21 deletions(-) create mode 100644 build/azterraform/azurerm/data_source_batch_account.go create mode 100644 build/azterraform/azurerm/data_source_batch_account_test.go create mode 100644 build/azterraform/azurerm/website/docs/d/batch_account.html.markdown create mode 100644 templates/azure/terraform/schemas/datasource_location.erb create mode 100644 templates/azure/terraform/schemas/datasource_resource_group_name.erb create mode 100644 templates/azure/terraform/schemas/datasource_tags.erb create mode 100644 templates/terraform/datasource.erb create mode 100644 templates/terraform/datasource.html.markdown.erb create mode 100644 templates/terraform/examples/base_configs/datasource_test.go.erb diff --git a/build/azterraform/azurerm/data_source_batch_account.go b/build/azterraform/azurerm/data_source_batch_account.go new file mode 100644 index 000000000000..09b105a3d63e --- /dev/null +++ b/build/azterraform/azurerm/data_source_batch_account.go @@ -0,0 +1,107 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + +func dataSourceArmBatchAccount() *schema.Resource { + return &schema.Resource{ + Read: dataSourceArmBatchAccountRead, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validateAzureRMBatchAccountName, + }, + + "location": locationForDataSourceSchema(), + + "resource_group_name": resourceGroupNameForDataSourceSchema(), + + "account_endpoint": { + Type: schema.TypeString, + Computed: true, + }, + + "key_vault_reference": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Computed: true, + }, + "url": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + + "pool_allocation_mode": { + Type: schema.TypeString, + Computed: true, + }, + + "storage_account_id": { + Type: schema.TypeString, + Computed: true, + }, + + "tags": tagsForDataSourceSchema(), + }, + } +} + +func dataSourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).batchAccountClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error: Batch Account %q (Resource Group %q) was not found", name, resourceGroup) + } + return fmt.Errorf("Error reading Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + d.SetId(*resp.ID) + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) + } + if properties := resp.AccountProperties; properties != nil { + d.Set("account_endpoint", properties.AccountEndpoint) + if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { + return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) + } + d.Set("pool_allocation_mode", string(properties.PoolAllocationMode)) + if autoStorage := properties.AutoStorage; autoStorage != nil { + d.Set("storage_account_id", autoStorage.StorageAccountID) + } + } + flattenAndSetTags(d, resp.Tags) + + return nil +} diff --git a/build/azterraform/azurerm/data_source_batch_account_test.go b/build/azterraform/azurerm/data_source_batch_account_test.go new file mode 100644 index 000000000000..b292f9d0f574 --- /dev/null +++ b/build/azterraform/azurerm/data_source_batch_account_test.go @@ -0,0 +1,55 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" +) + +func TestAccDataSourceAzureRMBatchAccount_basic(t *testing.T) { + dataSourceName := "data.azurerm_batch_account.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceBatchAccount_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(dataSourceName, "poolAllocationMode", "BatchService"), + resource.TestCheckResourceAttrSet(dataSourceName, "storageAccountId"), + ), + }, + }, + }) +} + +func testAccDataSourceBatchAccount_basic(rInt int, location string) string { + config := testAccBatchAccount_basic(rInt, location) + return fmt.Sprintf(` +%s + +data "azurerm_batch_account" "test" { + name = "${azurerm_batch_account.test.name}" + resource_group_name = "${azurerm_batch_account.test.resource_group_name}" +} +`, config) +} diff --git a/build/azterraform/azurerm/resource_arm_batch_account_test.go b/build/azterraform/azurerm/resource_arm_batch_account_test.go index dfd87c31ba1d..2822da44d66b 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account_test.go +++ b/build/azterraform/azurerm/resource_arm_batch_account_test.go @@ -24,6 +24,33 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) +func TestAccAzureRMBatchAccount_basic(t *testing.T) { + resourceName := "azurerm_batch_account.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMBatchAccountDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMBatchAccount_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMBatchAccountExists(resourceName), + resource.TestCheckResourceAttr(dataSourceName, "poolAllocationMode", "BatchService"), + resource.TestCheckResourceAttrSet(dataSourceName, "storageAccountId"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testCheckAzureRMBatchAccountExists(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -72,3 +99,28 @@ func testCheckAzureRMBatchAccountDestroy(s *terraform.State) error { return nil } + +func testAccAzureRMBatchAccount_basic(rInt int, location string) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_storage_account" "test" { + name = "acctestsa-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + location = "${azurerm_resource_group.test.location}" + accountTier = "Standard" + accountReplicationType = "LRS" +} + +resource "azurerm_batch_account" "test" { + name = "acctestbatch-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + location = "${azurerm_resource_group.test.location}" + poolAllocationMode = "BatchService" + storageAccountId = "${azurerm_storage_account.test.id}" +} +`, rInt, location, rInt, rInt) +} diff --git a/build/azterraform/azurerm/website/docs/d/batch_account.html.markdown b/build/azterraform/azurerm/website/docs/d/batch_account.html.markdown new file mode 100644 index 000000000000..49f87ed673af --- /dev/null +++ b/build/azterraform/azurerm/website/docs/d/batch_account.html.markdown @@ -0,0 +1,75 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_batch_account" +sidebar_current: "docs-azurerm-datasource-batch-account" +description: |- + Gets information about an existing Batch Account +--- + +# Data Source: azurerm_batch_account + +Use this data source to access information about an existing Batch Account. + + +## Example Usage + +```hcl +data "azurerm_batch_account" "example" { + name = "example-batch-account" + resource_group_name = "example-rg" +} + +output "batch_id" { + value = "${data.azurerm_batch_account.example.id}" +} +``` + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the Batch Account. + +* `resource_group_name` - (Required) The Name of the Resource Group where the App Service exists. + + +## Attributes Reference + +The following attributes are exported: + +* `id` - The ID of the Batch account. + +* `location` - Specifies the supported Azure location where the resource exists. + +* `account_endpoint` - The account endpoint used to interact with the Batch service. + +* `key_vault_reference` - One `key_vault_reference` block defined below. + +* `pool_allocation_mode` - The pool acclocation mode of the Batch Account. + +* `storage_account_id` - The ID of the Batch Account auto storage account. + +* `tags` - A mapping of tags to assign to the batch account. + + +--- + +The `key_vault_reference` block contains the following: + +* `id` - The resource ID of the Azure key vault associated with the Batch account. + +* `url` - The URL of the Azure key vault associated with the Batch account. diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml index 3c9f4b63313c..60027b905918 100644 --- a/products/azbatchaccount/terraform.yaml +++ b/products/azbatchaccount/terraform.yaml @@ -17,6 +17,10 @@ overrides: !ruby/object:Provider::ResourceOverrides function: azure.ValidateResourceIDOrEmpty custom_code: !ruby/object:Provider::Terraform::CustomCode extra_functions: products/azbatchaccount/terraform_extra_functions.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] document_examples: - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference title: Example Usage @@ -26,3 +30,14 @@ overrides: !ruby/object:Provider::ResourceOverrides storageAccounts: examplesa batchAccounts: example-batch-account location: West US +datasources: !ruby/object:Provider::ResourceOverrides + BatchAccount: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + description: The Name of the Resource Group where the App Service exists. + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + datasource_example_outputs: + batch_id: id \ No newline at end of file diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index e467c284f077..15e4de09a974 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -5,13 +5,19 @@ module Azure module Terraform class Example < Api::Object module Helpers - def get_example_properties_to_check(product_name, example_name, object) + def get_example_properties_to_check(example_name, object) request = object.azure_sdk_definition.read.request param_props = object.all_user_properties.select{|p| p.azure_sdk_references.any?{|ref| request.has_key?(ref)}} params = param_props.map{|p| p.name.underscore}.to_set - example = get_example_by_names(example_name, product_name) - example.properties.reject{|pn, pv| params.include?(pn)} + example = get_example_by_names(example_name) + example.properties + .reject do |pn, pv| + params.include?(pn) || pn == 'location' + end + .transform_values do |v| + v.is_a?(String) && !v.match(/\$\{.+\}/).nil? ? :AttrSet : v + end end end end diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index 9be05031cb45..60ca9058d175 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -5,12 +5,14 @@ module Azure module Terraform class Example < Api::Object module SubTemplate - def build_test_hcl_from_example(product_name, example_name, random_vars, with_dependencies = false) - build_hcl_from_example(product_name, example_name, "test", {}, random_vars, true) + def build_test_hcl_from_example(example_name) + random_vars = Array.new + hcl = build_hcl_from_example(nil, example_name, "test", {}, random_vars, true) + return hcl, random_vars end - def build_documentation_hcl_from_example(product_name, example_name, name_hints, with_dependencies = false) - build_hcl_from_example(product_name, example_name, "example", name_hints, [], true) + def build_documentation_hcl_from_example(example_name, name_hints) + build_hcl_from_example(nil, example_name, "example", name_hints, [], true) end def build_hcl_from_example(product_name, example_name, id_hint, name_hints, random_vars, with_dependencies = false) diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index 099749b6f53d..f3673a2d1ea1 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -9,6 +9,7 @@ module OverrideProperties attr_reader :azure_sdk_definition attr_reader :acctests attr_reader :document_examples + attr_reader :datasource_example_outputs include Provider::Terraform::OverrideProperties end @@ -24,6 +25,7 @@ def validate check_optional_property_list :acctests, AccTestDefinition check_optional_property :document_examples, Array check_optional_property_list :document_examples, DocumentExampleReference + check_optional_property :datasource_example_outputs, Hash end class DocumentExampleReference < Api::Object @@ -40,6 +42,17 @@ def validate end end + class DataSourceExampleReference < Api::Object + attr_reader :title + attr_reader :example_name + + def validate + super + check_property :title, String + check_property :example_name, String + end + end + class AccTestDefinition < Api::Object attr_reader :name attr_reader :steps diff --git a/provider/config.rb b/provider/config.rb index fb82a7f55360..39c0515e4e5d 100644 --- a/provider/config.rb +++ b/provider/config.rb @@ -111,6 +111,8 @@ def validate check_property :overrides, Provider::ResourceOverrides check_property_list :changelog, Provider::Config::Changelog \ unless @changelog.nil? + + @datasources.__is_data_source = true unless @datasources.nil? end # Provides the API object to any type that requires, e.g. for validation diff --git a/provider/resource_override.rb b/provider/resource_override.rb index 82786ac4bc49..14398782c103 100644 --- a/provider/resource_override.rb +++ b/provider/resource_override.rb @@ -26,9 +26,12 @@ class ResourceOverride < Api::Object # - 'foo.bar': Property 'bar' nested under property 'foo' attr_reader :properties + attr_accessor :__is_data_source + # Apply this override to the given instance of Api::Resource def apply(api_resource) ensure_resource_properties + convert_properties_to_datasource(api_resource.all_user_properties, api_resource.azure_sdk_definition) if @__is_data_source update_overriden_properties(api_resource) update_overriden_azure_sdk_definition(api_resource) update_properties_default_sort_order(api_resource) @@ -65,6 +68,23 @@ def ensure_resource_properties our_override_modules.each { |mod| require_module mod } # ... and verify end + def convert_properties_to_datasource(properties, azure_sdk_definition) + properties.each do |p| + if p.is_a? Api::Azure::Type::ResourceGroupName + p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_resource_group_name.erb') + elsif p.is_a? Api::Azure::Type::Location + p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_location.erb') + elsif p.is_a? Api::Azure::Type::Tags + p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_tags.erb') + end + unless p.azure_sdk_references.any?{|r| azure_sdk_definition.read.request.has_key?(r)} + p.instance_variable_set('@required', false) + p.instance_variable_set('@output', true) + convert_properties_to_datasource(p.properties, azure_sdk_definition) if p.respond_to?(:properties) && !p.properties.nil? + end + end + end + # Copies all overridable properties from ResourceOverride into # Api::Resource. def update_overriden_properties(api_resource) diff --git a/provider/resource_overrides.rb b/provider/resource_overrides.rb index edc8fe1f79b3..0823aaa28308 100644 --- a/provider/resource_overrides.rb +++ b/provider/resource_overrides.rb @@ -36,6 +36,8 @@ module Provider # description: 'baz' # ... class ResourceOverrides < Api::Object + attr_accessor :__is_data_source + def consume_config(api, config) @__api = api @__config = config @@ -44,6 +46,7 @@ def consume_config(api, config) def validate return unless @__objects.nil? # allows idempotency of calling validate return if @__api.nil? + @__is_data_source ||= false populate_nonoverridden_objects convert_findings_to_hash override_objects @@ -99,6 +102,7 @@ def override_objects api_object = @__api.objects.find { |o| o.name == name } raise "The resource to override must exist #{name}" if api_object.nil? check_property_value 'overrides', override, Provider::ResourceOverride + override.__is_data_source = @__is_data_source override.apply api_object populate_nonoverridden_properties api_object, override override_properties api_object, override diff --git a/provider/terraform.rb b/provider/terraform.rb index 9d46127f0823..25d75315443d 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -179,5 +179,33 @@ def generate_resource_tests(data) # TODO: error check goimports # %x(goimports -w #{filepath}) end + + def compile_datasource(data) + dir = 'azurerm' + target_folder = File.join(data[:output_folder], dir) + FileUtils.mkpath target_folder + name = data[:object].name.underscore + product_name = data[:product_name].underscore + + filepath = File.join(target_folder, "data_source_#{name}.go") + generate_resource_file data.clone.merge( + default_template: 'templates/terraform/datasource.erb', + out_file: filepath + ) + + filepath = File.join(target_folder, "data_source_#{name}_test.go") + generate_resource_file data.clone.merge( + default_template: 'templates/terraform/examples/base_configs/datasource_test.go.erb', + out_file: filepath + ) + + target_folder = File.join(target_folder, 'website', 'docs', 'd') + FileUtils.mkpath target_folder + filepath = File.join(target_folder, "#{name}.html.markdown") + generate_resource_file data.clone.merge( + default_template: 'templates/terraform/datasource.html.markdown.erb', + out_file: filepath + ) + end end end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index e1309f81b956..452c057e7839 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -47,9 +47,10 @@ def build_expand_resource_ref(var_name, property) property: property end - def build_property_documentation(property) + def build_property_documentation(property, is_data_source = false) compile_template 'templates/terraform/property_documentation.erb', - property: property + property: property, + is_data_source: is_data_source end def build_nested_property_documentation(property) diff --git a/templates/azure/terraform/schemas/datasource_location.erb b/templates/azure/terraform/schemas/datasource_location.erb new file mode 100644 index 000000000000..3770e311be36 --- /dev/null +++ b/templates/azure/terraform/schemas/datasource_location.erb @@ -0,0 +1 @@ +"<%= property.name.underscore -%>": locationForDataSourceSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/datasource_resource_group_name.erb b/templates/azure/terraform/schemas/datasource_resource_group_name.erb new file mode 100644 index 000000000000..3aacd199dc6e --- /dev/null +++ b/templates/azure/terraform/schemas/datasource_resource_group_name.erb @@ -0,0 +1 @@ +"<%= prop_name -%>": resourceGroupNameForDataSourceSchema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/datasource_tags.erb b/templates/azure/terraform/schemas/datasource_tags.erb new file mode 100644 index 000000000000..6b0d8a2e4c16 --- /dev/null +++ b/templates/azure/terraform/schemas/datasource_tags.erb @@ -0,0 +1 @@ +"<%= property.name.underscore -%>": tagsForDataSourceSchema(), \ No newline at end of file diff --git a/templates/terraform/datasource.erb b/templates/terraform/datasource.erb new file mode 100644 index 000000000000..0cb147cb6b6a --- /dev/null +++ b/templates/terraform/datasource.erb @@ -0,0 +1,58 @@ +<%= lines(autogen_notice :go) -%> + +package azurerm + +<% + resource_name = "Arm" + object.name + sdk_package = object.azure_sdk_definition.go_client_namespace + + properties = object.all_user_properties + schema_properties = properties.reject{|p| p.name == 'id' || get_property_value(p, 'hide_from_schema', false)} + input_properties = properties.reject(&:output) + + flatten_queue = Array.new + sdk_operation = object.azure_sdk_definition.read + sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, false + sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, schema_properties +-%> + +func dataSource<%= resource_name -%>() *schema.Resource { + return &schema.Resource{ + Read: dataSource<%= resource_name -%>Read, + + Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> +<% order_azure_properties(schema_properties).each do |prop| -%> +<%= lines_before(build_schema_property(prop, object, 12)) -%> + +<% end -%> +<%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> + }, + } +} + +func dataSource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).<%= lines(object.azure_sdk_definition.go_client) -%> + ctx := meta.(*ArmClient).StopContext + +<% input_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> +<% end -%> + + resp, err := <%= lines(build_sdk_func_invocation(sdk_operation)) -%> + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return <%= lines(build_errorf_with_resource_name("Error: %s was not found", false, sdk_operation, schema_properties, object)) -%> + } + return <%= lines(build_errorf_with_resource_name("Error reading %s", true, sdk_operation, schema_properties, object)) -%> + } + + d.SetId(*resp.ID) + +<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> + +<%= lines(build_sdk_object_to_property('resp', 'd', sdk_marshal)) -%> + + return nil +} \ No newline at end of file diff --git a/templates/terraform/datasource.html.markdown.erb b/templates/terraform/datasource.html.markdown.erb new file mode 100644 index 000000000000..a064c8bbe6fc --- /dev/null +++ b/templates/terraform/datasource.html.markdown.erb @@ -0,0 +1,79 @@ +<% + resource_name = object.name.underscore + terraform_name = "azurerm_" + object.name.underscore + + properties = object.all_user_properties.reject{|p| get_property_value(p, 'hide_from_schema', false)} + input_properties = properties.reject(&:output) + + sdk_operation = object.azure_sdk_definition.read +-%> +--- +<%= lines(autogen_notice :yaml) -%> +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" +sidebar_current: "docs-azurerm-datasource-<%= resource_name.gsub("_", "-") -%>" +description: |- + Gets information about an existing <%= lines(object.name.titlecase) -%> +--- + +# Data Source: azurerm_<%= lines(resource_name) -%> + +Use this data source to access information about an existing <%= object.name.titlecase -%>. + +<%- unless object.docs.warning.nil? -%> +~> **Warning:** <%= lines(object.docs.warning) -%> +<%- end -%> + +<% if object.respond_to?(:document_examples) && !object.document_examples.nil? -%> +<% object.document_examples.each do |example_ref| -%> +<% datasource_props = input_properties.map do |p| -%> +<% sdk_type = get_sdk_typedef_by_references(p.azure_sdk_references, sdk_operation.request) -%> +<% [p.name.underscore, example_ref.resource_name_hints[sdk_type.id_portion]] -%> +<% end.to_h -%> +## <%= lines(example_ref.title) -%> + +```hcl +data "<%= terraform_name -%>" "example" { +<%= lines(build_hcl_properties(datasource_props)) -%> +} +<% object.datasource_example_outputs.each do |outName, output| -%> + +output "<%= outName -%>" { + value = "${data.<%= terraform_name -%>.example.<%= output -%>}" +} +<% end -%> +``` + +<% end -%> +<% end -%> + +## Argument Reference + +The following arguments are supported: +<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_property_documentation(prop, true)) -%> +<% end -%> +<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_nested_property_documentation(prop)) -%> +<% end -%> +<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_property_documentation(prop, true)) -%> +<% end -%> +<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_nested_property_documentation(prop)) -%> +<% end -%> + + +## Attributes Reference + +The following attributes are exported: +<% properties.select(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_property_documentation(prop, true)) -%> +<% end -%> + +<% properties.select(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_nested_property_documentation(prop)) -%> +<% end -%> +<%- unless object.docs.attributes.nil? -%> +<%= "\n" + object.docs.attributes -%> +<% end -%> diff --git a/templates/terraform/examples/base_configs/datasource_test.go.erb b/templates/terraform/examples/base_configs/datasource_test.go.erb new file mode 100644 index 000000000000..4d72a8078655 --- /dev/null +++ b/templates/terraform/examples/base_configs/datasource_test.go.erb @@ -0,0 +1,82 @@ +<%= lines(autogen_notice :go) -%> + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" +) + +<% + resource_name = object.name + terraform_name = "azurerm_" + object.name.underscore + azure_client_name = object.azure_sdk_definition.go_client + + properties = object.all_user_properties + input_properties = properties.reject(&:output) + datasource_props = input_properties.map{|p| [p.name.underscore, "${#{terraform_name}.test.#{p.name.underscore}}"]}.to_h + + test_hcls = Hash.new +-%> +<% + if object.respond_to? :acctests + object.acctests.each do |test| + test.steps.uniq.each do |name| + test_hcl, random_vars = build_test_hcl_from_example(name) + test_hcls[name] = { :hcl => test_hcl, :random_vars => random_vars } + end +-%> +func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing.T) { + dataSourceName := "data.<%= terraform_name -%>.test" +<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).each do |param| -%> + <%= param.variable_name -%> := <%= lines(param.create_expression) -%> +<% end -%> + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ +<% test.steps.each do |step| -%> +<% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> +<% props_to_check = get_example_properties_to_check(step, object) -%> + { + Config: testAccDataSource<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), + Check: resource.ComposeTestCheckFunc( +<% props_to_check.each do |propName, propValue| -%> +<% if propValue == :AttrSet -%> + resource.TestCheckResourceAttrSet(dataSourceName, "<%= propName -%>"), +<% else -%> + resource.TestCheckResourceAttr(dataSourceName, "<%= propName -%>", "<%= propValue -%>"), +<% end -%> +<% end -%> + ), + }, +<% end -%> + }, + }) +} +<% end -%> +<% end -%> + +<% + if object.respond_to? :acctests + test_hcls.each do |name, test_hcl| + uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).map{|p| "#{p.parameter_name} #{p.go_type}"} + hcl_params = test_hcl[:random_vars].map(&:parameter_name).uniq +-%> +func testAccDataSource<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { + config := testAcc<%= resource_name -%>_<%= name -%>(<%= hcl_params.join(", ") -%>) + return fmt.Sprintf(` +%s + +data "<%= terraform_name -%>" "test" { +<%= lines(build_hcl_properties(datasource_props)) -%> +} +`, config) +} + +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index ee6989350088..636191516f00 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -17,22 +17,21 @@ import ( azure_client_name = object.azure_sdk_definition.go_client properties = object.all_user_properties contains_acctests = object.instance_variable_defined?(:@acctests) -%> +-%> + <% test_hcls = Hash.new if contains_acctests object.acctests.each do |test| test.steps.uniq.each do |name| - random_vars = [] - test_hcl = build_test_hcl_from_example(product_ns, name, random_vars, true) + test_hcl, random_vars = build_test_hcl_from_example(name) test_hcls[name] = { :hcl => test_hcl, :random_vars => random_vars } end -%> func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { resourceName := "<%= terraform_name -%>.test" <% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).each do |param| -%> - <%= param.variable_name -%> := <%= param.create_expression -%> - + <%= param.variable_name -%> := <%= lines(param.create_expression) -%> <% end -%> resource.ParallelTest(t, resource.TestCase{ @@ -42,13 +41,17 @@ func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { Steps: []resource.TestStep{ <% test.steps.each do |step| -%> <% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> -<% props_to_check = get_example_properties_to_check(product_ns, step, object) -%> +<% props_to_check = get_example_properties_to_check(step, object) -%> { Config: testAcc<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), Check: resource.ComposeTestCheckFunc( testCheck<%= resource_name -%>Exists(resourceName), <% props_to_check.each do |propName, propValue| -%> - resource.TestCheckResourceAttr(resourceName, "<%= propName -%>", "<%= propValue -%>"), +<% if propValue == :AttrSet -%> + resource.TestCheckResourceAttrSet(dataSourceName, "<%= propName -%>"), +<% else -%> + resource.TestCheckResourceAttr(dataSourceName, "<%= propName -%>", "<%= propValue -%>"), +<% end -%> <% end -%> ), }, diff --git a/templates/terraform/property_documentation.erb b/templates/terraform/property_documentation.erb index d80d1e6ca064..377acb348362 100644 --- a/templates/terraform/property_documentation.erb +++ b/templates/terraform/property_documentation.erb @@ -5,10 +5,10 @@ prefix = "(Optional) " if !property.required && !property.output force_new_postfix = "" - force_new_postfix = " Changing this forces a new resource to be created." if property.input && !property.output + force_new_postfix = " Changing this forces a new resource to be created." if property.input && !property.output && !is_data_source default_value_postfix = "" - default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil + default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil && !property.output -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> * `<%= property.name.underscore -%>` - <%= prefix %>One<%= ' or more' unless property.is_a?(Api::Type::NestedObject) -%> `<%= property.name.underscore -%>` block defined below.<%= force_new_postfix -%> diff --git a/templates/terraform/resource.html.markdown.erb b/templates/terraform/resource.html.markdown.erb index 83745a9b53b2..0eed1f22211e 100644 --- a/templates/terraform/resource.html.markdown.erb +++ b/templates/terraform/resource.html.markdown.erb @@ -90,7 +90,7 @@ To get more information about <%= object.name -%>, see: ```hcl -<%= lines(build_documentation_hcl_from_example(product_ns, example_ref.example_name, example_ref.resource_name_hints, true)) -%> +<%= lines(build_documentation_hcl_from_example(example_ref.example_name, example_ref.resource_name_hints)) -%> ``` <% end -%> diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index af5dd761f1b1..eaf4b97892b3 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -48,7 +48,7 @@ StateFunc: <%= property.state_func %>, <% end -%> <% if property.is_a?(Api::Type::NestedObject) -%> - MaxItems: 1, +<%= lines(' MaxItems: 1,') unless property.output -%> Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ <% order_properties(property.properties).each do |prop| -%> @@ -119,7 +119,7 @@ <% if property.sensitive -%> Sensitive: true, <% end -%> -<% unless property.default_value.nil? -%> +<% if !property.default_value.nil? && !property.output -%> Default: <%= go_literal(property.default_value, sdk_package) -%>, <% end -%> <% unless property.conflicts_with.empty? -%> From 152a82ae892f42cb35a68d58d8ba936c4da9dff2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 29 Apr 2019 19:26:36 -0700 Subject: [PATCH 079/175] Use AzureRMModuleBaseExt in ansible. --- .../modules/cloud/azure/azure_rm_batchaccount.py | 15 ++++++++++----- .../cloud/azure/azure_rm_batchaccount_info.py | 4 +++- products/azbatchaccount/api.yaml | 4 ++-- templates/ansible/resource.erb | 10 +++++++--- .../module/class_instance_variable_init.erb | 5 +++-- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 737fbfcbc667..a184703636b8 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -113,7 +113,8 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase, normalize_location_name +from ansible.module_utils.azure_rm_common import normalize_location_name +from ansible.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt from ansible.module_utils.common.dict_transformations import _snake_to_camel try: @@ -131,7 +132,7 @@ class Actions: NoAction, Create, Update, Delete = range(4) -class AzureRMBatchAccount(AzureRMModuleBase): +class AzureRMBatchAccount(AzureRMModuleBaseExt): """Configuration class for an Azure RM Batch Account resource""" def __init__(self): @@ -178,6 +179,7 @@ def __init__(self): self.resource_group = None self.name = None self.batch_account = dict() + self.tags = None self.results = dict(changed=False) self.mgmt_client = None @@ -203,7 +205,7 @@ def exec_module(self, **kwargs): if self.batch_account.get('auto_storage_account') is not None: self.batch_account['auto_storage_account'] = self.normalize_resource_id( self.batch_account['auto_storage_account'], - '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct') + '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}') self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None @@ -224,7 +226,10 @@ def exec_module(self, **kwargs): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - self.idempotency_check(old_response, self.batch_account) + self.results['old'] = old_response + self.results['new'] = self.batch_account + if not self.idempotency_check(old_response, self.batch_account): + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the Batch Account instance") @@ -273,7 +278,7 @@ def create_update_batchaccount(self): response = self.mgmt_client.batch_account.update(resource_group_name=self.resource_group, account_name=self.name, tags=self.tags, - auto_storage=self.auto_storage) + auto_storage=self.batch_account.get('auto_storage')) if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): response = self.get_poller_result(response) except CloudError as exc: diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py index 70a3fc021b5e..6d40555f7c2b 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -101,7 +101,8 @@ - The ID of the Batch Account auto storage account. returned: always type: str - sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct" + sample: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group + }}/providers/Microsoft.Storage/storageAccounts/{{ name }}" key_vault_reference: description: - A reference to the Azure key vault associated with the Batch account. @@ -164,6 +165,7 @@ def __init__(self): self.resource_group = None self.name = None self.tags = None + self.tags = None super(AzureRMBatchAccountInfo, self).__init__(self.module_arg_spec, supports_tags=False) def exec_module(self, **kwargs): diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index c5618ccd0025..167750d3b2c1 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -162,7 +162,7 @@ objects: 'autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject applicable_to: [python] python_parameter_name: auto_storage - python_variable_name: auto_storage + python_variable_name: batch_account.get('auto_storage') 'autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject applicable_to: [python] '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject @@ -238,7 +238,7 @@ objects: name: autoStorageAccountId description: The ID of the Batch Account auto storage account. azure_sdk_references: ['/autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] - sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/sample-acct' + sample_value: '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}' - !ruby/object:Api::Type::Enum name: poolAllocationMode description: The pool acclocation mode of the Batch Account. diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 02007c9bb4ff..0bf7e6158374 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -79,7 +79,8 @@ RETURN = ''' ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase<%= lines(', normalize_location_name') if is_location_defined?(object) -%> +from ansible.module_utils.azure_rm_common import <%= lines('normalize_location_name') if is_location_defined?(object) -%> +from ansible.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt from ansible.module_utils.common.dict_transformations import _snake_to_camel try: @@ -98,7 +99,7 @@ class Actions: NoAction, Create, Update, Delete = range(4) -class AzureRM<%= object.name -%>(AzureRMModuleBase): +class AzureRM<%= object.name -%>(AzureRMModuleBaseExt): """Configuration class for an Azure RM <%= object.name.titleize -%> resource""" def __init__(self): @@ -168,7 +169,10 @@ class AzureRM<%= object.name -%>(AzureRMModuleBase): if self.state == 'absent': self.to_do = Actions.Delete elif self.state == 'present': - self.idempotency_check(old_response, self.<%= root_object_field -%>) + self.results['old'] = old_response + self.results['new'] = self.<%= lines(root_object_field) -%> + if not self.idempotency_check(old_response, self.<%= root_object_field -%>): + self.to_do = Actions.Update if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): self.log("Need to Create / Update the <%= object.name.titlecase -%> instance") diff --git a/templates/azure/ansible/module/class_instance_variable_init.erb b/templates/azure/ansible/module/class_instance_variable_init.erb index 2115579e558c..e01d88a79490 100644 --- a/templates/azure/ansible/module/class_instance_variable_init.erb +++ b/templates/azure/ansible/module/class_instance_variable_init.erb @@ -1,4 +1,4 @@ -<% params = sdk_operation.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> +<% params = sdk_operation.request.reject{|k, v| k.start_with?("/") && k != "/"} -%> <% params.each do |name, value| -%> <% case value -%> <% when Api::Azure::SDKTypeDefinition::StringObject -%> @@ -8,4 +8,5 @@ self.<%= value.python_variable_name -%> = dict() <% else -%> # TODO: <%= value -%> is not supported for initialization <% end -%> -<% end -%> \ No newline at end of file +<% end -%> +<%= lines('self.tags = None') if is_tags_defined?(object) -%> \ No newline at end of file From cc1c1cd34f77518e99b07d910d2b711c463a16b9 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 1 May 2019 14:21:29 -0700 Subject: [PATCH 080/175] Add SDK Marshalling to Ansible. --- .../cloud/azure/azure_rm_batchaccount.py | 26 ++++++++---- products/azbatchaccount/api.yaml | 26 ++++++++++++ provider/ansible/module.rb | 4 +- provider/azure/ansible.rb | 2 + provider/azure/ansible/helpers.rb | 14 ++++++- .../sdk/property_normalize_descriptor.rb | 34 +++++++++++++++ .../ansible/sdk/sdk_marshal_descriptor.rb | 23 +++++++++++ provider/azure/ansible/sdk/sub_template.rb | 12 +++++- templates/ansible/resource.erb | 18 +------- .../sdktypes/property_normalization.erb | 41 +++++++++++++++++++ .../sdktypes/property_to_sdkobject.erb | 40 ++++++++++++++++++ 11 files changed, 214 insertions(+), 26 deletions(-) create mode 100644 provider/azure/ansible/sdk/property_normalize_descriptor.rb create mode 100644 provider/azure/ansible/sdk/sdk_marshal_descriptor.rb create mode 100644 templates/azure/ansible/sdktypes/property_normalization.erb create mode 100644 templates/azure/ansible/sdktypes/property_to_sdkobject.erb diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index a184703636b8..2b6c4e372d7e 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -146,28 +146,38 @@ def __init__(self): type='str' ), location=dict( - type='str' + type='str', + updatable=False, + disposition='/' ), auto_storage_account=dict( type='raw' ), key_vault_reference=dict( type='dict', + updatable=False, + disposition='/', options=dict( id=dict( required=True, - type='str' + type='str', + updatable=False, + disposition='/' ), url=dict( required=True, - type='str' + type='str', + updatable=False, + disposition='/' ) ) ), pool_allocation_mode=dict( default='batch_service', type='str', - choices=['batch_service', 'user_subscription'] + choices=['batch_service', 'user_subscription'], + updatable=False, + disposition='/' ), state=dict( type='str', @@ -203,9 +213,11 @@ def exec_module(self, **kwargs): if self.batch_account.get('location') is None: self.batch_account['location'] = resource_group.location if self.batch_account.get('auto_storage_account') is not None: - self.batch_account['auto_storage_account'] = self.normalize_resource_id( - self.batch_account['auto_storage_account'], - '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}') + self.batch_account['auto_storage'] = { + 'storage_account_id': self.normalize_resource_id( + self.batch_account.pop('auto_storage_account'), + '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}') + } self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 167750d3b2c1..b75f56ff11a7 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -43,22 +43,48 @@ objects: python_variable_name: batch_account '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject go_field_name: Location + python_field_name: location + '/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [python] + python_field_name: auto_storage + '/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: storage_account_id + '/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [python] + python_field_name: key_vault_reference + '/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: id + '/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: url + '/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [python] + python_field_name: pool_allocation_mode '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: AccountCreateProperties go_type_name: AccountCreateProperties '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: AutoStorage go_type_name: AutoStorageBaseProperties '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: StorageAccountID '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] go_field_name: KeyVaultReference go_type_name: KeyVaultReference '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: ID '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] go_field_name: URL '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] go_field_name: PoolAllocationMode go_enum_type_name: PoolAllocationMode '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index 4157dc12846c..7fc3ad68f304 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -61,7 +61,9 @@ def prop_options(prop, _object, spaces) ("elements=#{quote_string(python_type(prop.item_type))}" \ if prop.is_a? Api::Type::Array), ("aliases=[#{prop.aliases.map { |x| quote_string(x) }.join(', ')}]" \ - if prop.aliases) + if prop.aliases), + ('updatable=False' if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop)), + ("disposition='/'" if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop)) ].compact end diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 00bd424a8783..5fff7b665a01 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -1,5 +1,7 @@ require 'provider/azure/ansible/helpers' require 'provider/azure/ansible/sub_template' +require 'provider/azure/ansible/sdk/sdk_marshal_descriptor' +require 'provider/azure/ansible/sdk/property_normalize_descriptor' require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index e193034f4e25..d5639fe7f841 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -4,6 +4,10 @@ module Provider module Azure module Ansible module Helpers + def is_resource_name?(property) + property.parent.nil? && property.name == 'name' + end + def is_tags?(property) property.is_a? Api::Azure::Type::Tags end @@ -17,12 +21,20 @@ def get_tags_property(object) end def is_location?(property) - property.is_a? Api::Azure::Type::Location + property.parent.nil? && property.is_a?(Api::Azure::Type::Location) end def is_location_defined?(object) object.all_user_properties.any?{|p| is_location?(p)} end + + def is_resource_group?(property) + property.parent.nil? && property.is_a?(Api::Azure::Type::ResourceGroupName) + end + + def always_has_value?(property) + property.required || !property.default_value.nil? + end end end end diff --git a/provider/azure/ansible/sdk/property_normalize_descriptor.rb b/provider/azure/ansible/sdk/property_normalize_descriptor.rb new file mode 100644 index 000000000000..2fbe7296b205 --- /dev/null +++ b/provider/azure/ansible/sdk/property_normalize_descriptor.rb @@ -0,0 +1,34 @@ +module Provider + module Azure + module Ansible + module SDK + class PropertyNormalizeDescriptor + attr_reader :property + attr_reader :input + attr_reader :output + attr_reader :remove_from_input + attr_reader :python_variable + attr_reader :parent_reference + attr_reader :relative_references + attr_reader :sdk_operation + + def initialize(property, input, output, python_var, parent_ref, relative_refs, sdk_op, remove_input = false) + @property = property + @input = input + @output = output + @python_variable = python_var + @parent_reference = parent_ref + @relative_references = relative_refs + @sdk_operation = sdk_op + @remove_from_input = remove_input + end + + def create_child() + PropertyNormalizeDescriptor.new @property, @input, '|', @python_variable, @parent_reference + @relative_references[0] + '/', @relative_references[1..-1], @sdk_operation, true + end + end + end + end + end + end + \ No newline at end of file diff --git a/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb new file mode 100644 index 000000000000..77b4117c9d41 --- /dev/null +++ b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb @@ -0,0 +1,23 @@ +module Provider + module Azure + module Ansible + module SDK + class MarshalDescriptor + attr_reader :properties + attr_reader :operation + attr_reader :parent_reference + attr_reader :input + attr_reader :output + + def initialize(properties, sdk_operation, input, output, parent_sdk_reference = '/') + @properties = properties + @operation = sdk_operation + @input = input + @output = output + @parent_reference = parent_sdk_reference + end + end + end + end + end +end diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index 0880c49a117f..f6cf732d6017 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -7,8 +7,18 @@ def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) result = compile 'templates/azure/ansible/sdk/method_invocation.erb', 1 indent result, indentation end + + def build_property_normalization(norm_desc, in_structure, indentation = 4) + result = compile 'templates/azure/ansible/sdktypes/property_normalization.erb', 1 + indent result, indentation + end + + def build_property_to_sdk_object(sdk_marshal, indentation = 0) + result = compile 'templates/azure/ansible/sdktypes/property_to_sdkobject.erb', 1 + indent result, indentation + end end end end end -end \ No newline at end of file +end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 0bf7e6158374..52afa5b08e47 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -134,22 +134,8 @@ class AzureRM<%= object.name -%>(AzureRMModuleBaseExt): elif kwargs[key] is not None: self.<%= root_object_field -%>[key] = kwargs[key] -<% input_properties.each do |prop| -%> -<% if prop.is_a? Api::Type::Enum -%> - self.<%= root_object_field -%>['<%= python_variable_name(prop, object.azure_sdk_definition.create) -%>'] = _snake_to_camel(self.<%= root_object_field -%>['<%= python_variable_name(prop, object.azure_sdk_definition.create) -%>'], True) -<% elsif is_location? prop -%> - resource_group = self.get_resource_group(self.resource_group) - if self.<%= root_object_field -%>.get('location') is None: - self.<%= root_object_field -%>['location'] = resource_group.location -<% elsif prop.is_a? Api::Azure::Type::ResourceReference -%> -<% prop_field_name = python_variable_name(prop, object.azure_sdk_definition.create) -%> -<% prop_expr = "self.#{root_object_field}['#{prop_field_name}']" -%> - if self.<%= root_object_field -%>.get('<%= prop_field_name -%>') is not None: - <%= prop_expr -%> = self.normalize_resource_id( - <%= prop_expr -%>, - <%= python_literal(prop.sample_value) -%>) -<% end -%> -<% end -%> +<% sdk_marshal = Provider::Azure::Ansible::SDK::MarshalDescriptor.new input_properties.reject{|p| is_tags?(p)}, object.azure_sdk_definition.create, "self.#{root_object_field}", "self.#{root_object_field}" -%> +<%= lines(build_property_to_sdk_object(sdk_marshal, 8)) -%> response = None diff --git a/templates/azure/ansible/sdktypes/property_normalization.erb b/templates/azure/ansible/sdktypes/property_normalization.erb new file mode 100644 index 000000000000..a43bba232fcc --- /dev/null +++ b/templates/azure/ansible/sdktypes/property_normalization.erb @@ -0,0 +1,41 @@ +<% + if is_location? norm_desc.property +-%> +<%= norm_desc.input -%>['<%= norm_desc.python_variable -%>'] = resource_group.location +<% + elsif norm_desc.relative_references.length > 1 +-%> +<% sdk_path = norm_desc.parent_reference + norm_desc.relative_references[0] -%> +<% sdk_type = norm_desc.sdk_operation.request[sdk_path] -%> +<% if in_structure -%> +'<%= sdk_type.python_field_name -%>': { +<%= lines(build_property_normalization(norm_desc.create_child(), true)) -%> +} +<% else -%> +<%= norm_desc.output -%>['<%= sdk_type.python_field_name -%>'] = { +<%= lines(build_property_normalization(norm_desc.create_child(), true)) -%> +} +<% end -%> +<% + elsif norm_desc.relative_references.length == 1 +-%> +<% sdk_path = norm_desc.parent_reference + norm_desc.relative_references[0] -%> +<% sdk_type = norm_desc.sdk_operation.request[sdk_path] -%> +<% if norm_desc.remove_from_input || norm_desc.python_variable != sdk_type.python_field_name -%> +<% actual_input = "#{norm_desc.input}.pop('#{norm_desc.python_variable}')" -%> +<% else -%> +<% actual_input = "#{norm_desc.input}['#{norm_desc.python_variable}']" -%> +<% end -%> +<% if norm_desc.property.is_a? Api::Type::Enum -%> +<% actual_input = "_snake_to_camel(#{actual_input}, True)" -%> +<% elsif norm_desc.property.is_a? Api::Azure::Type::ResourceReference -%> +<% actual_input = "self.normalize_resource_id(\n #{actual_input},\n '#{norm_desc.property.sample_value}')" -%> +<% end -%> +<% if in_structure -%> +'<%= sdk_type.python_field_name -%>': <%= actual_input -%> +<% else -%> +<%= norm_desc.output -%>['<%= sdk_type.python_field_name -%>'] = <%= actual_input -%> +<% end -%> +<% + end +-%> \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb new file mode 100644 index 000000000000..ed476f052114 --- /dev/null +++ b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb @@ -0,0 +1,40 @@ +<% + sdk_marshal.properties.each do |prop| + ref = get_applicable_reference(prop.azure_sdk_references, sdk_marshal.operation.request) + next unless ref.start_with?(sdk_marshal.parent_reference) + relative_refs = ref[sdk_marshal.parent_reference.length..-1].split('/') + next if relative_refs.length == 0 + + var = python_variable_name(prop, sdk_marshal.operation) + sdk_type = sdk_marshal.operation.request[ref] + need_normalize = (relative_refs.length > 1) + if relative_refs.length == 1 + need_normalize = true if sdk_type.python_field_name != var + need_normalize = true if is_location? prop + need_normalize = true if prop.is_a? Api::Type::Enum + end + next unless need_normalize || prop.is_a?(Api::Type::Composite) + + if need_normalize + indent = 4 + norm_desc = Provider::Azure::Ansible::SDK::PropertyNormalizeDescriptor.new prop, sdk_marshal.input, sdk_marshal.output, var, sdk_marshal.parent_reference, relative_refs, sdk_marshal.operation +-%> +<% if is_location? prop -%> +resource_group = self.get_resource_group(self.resource_group) +if <%= sdk_marshal.input -%>.get('<%= var -%>') is None: +<% elsif !always_has_value? prop -%> +if <%= sdk_marshal.input -%>.get('<%= var -%>') is not None: +<% else -%> +<% indent = 0 -%> +<% end -%> +<%= lines(build_property_normalization(norm_desc, false, indent)) -%> +<% + end + + if prop.is_a? Api::Type::NestedObject + child_sdk_path = sdk_marshal.parent_reference + relative_refs.join('/') + '/' + child_sdk_marshal = Provider::Azure::Ansible::SDK::MarshalDescriptor.new prop.properties, sdk_marshal.operation, 'input', '|', child_sdk_path + build_property_to_sdk_object child_sdk_marshal + end + end +-%> \ No newline at end of file From 659ea12cb39a5b92f949e71e86c01bd7fcf6a26b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 2 May 2019 14:51:56 -0700 Subject: [PATCH 081/175] Introduce azure front door resource --- api/azure/sdk_type_definition.rb | 6 + api/product.rb | 7 - .../azurerm/resource_arm_front_door.go | 198 ++++++++++++++++++ .../azurerm/resource_arm_front_door_test.go | 74 +++++++ .../website/docs/r/front_door.html.markdown | 49 +++++ products/azapimngpolicy/api.yaml | 2 - products/azautomationboolvariable/api.yaml | 2 - products/azautomationintvariable/api.yaml | 2 - products/azautomationnullvariable/api.yaml | 2 - products/azautomationstringvariable/api.yaml | 2 - products/azbatchaccount/api.yaml | 8 +- products/azcontainerregistry/api.yaml | 2 - products/azfrontdoor/api.yaml | 195 +++++++++++++++++ products/azfrontdoor/terraform.yaml | 8 + products/azresourcegroup/api.yaml | 2 - products/azservicebusrecovery/api.yaml | 2 - provider/azure/terraform/sdk/helpers.rb | 4 +- templates/terraform/schemas/primitive.erb | 3 +- 18 files changed, 537 insertions(+), 31 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_front_door.go create mode 100644 build/azterraform/azurerm/resource_arm_front_door_test.go create mode 100644 build/azterraform/website/docs/r/front_door.html.markdown create mode 100644 products/azfrontdoor/api.yaml create mode 100644 products/azfrontdoor/terraform.yaml diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index f27a307621a9..afb80a7d12cb 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -47,10 +47,13 @@ class StringObject < SDKTypeDefinition class EnumObject < SDKTypeDefinition attr_reader :go_enum_type_name + attr_reader :go_enum_const_prefix def validate super + @go_enum_const_prefix ||= '' check_optional_property :go_enum_type_name, String + check_optional_property :go_enum_const_prefix, String end end @@ -60,6 +63,9 @@ class ComplexObject < SDKTypeDefinition class ComplexArray < ComplexObject end + class StringMapObject < SDKTypeDefinition + end + end end end diff --git a/api/product.rb b/api/product.rb index e00bd5abefea..baf1ed75587b 100644 --- a/api/product.rb +++ b/api/product.rb @@ -24,10 +24,6 @@ class Product < Api::Object::Named attr_reader :versions attr_reader :base_url - # Azure Specific Properties - attr_reader :azure_namespace - attr_reader :azure_version - include Compile::Core def validate @@ -39,9 +35,6 @@ def validate check_property :scopes, ::Array check_property_list :scopes, String - check_property :azure_namespace, String - check_property :azure_version, String - check_versions end diff --git a/build/azterraform/azurerm/resource_arm_front_door.go b/build/azterraform/azurerm/resource_arm_front_door.go new file mode 100644 index 000000000000..dd7a0cbe4ab0 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door.go @@ -0,0 +1,198 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmFrontDoor() *schema.Resource { + return &schema.Resource{ + Create: resourceArmFrontDoorCreateUpdate, + Read: resourceArmFrontDoorRead, + Update: resourceArmFrontDoorCreateUpdate, + Delete: resourceArmFrontDoorDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "location": locationSchema(), + + "resource_group_name": resourceGroupNameSchema(), + + "enabled_state": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(frontdoor.EnabledStateEnabled), + string(frontdoor.EnabledStateDisabled), + }, false), + Default: string(frontdoor.Enabled), + }, + + "enforce_certificate_name_check": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(frontdoor.EnforceCertificateNameCheckEnabledStateEnabled), + string(frontdoor.EnforceCertificateNameCheckEnabledStateDisabled), + }, false), + }, + + "friendly_name": { + Type: schema.TypeString, + Optional: true, + }, + + "tags": tagsSchema(), + }, + } +} + +func resourceArmFrontDoorCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_front_door", *resp.ID) + } + } + + location := azureRMNormalizeLocation(d.Get("location").(string)) + enabledState := d.Get("enabled_state").(string) + enforceCertificateNameCheck := d.Get("enforce_certificate_name_check").(string) + friendlyName := d.Get("friendly_name").(string) + tags := d.Get("tags").(map[string]interface{}) + + parameters := frontdoor.FrontDoor{ + Location: utils.String(location), + Properties: &frontdoor.Properties{ + BackendPoolsSettings: &frontdoor.BackendPoolsSettings{ + EnforceCertificateNameCheck: frontdoor.EnforceCertificateNameCheckEnabledState(enforceCertificateNameCheck), + }, + EnabledState: frontdoor.EnabledState(enabledState), + FriendlyName: utils.String(friendlyName), + }, + Tags: expandTags(tags), + } + + + future, err := client.CreateOrUpdate(ctx, resourceGroup, name, parameters) + if err != nil { + return fmt.Errorf("Error creating Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + return fmt.Errorf("Error retrieving Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Front Door %q (Resource Group %q) ID", name, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmFrontDoorRead(d, meta) +} + +func resourceArmFrontDoorRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + name := id.Path["frontDoors"] + + resp, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Front Door %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + if location := resp.Location; location != nil { + d.Set("location", azureRMNormalizeLocation(*location)) + } + if properties := resp.Properties; properties != nil { + d.Set("enabled_state", string(properties.EnabledState)) + if backendPoolsSettings := properties.BackendPoolsSettings; backendPoolsSettings != nil { + d.Set("enforce_certificate_name_check", string(backendPoolsSettings.EnforceCertificateNameCheck)) + } + d.Set("friendly_name", properties.FriendlyName) + } + flattenAndSetTags(d, resp.Tags) + + return nil +} + + +func resourceArmFrontDoorDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + name := id.Path["frontDoors"] + + future, err := client.Delete(ctx, resourceGroup, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) + } + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_front_door_test.go b/build/azterraform/azurerm/resource_arm_front_door_test.go new file mode 100644 index 000000000000..186c62e10380 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door_test.go @@ -0,0 +1,74 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMFrontDoorExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Front Door not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + client := testAccProvider.Meta().(*ArmClient).frontdoorClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Front Door %q (Resource Group %q) does not exist", name, resourceGroup) + } + return fmt.Errorf("Bad: Get on frontdoorClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMFrontDoorDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).frontdoorClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_front_door" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + if resp, err := client.Get(ctx, resourceGroup, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on frontdoorClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/front_door.html.markdown b/build/azterraform/website/docs/r/front_door.html.markdown new file mode 100644 index 000000000000..1e2a91bf5dfb --- /dev/null +++ b/build/azterraform/website/docs/r/front_door.html.markdown @@ -0,0 +1,49 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_front_door" +sidebar_current: "docs-azurerm-resource-front-door" +description: |- + Managed a Front Door on Azure. +--- + +# azurerm_front_door + +Managed a Front Door on Azure. + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which to create the Batch Account. Changing this forces a new resource to be created. + +* `location` - (Required) Resource location. Changing this forces a new resource to be created. + +* `enabled_state` - (Optional) Operational status of the Front Door load balancer. Defaults to `Enabled`. + +* `enforce_certificate_name_check` - (Optional) Whether to enforce certificate name check on HTTPS requests to all backend pools. No effect on non-HTTPS requests. + +* `friendly_name` - (Optional) A friendly name for the frontDoor. + +* `tags` - (Optional) Resource tags. + +## Attributes Reference + +The following attributes are exported: + +* `id` - Resource ID. diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml index 9d41b7cde107..db4a777141a9 100644 --- a/products/azapimngpolicy/api.yaml +++ b/products/azapimngpolicy/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'apimanagement' -azure_version: '2018-01-01' objects: - !ruby/object:Api::Resource name: ApiManagementPolicy diff --git a/products/azautomationboolvariable/api.yaml b/products/azautomationboolvariable/api.yaml index 709871e42c58..37282195c02c 100644 --- a/products/azautomationboolvariable/api.yaml +++ b/products/azautomationboolvariable/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' objects: - !ruby/object:Api::Resource name: AutomationVariable diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml index 4d8c0f429695..ad2c6a359ed5 100644 --- a/products/azautomationintvariable/api.yaml +++ b/products/azautomationintvariable/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' objects: - !ruby/object:Api::Resource name: AutomationVariable diff --git a/products/azautomationnullvariable/api.yaml b/products/azautomationnullvariable/api.yaml index 75aed574a957..fd1e4b9ba169 100644 --- a/products/azautomationnullvariable/api.yaml +++ b/products/azautomationnullvariable/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' objects: - !ruby/object:Api::Resource name: AutomationVariable diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 75aed574a957..fd1e4b9ba169 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' objects: - !ruby/object:Api::Resource name: AutomationVariable diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index b75f56ff11a7..6dc7d275d3ad 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: Microsoft.Batch -azure_version: '2018-12-01' objects: - !ruby/object:Api::Resource name: BatchAccount @@ -87,7 +85,7 @@ objects: applicable_to: [go] go_field_name: PoolAllocationMode go_enum_type_name: PoolAllocationMode - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject go_field_name: Tags read: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Get @@ -165,7 +163,7 @@ objects: '/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject applicable_to: [python] python_field_name: pool_allocation_mode - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject go_field_name: Tags update: !ruby/object:Api::Azure::SDKOperationDefinition go_func_name: Update @@ -206,7 +204,7 @@ objects: '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject applicable_to: [go] go_field_name: StorageAccountID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject applicable_to: [go] go_field_name: Tags delete: !ruby/object:Api::Azure::SDKOperationDefinition diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml index af527d3404bd..2189c0de3a5b 100644 --- a/products/azcontainerregistry/api.yaml +++ b/products/azcontainerregistry/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.ContainerRegistry' -azure_version: 'stable/2017-10-01' objects: - !ruby/object:Api::Resource name: ContainerRegistry diff --git a/products/azfrontdoor/api.yaml b/products/azfrontdoor/api.yaml new file mode 100644 index 000000000000..cdb1466227a9 --- /dev/null +++ b/products/azfrontdoor/api.yaml @@ -0,0 +1,195 @@ +--- !ruby/object:Api::Product +name: Azure Front Door +prefix: azfrontdoor +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +objects: + - !ruby/object:Api::Resource + name: FrontDoor + api_name: NotUsedInAzure + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Network + go_client_namespace: frontdoor + go_client: frontdoorClient + python_client_namespace: azure.mgmt.frontdoor + python_client: FrontDoorManagementClient.frontdoors + create: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: name + python_parameter_name: front_door_name + python_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: FrontDoor + python_parameter_name: front_door_parameters + python_variable_name: batch_account + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + python_field_name: location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] + go_field_name: Properties + go_type_name: Properties + '/properties/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] + go_field_name: FriendlyName + '/properties/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] + go_field_name: EnabledState + go_enum_type_name: EnabledState + go_enum_const_prefix: EnabledState + '/properties/backendPoolsSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] + go_field_name: BackendPoolsSettings + go_type_name: BackendPoolsSettings + '/properties/backendPoolsSettings/enforceCertificateNameCheck': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] + go_field_name: EnforceCertificateNameCheck + go_enum_type_name: EnforceCertificateNameCheckEnabledState + go_enum_const_prefix: EnforceCertificateNameCheckEnabledState + '/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: friendly_name + '/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: enabled_state + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject + go_field_name: Tags + python_field_name: tags + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: name + python_parameter_name: front_door_name + python_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: FrontDoor + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + python_field_name: id + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + python_field_name: name + '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Location + python_field_name: location + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] + go_field_name: Properties + go_type_name: Properties + '/properties/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [go] + go_field_name: FriendlyName + '/properties/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] + go_field_name: EnabledState + go_enum_type_name: EnabledState + go_enum_const_prefix: EnabledState + '/properties/backendPoolsSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + applicable_to: [go] + go_field_name: BackendPoolsSettings + go_type_name: BackendPoolsSettings + '/properties/backendPoolsSettings/enforceCertificateNameCheck': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + applicable_to: [go] + go_field_name: EnforceCertificateNameCheck + go_enum_type_name: EnforceCertificateNameCheckEnabledState + go_enum_const_prefix: EnforceCertificateNameCheckEnabledState + '/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: friendly_name + '/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + applicable_to: [python] + python_field_name: enabled_state + '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject + go_field_name: Tags + python_field_name: tags + delete: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: name + python_parameter_name: front_door_name + python_variable_name: name + + description: Managed a Front Door on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: The name of the resource group in which to create the Batch Account. + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + properties: + - !ruby/object:Api::Type::String + name: name + description: Name of the Front Door which is globally unique. + required: true + input: true + azure_sdk_references: ['frontDoorName', '/name'] + - !ruby/object:Api::Azure::Type::Location + name: location + description: Resource location. + required: true + input: true + azure_sdk_references: ['/location'] + - !ruby/object:Api::Azure::Type::Tags + name: tags + description: Resource tags. + azure_sdk_references: ['/tags'] + - !ruby/object:Api::Type::String + name: friendlyName + description: A friendly name for the frontDoor. + azure_sdk_references: ['/friendlyName', '/properties/friendlyName'] + - !ruby/object:Api::Type::Enum + name: enabledState + description: Operational status of the Front Door load balancer. + values: + - :Enabled + - :Disabled + default_value: :Enabled + azure_sdk_references: ['/enabledState', '/properties/enabledState'] + - !ruby/object:Api::Type::Enum + name: enforceCertificateNameCheck + description: Whether to enforce certificate name check on HTTPS requests to all backend pools. No effect on non-HTTPS requests. + values: + - :Enabled + - :Disabled + azure_sdk_references: ['/properties/backendPoolsSettings/enforceCertificateNameCheck'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: Resource ID. + output: true + azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoor/terraform.yaml b/products/azfrontdoor/terraform.yaml new file mode 100644 index 000000000000..97c0de59108d --- /dev/null +++ b/products/azfrontdoor/terraform.yaml @@ -0,0 +1,8 @@ +--- !ruby/object:Provider::Terraform::Config +name: azfrontdoor +overrides: !ruby/object:Provider::ResourceOverrides + FrontDoor: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings \ No newline at end of file diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml index dc47c6b65b3b..407671452e3b 100644 --- a/products/azresourcegroup/api.yaml +++ b/products/azresourcegroup/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Resources' -azure_version: 'stable/2018-05-01' objects: - !ruby/object:Api::Resource name: 'ResourceGroup' diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml index 1d2368489225..3cd7d2437396 100644 --- a/products/azservicebusrecovery/api.yaml +++ b/products/azservicebusrecovery/api.yaml @@ -7,8 +7,6 @@ versions: base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'servicebus' -azure_version: '2017-04-01' objects: - !ruby/object:Api::Resource name: ServiceBusDisasterRecoveryConfig diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 34128529c028..c388e8e183e0 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -26,7 +26,7 @@ def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case sdk_type - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::StringMapObject 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_field_assign.erb' @@ -41,7 +41,7 @@ def property_to_sdk_field_assignment_template(property, sdk_type) def property_to_schema_assignment_template(property, sdk_operation, api_path) sdk_type = sdk_operation.response[api_path] || sdk_operation.request[api_path] case sdk_type - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::StringMapObject 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_schema_assign.erb' diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index eaf4b97892b3..00193e6a0d65 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -32,10 +32,11 @@ <% enum_values = property.values # enum_values.push "" unless property.required + sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) -%> ValidateFunc: validation.StringInSlice([]string{ <% enum_values.each do |val| -%> - <%= go_literal(val, sdk_package) -%>, + <%= go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, <% end -%> }, false), <% end -%> From f9df986851e99056d548462604af5da32e3141bb Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Thu, 2 May 2019 14:53:06 -0700 Subject: [PATCH 082/175] Updates per PR --- .../examples/terraform/basic.yaml | 3 +- products/azautomationboolvariable/api.yaml | 2 +- .../azautomationdatetimevariable/api.yaml | 132 ++++++++++++++++++ .../examples/terraform/basic.yaml | 14 ++ .../examples/terraform/complete.yaml | 15 ++ .../terraform.yaml | 35 +++++ .../terraform_get_value.erb | 5 + .../terraform_sdk_value.erb | 1 + .../terraform_set_value.erb | 7 + products/azautomationintvariable/api.yaml | 2 +- products/azautomationnullvariable/api.yaml | 2 +- products/azautomationstringvariable/api.yaml | 2 +- 12 files changed, 214 insertions(+), 6 deletions(-) create mode 100644 products/azautomationdatetimevariable/api.yaml create mode 100644 products/azautomationdatetimevariable/examples/terraform/basic.yaml create mode 100644 products/azautomationdatetimevariable/examples/terraform/complete.yaml create mode 100644 products/azautomationdatetimevariable/terraform.yaml create mode 100644 products/azautomationdatetimevariable/terraform_get_value.erb create mode 100644 products/azautomationdatetimevariable/terraform_sdk_value.erb create mode 100644 products/azautomationdatetimevariable/terraform_set_value.erb diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml index 5edf3c8d265c..d4aa2939dfd7 100644 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ b/products/azautomationaccount/examples/terraform/basic.yaml @@ -8,5 +8,4 @@ properties: name: "<%= get_resource_name('automationAccounts', 'AutoAcct') -%>" location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - sku: - name: Basic \ No newline at end of file + sku_name: Basic \ No newline at end of file diff --git a/products/azautomationboolvariable/api.yaml b/products/azautomationboolvariable/api.yaml index 709871e42c58..36073b7c5ab0 100644 --- a/products/azautomationboolvariable/api.yaml +++ b/products/azautomationboolvariable/api.yaml @@ -122,7 +122,7 @@ objects: azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' - description: 'The encrypted flag of the Automation Variable.' + description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] - !ruby/object:Api::Azure::Type::ResourceReference diff --git a/products/azautomationdatetimevariable/api.yaml b/products/azautomationdatetimevariable/api.yaml new file mode 100644 index 000000000000..c8146a2b2b39 --- /dev/null +++ b/products/azautomationdatetimevariable/api.yaml @@ -0,0 +1,132 @@ +--- !ruby/object:Api::Product +name: Azure Automation Variable +prefix: azautomationvariable +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +azure_namespace: 'Microsoft.Automation' +azure_version: 'stable/2015-10-31' +objects: + - !ruby/object:Api::Resource + name: AutomationVariable + api_name: AutomationVariable + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Automation + go_client_namespace: automation + go_client: automationVariableClient + python_client_namespace: '?' + python_client: '?' + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: VariableCreateOrUpdateParameters + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableCreateOrUpdateProperties + go_type_name: VariableCreateOrUpdateProperties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: Variable + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: VariableProperties + go_type_name: VariableProperties + go_variable_name: properties + '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Description + '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: IsEncrypted + '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Value + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: automationAccounts + go_variable_name: accountName + 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: variables + go_variable_name: name + + description: | + Manages an automation variable on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: 'resourceGroupName' + description: 'The name of the resource group in which to create the Automation Variable.' + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: 'automationAccountName' + description: 'The name of the automation account in which the Variable is created.' + required: true + input: true + azure_sdk_references: ['automationAccountName'] + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: 'The name of the Automation Variable.' + required: true + input: true + azure_sdk_references: ['variableName', '/name'] + - !ruby/object:Api::Type::String + name: 'description' + description: 'The description of the Automation Variable.' + azure_sdk_references: ['/properties/description'] + - !ruby/object:Api::Type::String + name: 'value' + description: 'The value of the Automation Variable.' + azure_sdk_references: ['/properties/value'] + - !ruby/object:Api::Type::Boolean + name: 'encrypted' + description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' + default_value: false + azure_sdk_references: ['/properties/isEncrypted'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: The ID of the Automation Variable. + output: true + azure_sdk_references: ['/id'] diff --git a/products/azautomationdatetimevariable/examples/terraform/basic.yaml b/products/azautomationdatetimevariable/examples/terraform/basic.yaml new file mode 100644 index 000000000000..fc7cd368b01d --- /dev/null +++ b/products/azautomationdatetimevariable/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_datetime_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + value: "2019-04-24T21:40:54.074Z" \ No newline at end of file diff --git a/products/azautomationdatetimevariable/examples/terraform/complete.yaml b/products/azautomationdatetimevariable/examples/terraform/complete.yaml new file mode 100644 index 000000000000..37ced1312c44 --- /dev/null +++ b/products/azautomationdatetimevariable/examples/terraform/complete.yaml @@ -0,0 +1,15 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_automation_datetime_variable +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azautomationaccount + example: basic +properties: + name: "<%= get_resource_name('variables', 'AutoVar') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} + description: This variable is created by Terraform acceptance test. + value: "2019-04-20T08:40:04.02Z" \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform.yaml b/products/azautomationdatetimevariable/terraform.yaml new file mode 100644 index 000000000000..89a3ffefe4d4 --- /dev/null +++ b/products/azautomationdatetimevariable/terraform.yaml @@ -0,0 +1,35 @@ +--- !ruby/object:Provider::Terraform::Config +name: azautomationdatetimevariable +overrides: !ruby/object:Provider::ResourceOverrides + AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + name: AutomationDatetimeVariable + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings + value: !ruby/object:Provider::Azure::Terraform::PropertyOverride + custom_schema_get: products/azautomationdatetimevariable/terraform_get_value.erb + custom_schema_set: products/azautomationdatetimevariable/terraform_set_value.erb + custom_sdkfield_assign: products/azautomationdatetimevariable/terraform_sdk_value.erb + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: complete + steps: [complete] + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basicCompleteUpdate + steps: [basic, complete, basic] + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: tfex-example-rg + automationAccounts: tfex-example-account + variables: tfex-example-var + location: West US diff --git a/products/azautomationdatetimevariable/terraform_get_value.erb b/products/azautomationdatetimevariable/terraform_get_value.erb new file mode 100644 index 000000000000..aa08a8af6523 --- /dev/null +++ b/products/azautomationdatetimevariable/terraform_get_value.erb @@ -0,0 +1,5 @@ +vTime, parseErr := time.Parse(time.RFC3339, d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) +if parseErr != nil { + return fmt.Errorf("Error invalid time format: %+v", parseErr) +} +<%= output_var -%> := fmt.Sprintf("\"\\/Date(%d)\\/\"", vTime.UnixNano() / 1000000) \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_sdk_value.erb b/products/azautomationdatetimevariable/terraform_sdk_value.erb new file mode 100644 index 000000000000..e9520c1ab0fa --- /dev/null +++ b/products/azautomationdatetimevariable/terraform_sdk_value.erb @@ -0,0 +1 @@ +Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_set_value.erb b/products/azautomationdatetimevariable/terraform_set_value.erb new file mode 100644 index 000000000000..47400c5e4400 --- /dev/null +++ b/products/azautomationdatetimevariable/terraform_set_value.erb @@ -0,0 +1,7 @@ +if !d.Get("encrypted").(bool) { + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_datetime_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value.(time.Time).Format("2006-01-02T15:04:05.999Z")) +} \ No newline at end of file diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml index 4d8c0f429695..98b5381c8e6d 100644 --- a/products/azautomationintvariable/api.yaml +++ b/products/azautomationintvariable/api.yaml @@ -122,7 +122,7 @@ objects: azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' - description: 'The encrypted flag of the Automation Variable.' + description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] - !ruby/object:Api::Azure::Type::ResourceReference diff --git a/products/azautomationnullvariable/api.yaml b/products/azautomationnullvariable/api.yaml index 75aed574a957..c8146a2b2b39 100644 --- a/products/azautomationnullvariable/api.yaml +++ b/products/azautomationnullvariable/api.yaml @@ -122,7 +122,7 @@ objects: azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' - description: 'The encrypted flag of the Automation Variable.' + description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] - !ruby/object:Api::Azure::Type::ResourceReference diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 75aed574a957..c8146a2b2b39 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -122,7 +122,7 @@ objects: azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' - description: 'The encrypted flag of the Automation Variable.' + description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] - !ruby/object:Api::Azure::Type::ResourceReference From e8bb61e42d8f474be61b0fb2628e4cb142c2956d Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 3 May 2019 18:09:00 -0700 Subject: [PATCH 083/175] Implement StringArray and Int32 data types --- api/azure/sdk_type_definition.rb | 17 +- .../resource_arm_api_management_diagnostic.go | 371 ++++++++++++++++++ ...urce_arm_api_management_diagnostic_test.go | 76 ++++ .../r/api_management_diagnostic.html.markdown | 105 +++++ products/azapimngdiagnostic/api.yaml | 349 ++++++++++++++++ products/azapimngdiagnostic/terraform.yaml | 8 + provider/azure/terraform/schema.rb | 16 +- .../sdk/expand_flatten_descriptor.rb | 31 ++ provider/azure/terraform/sdk/helpers.rb | 11 +- .../terraform/sdk/sdk_marshal_descriptor.rb | 6 +- provider/terraform/sub_template.rb | 10 +- .../terraform/schemas/string_array_set.erb | 5 + .../terraform/sdktypes/enum_schema_assign.erb | 2 +- .../sdktypes/expand_func_field_assign.erb | 6 +- .../sdktypes/integer_field_assign.erb | 2 + .../terraform/expand_property_method.erb | 6 +- .../terraform/flatten_property_method.erb | 6 +- templates/terraform/resource.erb | 6 +- templates/terraform/schemas/basic_set.erb | 11 +- templates/terraform/schemas/flatten_set.erb | 6 +- templates/terraform/schemas/primitive.erb | 31 +- 21 files changed, 1036 insertions(+), 45 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_api_management_diagnostic.go create mode 100644 build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go create mode 100644 build/azterraform/website/docs/r/api_management_diagnostic.html.markdown create mode 100644 products/azapimngdiagnostic/api.yaml create mode 100644 products/azapimngdiagnostic/terraform.yaml create mode 100644 templates/azure/terraform/schemas/string_array_set.erb create mode 100644 templates/azure/terraform/sdktypes/integer_field_assign.erb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index afb80a7d12cb..47ec077655ff 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -42,6 +42,18 @@ def merge_overrides!(overrides) class BooleanObject < SDKTypeDefinition end + class IntegerObject < SDKTypeDefinition + end + + class Integer32Object < SDKTypeDefinition + end + + class Integer64Object < SDKTypeDefinition + end + + class FloatObject < SDKTypeDefinition + end + class StringObject < SDKTypeDefinition end @@ -60,7 +72,10 @@ def validate class ComplexObject < SDKTypeDefinition end - class ComplexArray < ComplexObject + class StringArrayObject < SDKTypeDefinition + end + + class ComplexArrayObject < ComplexObject end class StringMapObject < SDKTypeDefinition diff --git a/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go b/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go new file mode 100644 index 000000000000..5ca40aa7dae5 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go @@ -0,0 +1,371 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmApiManagementDiagnostic() *schema.Resource { + return &schema.Resource{ + Create: resourceArmApiManagementDiagnosticCreateUpdate, + Read: resourceArmApiManagementDiagnosticRead, + Update: resourceArmApiManagementDiagnosticCreateUpdate, + Delete: resourceArmApiManagementDiagnosticDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "api_management_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "logger_id": { + Type: schema.TypeString, + Required: true, + }, + + "always_log": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(apimanagement.AllErrors), + }, false), + }, + + "backend": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "request": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "body_bytes": { + Type: schema.TypeInt, + Optional: true, + }, + "headers": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + }, + }, + "response": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "body_bytes": { + Type: schema.TypeInt, + Optional: true, + }, + "headers": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + }, + }, + }, + }, + }, + + "enable_http_correlation_headers": { + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + + "frontend": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "request": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "body_bytes": { + Type: schema.TypeInt, + Optional: true, + }, + "headers": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + }, + }, + "response": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "body_bytes": { + Type: schema.TypeInt, + Optional: true, + }, + "headers": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + }, + }, + }, + }, + }, + + "sampling_percentage": { + Type: schema.TypeFloat, + Optional: true, + }, + + "sampling_type": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(apimanagement.Fixed), + }, false), + }, + }, + } +} + +func resourceArmApiManagementDiagnosticCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).apiManagementDiagnosticClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + serviceName := d.Get("api_management_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_api_management_diagnostic", *resp.ID) + } + } + + alwaysLog := d.Get("always_log").(string) + backend := d.Get("backend").([]interface{}) + enableHttpCorrelationHeaders := d.Get("enable_http_correlation_headers").(bool) + frontend := d.Get("frontend").([]interface{}) + loggerId := d.Get("logger_id").(string) + samplingPercentage := d.Get("sampling_percentage").(float64) + samplingType := d.Get("sampling_type").(string) + + parameters := apimanagement.DiagnosticContract{ + DiagnosticContractProperties: &apimanagement.DiagnosticContractProperties{ + AlwaysLog: apimanagement.AlwaysLog(alwaysLog), + Backend: expandArmApiManagementDiagnosticPipelineDiagnosticSettings(backend), + EnableHTTPCorrelationHeaders: utils.Bool(enableHttpCorrelationHeaders), + Frontend: expandArmApiManagementDiagnosticPipelineDiagnosticSettings(frontend), + LoggerID: utils.String(loggerId), + Sampling: &apimanagement.SamplingSettings{ + Percentage: utils.Float(samplingPercentage), + SamplingType: apimanagement.SamplingType(samplingType), + }, + }, + } + + + if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, parameters, ""); err != nil { + return fmt.Errorf("Error creating Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) + } + + + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + return fmt.Errorf("Error retrieving Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Api Management Diagnostic %q (Resource Group %q / Api Management Name %q) ID", name, resourceGroup, serviceName) + } + d.SetId(*resp.ID) + + return resourceArmApiManagementDiagnosticRead(d, meta) +} + +func resourceArmApiManagementDiagnosticRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).apiManagementDiagnosticClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + serviceName := id.Path["service"] + name := id.Path["diagnostics"] + + resp, err := client.Get(ctx, resourceGroup, serviceName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Api Management Diagnostic %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) + } + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("api_management_name", serviceName) + if properties := resp.DiagnosticContractProperties; properties != nil { + d.Set("always_log", string(properties.AlwaysLog)) + if err := d.Set("backend", flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(properties.Backend)); err != nil { + return fmt.Errorf("Error setting `backend`: %+v", err) + } + d.Set("enable_http_correlation_headers", properties.EnableHTTPCorrelationHeaders) + if err := d.Set("frontend", flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(properties.Frontend)); err != nil { + return fmt.Errorf("Error setting `frontend`: %+v", err) + } + d.Set("logger_id", properties.LoggerID) + if sampling := properties.Sampling; sampling != nil { + d.Set("sampling_percentage", sampling.Percentage) + d.Set("sampling_type", string(sampling.SamplingType)) + } + } + + return nil +} + + +func resourceArmApiManagementDiagnosticDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).apiManagementDiagnosticClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + serviceName := id.Path["service"] + name := id.Path["diagnostics"] + + if _, err := client.Delete(ctx, resourceGroup, serviceName, name, ""); err != nil { + return fmt.Errorf("Error deleting Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) + } + + return nil +} + +func expandArmApiManagementDiagnosticPipelineDiagnosticSettings(input []interface{}) *apimanagement.PipelineDiagnosticSettings { + if len(input) == 0 { + return nil + } + v := input[0].(map[string]interface{}) + + request := v["request"].([]interface{}) + response := v["response"].([]interface{}) + + result := apimanagement.PipelineDiagnosticSettings{ + Request: expandArmApiManagementDiagnosticHTTPMessageDiagnostic(request), + Response: expandArmApiManagementDiagnosticHTTPMessageDiagnostic(response), + } + return &result +} + +func expandArmApiManagementDiagnosticHTTPMessageDiagnostic(input []interface{}) *apimanagement.HTTPMessageDiagnostic { + if len(input) == 0 { + return nil + } + v := input[0].(map[string]interface{}) + + headers := v["headers"].([]interface{}) + bodyBytes := v["body_bytes"].(int) + + result := apimanagement.HTTPMessageDiagnostic{ + Body: &apimanagement.BodyDiagnosticSettings{ + Bytes: utils.Int32(int32(bodyBytes)), + }, + Headers: utils.ExpandStringArray(headers), + } + return &result +} + + +func flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(input *apimanagement.PipelineDiagnosticSettings) []interface{} { + if input == nil { + return make([]interface{}, 0) + } + + result := make(map[string]interface{}) + + result["request"] = flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input.Request) + result["response"] = flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input.Response) + + return []interface{}{result} +} + +func flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input *apimanagement.HTTPMessageDiagnostic) []interface{} { + if input == nil { + return make([]interface{}, 0) + } + + result := make(map[string]interface{}) + + if body := input.Body; body != nil { + if bodyBytes := body.Bytes; bodyBytes != nil { + result["body_bytes"] = int(*bodyBytes) + } + } + result["headers"] = utils.FlattenStringArray(input.Headers) + + return []interface{}{result} +} diff --git a/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go b/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go new file mode 100644 index 000000000000..5748feba2f49 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go @@ -0,0 +1,76 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMApiManagementDiagnosticExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Api Management Diagnostic not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + serviceName := rs.Primary.Attributes["api_management_name"] + + client := testAccProvider.Meta().(*ArmClient).apiManagementDiagnosticClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Api Management Diagnostic %q (Resource Group %q / Api Management Name %q) does not exist", name, resourceGroup, serviceName) + } + return fmt.Errorf("Bad: Get on apiManagementDiagnosticClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMApiManagementDiagnosticDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).apiManagementDiagnosticClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_api_management_diagnostic" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + serviceName := rs.Primary.Attributes["api_management_name"] + + if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on apiManagementDiagnosticClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown b/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown new file mode 100644 index 000000000000..12ae81fbd35f --- /dev/null +++ b/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown @@ -0,0 +1,105 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_api_management_diagnostic" +sidebar_current: "docs-azurerm-resource-api-management-diagnostic" +description: |- + Manages an API Management Diagnostic on Azure. +--- + +# azurerm_api_management_diagnostic + +Manages an API Management Diagnostic on Azure. + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Diagnostic identifier. Must be unique in the current API Management service instance. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group. Changing this forces a new resource to be created. + +* `api_management_name` - (Required) The name of the API Management service. Changing this forces a new resource to be created. + +* `logger_id` - (Required) Resource Id of a target logger. + +* `always_log` - (Optional) Specifies for what type of messages sampling settings should not apply. + +* `backend` - (Optional) One `backend` block defined below. + +* `enable_http_correlation_headers` - (Optional) Whether to process Correlation Headers coming to Api Management Service. Only applicable to Application Insights diagnostics. Defaults to `true`. + +* `frontend` - (Optional) One `frontend` block defined below. + +* `sampling_percentage` - (Optional) Rate of sampling for fixed-rate sampling. + +* `sampling_type` - (Optional) Sampling type. + +--- + +The `backend` block supports the following: + +* `request` - (Optional) One `request` block defined below. + +* `response` - (Optional) One `response` block defined below. + + +--- + +The `request` block supports the following: + +* `headers` - (Optional) Array of HTTP Headers to log. + +* `body_bytes` - (Optional) Number of request body bytes to log. + +--- + +The `response` block supports the following: + +* `headers` - (Optional) Array of HTTP Headers to log. + +* `body_bytes` - (Optional) Number of request body bytes to log. + +--- + +The `frontend` block supports the following: + +* `request` - (Optional) One `request` block defined below. + +* `response` - (Optional) One `response` block defined below. + + +--- + +The `request` block supports the following: + +* `headers` - (Optional) Array of HTTP Headers to log. + +* `body_bytes` - (Optional) Number of request body bytes to log. + +--- + +The `response` block supports the following: + +* `headers` - (Optional) Array of HTTP Headers to log. + +* `body_bytes` - (Optional) Number of request body bytes to log. + +## Attributes Reference + +The following attributes are exported: + +* `id` - Resource ID. diff --git a/products/azapimngdiagnostic/api.yaml b/products/azapimngdiagnostic/api.yaml new file mode 100644 index 000000000000..ea08ac804b03 --- /dev/null +++ b/products/azapimngdiagnostic/api.yaml @@ -0,0 +1,349 @@ +--- !ruby/object:Api::Product +name: Azure API Management Diagnostic +prefix: azapimngdiagnostic +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +objects: + - !ruby/object:Api::Resource + name: ApiManagementDiagnostic + api_name: NotUsedInAzure + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.ApiManagement + go_client_namespace: apimanagement + go_client: apiManagementDiagnosticClient + python_client_namespace: azure.mgmt.apimanagement + python_client: ApiManagementClient.diagnostic + create: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + python_parameter_name: service_name + python_variable_name: api_management_name + 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: diagnostics + go_variable_name: name + python_parameter_name: diagnostic_id + python_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: DiagnosticContract + python_parameter_name: parameters + python_variable_name: diagnostic + 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: '""' + python_parameter_name: if_match + python_variable_name: "''" + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: DiagnosticContractProperties + go_type_name: DiagnosticContractProperties + '/properties/alwaysLog': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: AlwaysLog + go_enum_type_name: AlwaysLog + '/properties/backend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Backend + go_type_name: PipelineDiagnosticSettings + '/properties/backend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Request + go_type_name: HTTPMessageDiagnostic + '/properties/backend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/backend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/backend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/backend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Response + go_type_name: HTTPMessageDiagnostic + '/properties/backend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/backend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/backend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/enableHttpCorrelationHeaders': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: EnableHTTPCorrelationHeaders + '/properties/frontend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Frontend + go_type_name: PipelineDiagnosticSettings + '/properties/frontend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Request + go_type_name: HTTPMessageDiagnostic + '/properties/frontend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/frontend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/frontend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/frontend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Response + go_type_name: HTTPMessageDiagnostic + '/properties/frontend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/frontend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/frontend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/loggerId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoggerID + '/properties/sampling': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sampling + go_type_name: SamplingSettings + '/properties/sampling/percentage': !ruby/object:Api::Azure::SDKTypeDefinition::FloatObject + go_field_name: Percentage + '/properties/sampling/samplingType': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: SamplingType + go_enum_type_name: SamplingType + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + python_parameter_name: service_name + python_variable_name: api_management_name + 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: diagnostics + go_variable_name: name + python_parameter_name: diagnostic_id + python_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: DiagnosticContract + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + python_field_name: id + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + python_field_name: name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: DiagnosticContractProperties + go_type_name: DiagnosticContractProperties + go_variable_name: properties + '/properties/alwaysLog': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: AlwaysLog + go_enum_type_name: AlwaysLog + '/properties/backend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Backend + go_type_name: PipelineDiagnosticSettings + '/properties/backend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Request + go_type_name: HTTPMessageDiagnostic + '/properties/backend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/backend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/backend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/backend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Response + go_type_name: HTTPMessageDiagnostic + '/properties/backend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/backend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/backend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/enableHttpCorrelationHeaders': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject + go_field_name: EnableHTTPCorrelationHeaders + '/properties/frontend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Frontend + go_type_name: PipelineDiagnosticSettings + '/properties/frontend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Request + go_type_name: HTTPMessageDiagnostic + '/properties/frontend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/frontend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/frontend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/frontend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Response + go_type_name: HTTPMessageDiagnostic + '/properties/frontend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject + go_field_name: Headers + '/properties/frontend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Body + go_type_name: BodyDiagnosticSettings + '/properties/frontend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Bytes + '/properties/loggerId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: LoggerID + '/properties/sampling': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: Sampling + go_type_name: SamplingSettings + '/properties/sampling/percentage': !ruby/object:Api::Azure::SDKTypeDefinition::FloatObject + go_field_name: Percentage + '/properties/sampling/samplingType': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: SamplingType + go_enum_type_name: SamplingType + delete: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: service + go_variable_name: serviceName + python_parameter_name: service_name + python_variable_name: api_management_name + 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: diagnostics + go_variable_name: name + python_parameter_name: diagnostic_id + python_variable_name: name + 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_variable_name: '""' + python_parameter_name: if_match + python_variable_name: "''" + + description: Manages an API Management Diagnostic on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: The name of the resource group. + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + properties: + - !ruby/object:Api::Type::String + name: apiManagementName + description: The name of the API Management service. + required: true + input: true + azure_sdk_references: ['serviceName'] + order: 650 + - !ruby/object:Api::Type::String + name: name + description: Diagnostic identifier. Must be unique in the current API Management service instance. + required: true + input: true + azure_sdk_references: ['diagnosticId', '/name'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: loggerId + description: Resource Id of a target logger. + required: true + azure_sdk_references: ['/properties/loggerId'] + - !ruby/object:Api::Type::Enum + name: alwaysLog + description: Specifies for what type of messages sampling settings should not apply. + values: + - :AllErrors + azure_sdk_references: ['/properties/alwaysLog'] + - !ruby/object:Api::Type::Boolean + name: enableHttpCorrelationHeaders + description: Whether to process Correlation Headers coming to Api Management Service. Only applicable to Application Insights diagnostics. + default_value: true + azure_sdk_references: ['/properties/enableHttpCorrelationHeaders'] + - !ruby/object:Api::Type::Enum + name: samplingType + description: Sampling type. + values: + - :Fixed + azure_sdk_references: ['/properties/sampling/samplingType'] + - !ruby/object:Api::Type::Double + name: samplingPercentage + description: Rate of sampling for fixed-rate sampling. + azure_sdk_references: ['/properties/sampling/percentage'] + - !ruby/object:Api::Type::NestedObject + name: backend + description: Diagnostic settings for incoming/outgoing HTTP messages to the Backend. + azure_sdk_references: ['/properties/backend'] + properties: + - !ruby/object:Api::Type::NestedObject + name: request + description: Diagnostic settings for request. + azure_sdk_references: ['/properties/backend/request'] + properties: + - !ruby/object:Api::Type::Array + name: headers + description: Array of HTTP Headers to log. + item_type: Api::Type::String + azure_sdk_references: ['/properties/backend/request/headers'] + - !ruby/object:Api::Type::Integer + name: bodyBytes + description: Number of request body bytes to log. + azure_sdk_references: ['/properties/backend/request/body/bytes'] + - !ruby/object:Api::Type::NestedObject + name: response + description: Diagnostic settings for response. + azure_sdk_references: ['/properties/backend/response'] + properties: + - !ruby/object:Api::Type::Array + name: headers + description: Array of HTTP Headers to log. + item_type: Api::Type::String + azure_sdk_references: ['/properties/backend/response/headers'] + - !ruby/object:Api::Type::Integer + name: bodyBytes + description: Number of request body bytes to log. + azure_sdk_references: ['/properties/backend/response/body/bytes'] + - !ruby/object:Api::Type::NestedObject + name: frontend + description: Diagnostic settings for incoming/outgoing HTTP messages to the Gateway. + azure_sdk_references: ['/properties/frontend'] + properties: + - !ruby/object:Api::Type::NestedObject + name: request + description: Diagnostic settings for request. + azure_sdk_references: ['/properties/frontend/request'] + properties: + - !ruby/object:Api::Type::Array + name: headers + description: Array of HTTP Headers to log. + item_type: Api::Type::String + azure_sdk_references: ['/properties/frontend/request/headers'] + - !ruby/object:Api::Type::Integer + name: bodyBytes + description: Number of request body bytes to log. + azure_sdk_references: ['/properties/frontend/request/body/bytes'] + - !ruby/object:Api::Type::NestedObject + name: response + description: Diagnostic settings for response. + azure_sdk_references: ['/properties/frontend/response'] + properties: + - !ruby/object:Api::Type::Array + name: headers + description: Array of HTTP Headers to log. + item_type: Api::Type::String + azure_sdk_references: ['/properties/frontend/response/headers'] + - !ruby/object:Api::Type::Integer + name: bodyBytes + description: Number of request body bytes to log. + azure_sdk_references: ['/properties/frontend/response/body/bytes'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: Resource ID. + output: true + azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azapimngdiagnostic/terraform.yaml b/products/azapimngdiagnostic/terraform.yaml new file mode 100644 index 000000000000..c84de3bf44ba --- /dev/null +++ b/products/azapimngdiagnostic/terraform.yaml @@ -0,0 +1,8 @@ +--- !ruby/object:Provider::Terraform::Config +name: azapimngdiagnostic +overrides: !ruby/object:Provider::ResourceOverrides + ApiManagementDiagnostic: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings \ No newline at end of file diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index e12e3f01fa3b..e9bce7bc6275 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -11,9 +11,11 @@ def go_type(property) 'string' when Api::Type::Integer 'int' + when Api::Type::Double + 'float64' when Api::Type::KeyValuePairs 'map[string]interface{}' - when Api::Type::NestedObject + when Api::Type::Array, Api::Type::NestedObject '[]interface{}' else 'interface{}' @@ -38,6 +40,7 @@ def expand_funcs Api::Type::Boolean => 'utils.Bool', Api::Type::String => 'utils.String', Api::Type::Integer => 'utils.Int', + Api::Type::Double => 'utils.Float', Api::Azure::Type::Location => "utils.String", Api::Azure::Type::Tags => 'expandTags', Api::Azure::Type::ResourceReference => "utils.String" @@ -53,7 +56,8 @@ def schema_property_template(property) 'templates/azure/terraform/schemas/location.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::KeyValuePairs, Api::Type::NestedObject + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, + Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject 'templates/terraform/schemas/primitive.erb' else 'templates/terraform/schemas/unsupport.erb' @@ -66,7 +70,8 @@ def schema_property_get_template(property) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs, Api::Type::NestedObject + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, + Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject 'templates/terraform/schemas/basic_get.erb' else 'templates/terraform/schemas/unsupport.erb' @@ -81,9 +86,10 @@ def schema_property_set_template(property) 'templates/azure/terraform/schemas/location_set.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags_set.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::KeyValuePairs + when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::KeyValuePairs 'templates/terraform/schemas/basic_set.erb' - when Api::Type::NestedObject + when Api::Type::Array, Api::Type::NestedObject + return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type_class == Api::Type::String 'templates/terraform/schemas/flatten_set.erb' else 'templates/terraform/schemas/unsupport.erb' diff --git a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb index ed13c7f9777f..bb4f1ca30875 100644 --- a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb +++ b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb @@ -5,12 +5,43 @@ module Azure module Terraform module SDK class ExpandFlattenDescriptor + attr_reader :func_name attr_reader :property attr_reader :sdkmarshal def initialize(property, sdkmarshal) @property = property @sdkmarshal = sdkmarshal + @func_name = @sdkmarshal.sdktype.go_type_name + end + + # This function compares the structure (hierarchical structure, declared type and name) of prop1 and prop2. + # The major target is to distinguish whether two complex properties could share the same expand/flatten (ef) function. + def equals?(other) + return false if @sdkmarshal.sdktype.go_type_name != other.sdkmarshal.sdktype.go_type_name + return false unless property_structure_equals? @property, other.property + true + end + + private + + def property_structure_equals?(prop1, prop2, verify_name = false) + return false if verify_name && prop1.name != prop2.name + return false if prop1.class.name != prop2.class.name + subprops1 = sub_properties(prop1).sort_by!(&:name) + subprops2 = sub_properties(prop2).sort_by!(&:name) + return false if subprops1.size != subprops2.size + subprops1.each_index do |i| + return false unless property_structure_equals?(subprops1[i], subprops2[i], true) + end + true + end + + def sub_properties(property) + return property.properties if property.is_a?(Api::Type::NestedObject) + return property.item_type.properties if property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) + return property.value_type.properties if property.is_a?(Api::Type::Map) + [] end end end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index c388e8e183e0..befdb1db98ed 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -26,8 +26,12 @@ def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case sdk_type - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::StringMapObject + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, + Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::FloatObject, + Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' + when Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object + 'templates/azure/terraform/sdktypes/integer_field_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_field_assign.erb' when Api::Azure::SDKTypeDefinition::ComplexObject @@ -41,7 +45,10 @@ def property_to_sdk_field_assignment_template(property, sdk_type) def property_to_schema_assignment_template(property, sdk_operation, api_path) sdk_type = sdk_operation.response[api_path] || sdk_operation.request[api_path] case sdk_type - when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::StringMapObject + when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, + Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::Integer32Object, + Api::Azure::SDKTypeDefinition::Integer64Object, Api::Azure::SDKTypeDefinition::FloatObject, + Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_schema_assign.erb' diff --git a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb index 465a67d9c5f9..feaa9d7a3c07 100644 --- a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb +++ b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb @@ -25,8 +25,10 @@ def clone(typedef_reference = nil, properties = nil) end def enqueue(property) - existed = @queue.any?{|e| e.property == property && e.sdktype.go_type_name == @sdktype.go_type_name} - @queue << ExpandFlattenDescriptor.new(property, self) unless existed + ef_desc = ExpandFlattenDescriptor.new(property, self) + exist = @queue.find{|q| q.equals?(ef_desc)} + @queue << ef_desc if exist.nil? + (exist || ef_desc).func_name end end end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 452c057e7839..2181f407bac3 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -27,18 +27,16 @@ def build_schema_property(property, object, indentation = 0) # Transforms a Cloud API representation of a property into a Terraform # schema representation. - def build_flatten_method(property, sdk_marshal) + def build_flatten_method(ef_desc) compile_template 'templates/terraform/flatten_property_method.erb', - property: property, - sdk_marshal: sdk_marshal + descriptor: ef_desc end # Transforms a Terraform schema representation of a property into a # representation used by the Cloud API. - def build_expand_method(property, sdk_marshal) + def build_expand_method(ef_desc) compile_template 'templates/terraform/expand_property_method.erb', - property: property, - sdk_marshal: sdk_marshal + descriptor: ef_desc end def build_expand_resource_ref(var_name, property) diff --git a/templates/azure/terraform/schemas/string_array_set.erb b/templates/azure/terraform/schemas/string_array_set.erb new file mode 100644 index 000000000000..1c7399dc558a --- /dev/null +++ b/templates/azure/terraform/schemas/string_array_set.erb @@ -0,0 +1,5 @@ +<% if output_var == 'd' -%> +d.Set("<%= prop_name -%>", utils.FlattenStringArray(<%= input_var -%>)) +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenStringArray(<%= input_var -%>) +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/enum_schema_assign.erb b/templates/azure/terraform/sdktypes/enum_schema_assign.erb index 2902193f5ab3..f2cc40a01b47 100644 --- a/templates/azure/terraform/sdktypes/enum_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/enum_schema_assign.erb @@ -1,4 +1,4 @@ <% input_var = "string(" + input + "." + sdk_marshal.sdktype.type_definition.go_field_name + ")" -%> <% get_properties_matching_sdk_reference(sdk_marshal.properties, sdk_marshal.sdktype.typedef_reference).each do |property| -%> -<%= lines(build_schema_property_set(input_var, 'd', property, sdk_marshal.clone())) -%> +<%= lines(build_schema_property_set(input_var, output, property, sdk_marshal.clone())) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index cf74b80fcc3a..f5fbcd786816 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,8 +1,10 @@ <%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> <% if expand_funcs.include?(property.class) -%> <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> +<% elsif property.is_a?(Api::Type::Array) && property.item_type_class == Api::Type::String -%> +utils.ExpandStringArray(<%= property.name.camelcase(:lower) -%> <% else -%> -<% sdk_marshal.enqueue(property) -%> -expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= property.name.camelcase(:lower) -%> +<% expand_func_name = sdk_marshal.enqueue(property) -%> +expand<%= sdk_marshal.resource -%><%= expand_func_name -%>(<%= property.name.camelcase(:lower) -%> <% end -%> )<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/integer_field_assign.erb b/templates/azure/terraform/sdktypes/integer_field_assign.erb new file mode 100644 index 000000000000..793601dc7fdf --- /dev/null +++ b/templates/azure/terraform/sdktypes/integer_field_assign.erb @@ -0,0 +1,2 @@ +<% bit_number = sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer32Object) ? 32 : 64 -%> +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%>utils.Int<%= bit_number -%>(int<%= bit_number -%>(<%= property.name.camelcase(:lower) -%>))<%= ',' if in_structure -%> \ No newline at end of file diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index 88e4a38a969f..b598b5978108 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> +<% + property = descriptor.property + sdk_marshal = descriptor.sdkmarshal +-%> <% if property.custom_expand -%> <%= lines(compile_template(property.custom_expand, prefix: sdk_marshal.resource, @@ -58,7 +62,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in return m, nil } <% elsif tf_types.include?(property.class) -%> -func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(input <%= go_type(property) -%>) *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { +func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go_type(property) -%>) *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% if !nested_properties(property).empty? nested_properties = nested_properties(property) diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index 6c08e92b865a..4d105b3e7a01 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -12,13 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -%> +<% + property = descriptor.property + sdk_marshal = descriptor.sdkmarshal +-%> <% if property.custom_flatten -%> <%= lines(compile_template(property.custom_flatten, prefix: sdk_marshal.resource, property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(input *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { +func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> if input == nil { return make([]interface{}, 0) diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index f1581dd2ab8e..e82c82231513 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -280,12 +280,14 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% while !expand_queue.empty? -%> <% descriptor = expand_queue.shift -%> -<%= lines(build_expand_method(descriptor.property, descriptor.sdkmarshal)) -%> +<%= lines(build_expand_method(descriptor)) -%> + <% end -%> <% while !flatten_queue.empty? -%> <% descriptor = flatten_queue.shift -%> -<%= lines(build_flatten_method(descriptor.property, descriptor.sdkmarshal)) -%> +<%= lines(build_flatten_method(descriptor)) -%> + <% end -%> <% if object.custom_code.extra_functions -%> diff --git a/templates/terraform/schemas/basic_set.erb b/templates/terraform/schemas/basic_set.erb index 3c370120f766..62e443aad55c 100644 --- a/templates/terraform/schemas/basic_set.erb +++ b/templates/terraform/schemas/basic_set.erb @@ -1,8 +1,15 @@ +<% + format_str = '%s' + case sdk_marshal.sdktype.type_definition + when Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object + format_str = 'int(%s)' + end +-%> <% if output_var == 'd' -%> -d.Set("<%= prop_name -%>", <%= input_var -%>) +d.Set("<%= prop_name -%>", <%= format_str % input_var -%>) <% else -%> <% temp_var = prop_name.camelize(:lower) -%> if <%= temp_var -%> := <%= input_var -%>; <%= temp_var -%> != nil { - <%= output_var -%>["<%= prop_name -%>"] = *<%= lines(temp_var) -%> + <%= output_var -%>["<%= prop_name -%>"] = <%= lines(format_str % "*#{temp_var}") -%> } <% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/flatten_set.erb b/templates/terraform/schemas/flatten_set.erb index 8683e4faee77..bf88b1ae62e4 100644 --- a/templates/terraform/schemas/flatten_set.erb +++ b/templates/terraform/schemas/flatten_set.erb @@ -1,8 +1,8 @@ -<% sdk_marshal.enqueue(property) -%> +<% flatten_func_name = sdk_marshal.enqueue(property) -%> <% if output_var == 'd' -%> -if err := d.Set("<%= prop_name -%>", flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= input_var -%>)); err != nil { +if err := d.Set("<%= prop_name -%>", flatten<%= sdk_marshal.resource -%><%= flatten_func_name -%>(<%= input_var -%>)); err != nil { return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) } <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(<%= input_var -%>) +<%= output_var -%>["<%= prop_name -%>"] = flatten<%= sdk_marshal.resource -%><%= flatten_func_name -%>(<%= input_var -%>) <% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index 00193e6a0d65..0b1e296655b8 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -58,13 +58,13 @@ }, }, <% elsif property.is_a?(Api::Type::Array) -%> - <% unless property.min_size.nil? -%> +<% unless property.min_size.nil? -%> MinItems: <%= property.min_size %>, - <% end -%> - <% unless property.max_size.nil? -%> +<% end -%> +<% unless property.max_size.nil? -%> MaxItems: <%= property.max_size %>, - <% end -%> - <% if property.item_type.is_a?(Api::Type::NestedObject) -%> +<% end -%> +<% if property.item_type.is_a?(Api::Type::NestedObject) -%> Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ <% order_properties(property.item_type.properties).each do |prop| -%> @@ -72,30 +72,27 @@ <% end -%> }, }, - <% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> - Elem: &schema.Schema{ - Type: <%= tf_types[property.item_type] -%>, - <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, - <% end -%> - }, - <% else # array of basic types -%> +<% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> + Elem: &schema.Schema{ + Type: <%= tf_types[property.item_type] -%>, + }, +<% else # array of basic types -%> Elem: &schema.Schema{ Type: <%= tf_types[property.item_type.class] -%>, <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> DiffSuppressFunc: compareSelfLinkOrResourceName, <% end -%> }, - <% end -%> - <% if property.is_set -%> +<% end -%> +<% if property.is_set -%> <% if !property.set_hash_func.nil? -%> Set: <%= property.set_hash_func -%>, <% elsif property.item_type.is_a?(String) -%> Set: schema.HashString, <% else -%> // Default schema.HashSchema is used. - <% end -%> - <% end -%> +<% end -%> +<% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> Elem: &schema.Schema{Type: schema.TypeString}, <% elsif property.is_a?(Api::Type::Map) -%> From cade4eced30297dc382e60dac6df8c3f895e1c5b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 7 May 2019 16:18:09 -0700 Subject: [PATCH 084/175] Introduce Frontdoor Backend Pool resource. --- api/type.rb | 2 +- .../resource_arm_front_door_backend_pool.go | 294 ++++++++++++++++++ ...source_arm_front_door_backend_pool_test.go | 76 +++++ .../r/front_door_backend_pool.html.markdown | 65 ++++ products/azfrontdoorbackendpool/api.yaml | 232 ++++++++++++++ .../azfrontdoorbackendpool/terraform.yaml | 8 + .../terraform/expand_property_method.erb | 68 ++-- .../terraform/flatten_property_method.erb | 36 +-- .../nested_property_documentation.erb | 2 +- .../terraform/property_documentation.erb | 2 +- templates/terraform/schemas/primitive.erb | 20 +- 11 files changed, 744 insertions(+), 61 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_front_door_backend_pool.go create mode 100644 build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go create mode 100644 build/azterraform/website/docs/r/front_door_backend_pool.html.markdown create mode 100644 products/azfrontdoorbackendpool/api.yaml create mode 100644 products/azfrontdoorbackendpool/terraform.yaml diff --git a/api/type.rb b/api/type.rb index 6452997ae50b..e4b033ccbef9 100644 --- a/api/type.rb +++ b/api/type.rb @@ -78,8 +78,8 @@ def validate check_optional_property :sample_value, ::String + @azure_sdk_references ||= [] check_property :azure_sdk_references, ::Array - check_property_non_empty_list :azure_sdk_references, ::String check_default_value_property end diff --git a/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go b/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go new file mode 100644 index 000000000000..2d48bcff8406 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go @@ -0,0 +1,294 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmFrontDoorBackendPool() *schema.Resource { + return &schema.Resource{ + Create: resourceArmFrontDoorBackendPoolCreateUpdate, + Read: resourceArmFrontDoorBackendPoolRead, + Update: resourceArmFrontDoorBackendPoolCreateUpdate, + Delete: resourceArmFrontDoorBackendPoolDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "frontdoor_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "backends": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Optional: true, + }, + "enabled_state": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(frontdoor.Enabled), + string(frontdoor.Disabled), + }, false), + Default: string(frontdoor.Enabled), + }, + "host_header": { + Type: schema.TypeString, + Optional: true, + }, + "http_port": { + Type: schema.TypeInt, + Optional: true, + }, + "https_port": { + Type: schema.TypeInt, + Optional: true, + }, + "priority": { + Type: schema.TypeInt, + Optional: true, + }, + "weight": { + Type: schema.TypeInt, + Optional: true, + }, + }, + }, + }, + + "health_probe_settings_id": { + Type: schema.TypeString, + Optional: true, + }, + + "load_balancing_settings_id": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceArmFrontDoorBackendPoolCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorBackendPoolsClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + frontDoor := d.Get("frontdoor_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_front_door_backend_pool", *resp.ID) + } + } + + backends := d.Get("backends").([]interface{}) + healthProbeSettingsId := d.Get("health_probe_settings_id").(string) + loadBalancingSettingsId := d.Get("load_balancing_settings_id").(string) + + parameters := frontdoor.BackendPool{ + BackendPoolProperties: &frontdoor.BackendPoolProperties{ + Backends: expandArmFrontDoorBackendPoolBackend(backends), + HealthProbeSettings: &frontdoor.SubResource{ + ID: utils.String(healthProbeSettingsId), + }, + LoadBalancingSettings: &frontdoor.SubResource{ + ID: utils.String(loadBalancingSettingsId), + }, + }, + } + + + future, err := client.CreateOrUpdate(ctx, resourceGroup, frontDoor, name, parameters) + if err != nil { + return fmt.Errorf("Error creating Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + return fmt.Errorf("Error retrieving Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q) ID", name, frontDoor, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmFrontDoorBackendPoolRead(d, meta) +} + +func resourceArmFrontDoorBackendPoolRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorBackendPoolsClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + frontDoor := id.Path["frontDoors"] + name := id.Path["backendPools"] + + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Front Door Backend Pool %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("frontdoor_name", frontDoor) + if properties := resp.BackendPoolProperties; properties != nil { + if err := d.Set("backends", flattenArmFrontDoorBackendPoolBackend(properties.Backends)); err != nil { + return fmt.Errorf("Error setting `backends`: %+v", err) + } + if healthProbeSettings := properties.HealthProbeSettings; healthProbeSettings != nil { + d.Set("health_probe_settings_id", healthProbeSettings.ID) + } + if loadBalancingSettings := properties.LoadBalancingSettings; loadBalancingSettings != nil { + d.Set("load_balancing_settings_id", loadBalancingSettings.ID) + } + } + + return nil +} + + +func resourceArmFrontDoorBackendPoolDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorBackendPoolsClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + frontDoor := id.Path["frontDoors"] + name := id.Path["backendPools"] + + future, err := client.Delete(ctx, resourceGroup, frontDoor, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + } + + return nil +} + +func expandArmFrontDoorBackendPoolBackend(input []interface{}) *[]frontdoor.Backend { + results := make([]frontdoor.Backend, 0) + for _, v := range input { + address := v["address"].(string) + httpPort := v["http_port"].(int) + httpsPort := v["https_port"].(int) + hostHeader := v["host_header"].(string) + enabledState := v["enabled_state"].(string) + priority := v["priority"].(int) + weight := v["weight"].(int) + + item := frontdoor.Backend{ + Address: utils.String(address), + BackendHostHeader: utils.String(hostHeader), + EnabledState: frontdoor.BackendEnabledState(enabledState), + HTTPPort: utils.Int32(int32(httpPort)), + HTTPSPort: utils.Int32(int32(httpsPort)), + Priority: utils.Int32(int32(priority)), + Weight: utils.Int32(int32(weight)), + } + + results = append(results, item) + } + return &results +} + + +func flattenArmFrontDoorBackendPoolBackend(input *[]frontdoor.Backend) []interface{} { + results := make([]interface{}, 0) + if input == nil { + return results + } + + for _, item := range input { + v := make(map[string]interface{}) + + if address := item.Address; address != nil { + v["address"] = *address + } + if enabledState := string(item.EnabledState); enabledState != nil { + v["enabled_state"] = *enabledState + } + if hostHeader := item.BackendHostHeader; hostHeader != nil { + v["host_header"] = *hostHeader + } + if httpPort := item.HTTPPort; httpPort != nil { + v["http_port"] = int(*httpPort) + } + if httpsPort := item.HTTPSPort; httpsPort != nil { + v["https_port"] = int(*httpsPort) + } + if priority := item.Priority; priority != nil { + v["priority"] = int(*priority) + } + if weight := item.Weight; weight != nil { + v["weight"] = int(*weight) + } + + results = append(results, v) + } + + return results +} diff --git a/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go b/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go new file mode 100644 index 000000000000..aa5d2a07a32b --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go @@ -0,0 +1,76 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMFrontDoorBackendPoolExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Front Door Backend Pool not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + frontDoor := rs.Primary.Attributes["frontdoor_name"] + + client := testAccProvider.Meta().(*ArmClient).frontdoorBackendPoolsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q) does not exist", name, frontDoor, resourceGroup) + } + return fmt.Errorf("Bad: Get on frontdoorBackendPoolsClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMFrontDoorBackendPoolDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).frontdoorBackendPoolsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_front_door_backend_pool" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + frontDoor := rs.Primary.Attributes["frontdoor_name"] + + if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on frontdoorBackendPoolsClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown new file mode 100644 index 000000000000..cce4f60e234f --- /dev/null +++ b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown @@ -0,0 +1,65 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_front_door_backend_pool" +sidebar_current: "docs-azurerm-resource-front-door-backend-pool" +description: |- + Managed a Front Door on Azure. +--- + +# azurerm_front_door_backend_pool + +Managed a Front Door on Azure. + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Name of the Backend Pool which is unique within the Front Door. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) Name of the Resource group within the Azure subscription. Changing this forces a new resource to be created. + +* `frontdoor_name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. + +* `backends` - (Optional) One or more `backend` block defined below. + +* `health_probe_settings_id` - (Optional) L7 health probe settings for a backend pool. + +* `load_balancing_settings_id` - (Optional) Load balancing settings for a backend pool. + +--- + +The `backend` block supports the following: + +* `address` - (Optional) Location of the backend (IP address or FQDN) + +* `http_port` - (Optional) The HTTP TCP port number. Must be between 1 and 65535. + +* `https_port` - (Optional) The HTTPS TCP port number. Must be between 1 and 65535. + +* `host_header` - (Optional) The value to use as the host header sent to the backend. If blank or unspecified, this defaults to the incoming host. + +* `enabled_state` - (Optional) Whether to enable use of this backend. Permitted values are 'Enabled' or 'Disabled'. Defaults to `Enabled`. + +* `priority` - (Optional) Priority to use for load balancing. Higher priorities will not be used for load balancing if any lower priority backend is healthy. + +* `weight` - (Optional) Weight of this endpoint for load balancing purposes. + +## Attributes Reference + +The following attributes are exported: + +* `id` - Resource ID. diff --git a/products/azfrontdoorbackendpool/api.yaml b/products/azfrontdoorbackendpool/api.yaml new file mode 100644 index 000000000000..859e7d04d0de --- /dev/null +++ b/products/azfrontdoorbackendpool/api.yaml @@ -0,0 +1,232 @@ +--- !ruby/object:Api::Product +name: Azure Front Door Backend Pool +prefix: azfrontdoorbackendpool +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +objects: + - !ruby/object:Api::Resource + name: FrontDoorBackendPool + api_name: NotUsedInAzure + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Network + go_client_namespace: frontdoor + go_client: frontdoorBackendPoolsClient + python_client_namespace: azure.mgmt.frontdoor + python_client: FrontDoorManagementClient.backend_pools + create: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: backendPools + go_variable_name: name + python_parameter_name: backend_pool_name + python_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: BackendPool + python_parameter_name: backend_pool_parameters + python_variable_name: backend_pool + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: BackendPoolProperties + go_type_name: BackendPoolProperties + go_variable_name: properties + '/properties/backends': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArrayObject + go_field_name: Backends + go_type_name: Backend + '/properties/backends/address': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Address + '/properties/backends/backendHostHeader': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: BackendHostHeader + '/properties/backends/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: EnabledState + go_enum_type_name: BackendEnabledState + '/properties/backends/httpPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: HTTPPort + '/properties/backends/httpsPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: HTTPSPort + '/properties/backends/priority': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Priority + '/properties/backends/weight': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Weight + '/properties/healthProbeSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: HealthProbeSettings + go_type_name: SubResource + '/properties/healthProbeSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/properties/loadBalancingSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: LoadBalancingSettings + go_type_name: SubResource + '/properties/loadBalancingSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: backendPools + go_variable_name: name + python_parameter_name: backend_pool_name + python_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: BackendPool + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + python_field_name: id + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + python_field_name: name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: BackendPoolProperties + go_type_name: BackendPoolProperties + go_variable_name: properties + '/properties/backends': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArrayObject + go_field_name: Backends + go_type_name: Backend + '/properties/backends/address': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Address + '/properties/backends/backendHostHeader': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: BackendHostHeader + '/properties/backends/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: EnabledState + go_enum_type_name: BackendEnabledState + '/properties/backends/httpPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: HTTPPort + '/properties/backends/httpsPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: HTTPSPort + '/properties/backends/priority': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Priority + '/properties/backends/weight': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: Weight + '/properties/healthProbeSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: HealthProbeSettings + go_type_name: SubResource + '/properties/healthProbeSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + '/properties/loadBalancingSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: LoadBalancingSettings + go_type_name: SubResource + '/properties/loadBalancingSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + delete: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: backendPools + go_variable_name: name + python_parameter_name: backend_pool_name + python_variable_name: name + + description: Managed a Front Door on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: Name of the Resource group within the Azure subscription. + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: frontdoorName + description: Name of the Front Door which is globally unique. + required: true + input: true + order: 700 + azure_sdk_references: ['frontDoorName'] + properties: + - !ruby/object:Api::Type::String + name: name + description: Name of the Backend Pool which is unique within the Front Door. + required: true + input: true + azure_sdk_references: ['backendPoolName', '/name'] + - !ruby/object:Api::Type::String + name: healthProbeSettingsId + description: L7 health probe settings for a backend pool. + azure_sdk_references: ['/properties/healthProbeSettings/id'] + - !ruby/object:Api::Type::String + name: loadBalancingSettingsId + description: Load balancing settings for a backend pool. + azure_sdk_references: ['/properties/loadBalancingSettings/id'] + - !ruby/object:Api::Type::Array + name: backends + description: The set of backends for this pool. + azure_sdk_references: ['/properties/backends'] + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: address + description: Location of the backend (IP address or FQDN) + azure_sdk_references: ['/properties/backends/address'] + - !ruby/object:Api::Type::Integer + name: httpPort + description: The HTTP TCP port number. Must be between 1 and 65535. + azure_sdk_references: ['/properties/backends/httpPort'] + - !ruby/object:Api::Type::Integer + name: httpsPort + description: The HTTPS TCP port number. Must be between 1 and 65535. + azure_sdk_references: ['/properties/backends/httpsPort'] + - !ruby/object:Api::Type::String + name: hostHeader + description: The value to use as the host header sent to the backend. If blank or unspecified, this defaults to the incoming host. + azure_sdk_references: ['/properties/backends/backendHostHeader'] + - !ruby/object:Api::Type::Enum + name: enabledState + description: Whether to enable use of this backend. Permitted values are 'Enabled' or 'Disabled'. + values: + - :Enabled + - :Disabled + default_value: :Enabled + azure_sdk_references: ['/properties/backends/enabledState'] + - !ruby/object:Api::Type::Integer + name: priority + description: Priority to use for load balancing. Higher priorities will not be used for load balancing if any lower priority backend is healthy. + azure_sdk_references: ['/properties/backends/priority'] + - !ruby/object:Api::Type::Integer + name: weight + description: Weight of this endpoint for load balancing purposes. + azure_sdk_references: ['/properties/backends/weight'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: Resource ID. + output: true + azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/terraform.yaml b/products/azfrontdoorbackendpool/terraform.yaml new file mode 100644 index 000000000000..97072ad88a21 --- /dev/null +++ b/products/azfrontdoorbackendpool/terraform.yaml @@ -0,0 +1,8 @@ +--- !ruby/object:Provider::Terraform::Config +name: azfrontdoorbackendpool +overrides: !ruby/object:Provider::ResourceOverrides + FrontDoorBackendPool: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings \ No newline at end of file diff --git a/templates/terraform/expand_property_method.erb b/templates/terraform/expand_property_method.erb index b598b5978108..8f6e1124f762 100644 --- a/templates/terraform/expand_property_method.erb +++ b/templates/terraform/expand_property_method.erb @@ -16,12 +16,12 @@ property = descriptor.property sdk_marshal = descriptor.sdkmarshal -%> -<% if property.custom_expand -%> +<% if property.custom_expand -%> <%= lines(compile_template(property.custom_expand, prefix: sdk_marshal.resource, property: property)) -%> -<% else -%> -<% if property.is_a?(Api::Type::Map) -%> +<% else -%> +<% if property.is_a?(Api::Type::Map) -%> func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { if v == nil { return map[string]interface{}{}, nil @@ -31,26 +31,26 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in original := raw.(map[string]interface{}) transformed := make(map[string]interface{}) -<% nested_properties(property.value_type).each do |prop| -%> -<% next if prop.name == property.key_name -%> +<% nested_properties(property.value_type).each do |prop| -%> +<% next if prop.name == property.key_name -%> transformed<%= titlelize_property(prop) -%>, err := expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) if err != nil { return nil, err } transformed["<%= prop.api_name -%>"] = transformed<%= titlelize_property(prop) -%> -<% end -%> +<% end -%> m[original["<%= property.key_name -%>"].(string)] = transformed } return m, nil } -<% nested_properties(property.value_type).each do |prop| -%> -<% next if prop.name == property.key_name -%> +<% nested_properties(property.value_type).each do |prop| -%> +<% next if prop.name == property.key_name -%> <%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> -<% end -%> -<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> +<% end -%> +<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { if v == nil { return map[string]string{}, nil @@ -61,45 +61,53 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in } return m, nil } -<% elsif tf_types.include?(property.class) -%> -func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go_type(property) -%>) *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { +<% elsif tf_types.include?(property.class) -%> +func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% - if !nested_properties(property).empty? - nested_properties = nested_properties(property) + if !nested_properties(property).empty? + nested_properties = nested_properties(property) + if property.is_set -%> -<% if property.is_set -%> v := input.(*schema.Set).List() -<% elsif property.is_a?(Api::Type::NestedObject) -%> +<% elsif property.is_a?(Api::Type::NestedObject) -%> if len(input) == 0 { return nil } v := input[0].(map[string]interface{}) -<% nested_properties.each do |prop| -%> -<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) -%> -<% end -%> +<% nested_properties.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) -%> +<% end -%> result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ -<%= lines(build_property_to_sdk_object(sdk_marshal.clone(nil, nested_properties), 8)) -%> +<%= lines(build_property_to_sdk_object(sdk_marshal.clone(nil, nested_properties), 8)) -%> } return &result -<% elsif property.is_a?(Api::Type::Array) -%> +<% elsif property.is_a?(Api::Type::Array) -%> results := make([]<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>, 0) for _, v := range input { - // TODO: Implement Array Expand - item := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{} +<% nested_properties.each do |prop| -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> +<% output_var = var_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 8)) -%> +<% end -%> + + item := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ +<%= lines(build_property_to_sdk_object(sdk_marshal.clone(nil, nested_properties), 12)) -%> + } + results = append(results, item) } - return results -<% end -%> + return &results +<% end -%> } -<% nested_properties.each do |prop| -%> +<% nested_properties.each do |prop| -%> <%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> -<% end -%> -<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%> +<% end -%> +<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%> l := v.([]interface{}) req := make([]interface{}, 0, len(l)) for _, raw := range l { diff --git a/templates/terraform/flatten_property_method.erb b/templates/terraform/flatten_property_method.erb index 4d105b3e7a01..1cbd97127e09 100644 --- a/templates/terraform/flatten_property_method.erb +++ b/templates/terraform/flatten_property_method.erb @@ -22,7 +22,7 @@ property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { +func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> if input == nil { return make([]interface{}, 0) @@ -34,24 +34,24 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= return []interface{}{result} <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) -%> - if v == nil { - return v - } - l := v.([]interface{}) - transformed := make([]interface{}, 0, len(l)) - for _, raw := range l { - original := raw.(map[string]interface{}) - transformed = append(transformed, map[string]interface{}{ - <% property.item_type.properties.reject(&:ignore_read).each do |prop| -%> - "<%= prop.name.underscore -%>": flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), - <% end -%> - }) - } - return transformed + results := make([]interface{}, 0) + if input == nil { + return results + } + + for _, item := range input { + v := make(map[string]interface{}) + +<%= lines(build_sdk_object_to_property('item', 'v', sdk_marshal.clone(nil, nested_properties(property)), 8)) -%> + + results = append(results, v) + } + + return results <% elsif property.is_a?(Api::Type::Map) -%> - if v == nil { - return v - } + if v == nil { + return v + } l := v.(map[string]interface{}) transformed := make([]interface{}, 0, len(l)) for k, raw := range l { diff --git a/templates/terraform/nested_property_documentation.erb b/templates/terraform/nested_property_documentation.erb index 05077e8b282b..598aa28b666b 100644 --- a/templates/terraform/nested_property_documentation.erb +++ b/templates/terraform/nested_property_documentation.erb @@ -5,7 +5,7 @@ -%> --- -The `<%= property.name.underscore -%>` block <%= if property.output then "contains" else "supports" end -%> the following: +The `<%= property.name.underscore.singularize -%>` block <%= if property.output then "contains" else "supports" end -%> the following: <%- if property.is_a?(Api::Type::Map) %> * `<%= property.key_name.underscore -%>` - (Required) The identifier for this object. Format specified above. <% end -%> diff --git a/templates/terraform/property_documentation.erb b/templates/terraform/property_documentation.erb index 377acb348362..d24e45e91ec3 100644 --- a/templates/terraform/property_documentation.erb +++ b/templates/terraform/property_documentation.erb @@ -11,7 +11,7 @@ default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil && !property.output -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> -* `<%= property.name.underscore -%>` - <%= prefix %>One<%= ' or more' unless property.is_a?(Api::Type::NestedObject) -%> `<%= property.name.underscore -%>` block defined below.<%= force_new_postfix -%> +* `<%= property.name.underscore -%>` - <%= prefix %>One<%= ' or more' unless property.is_a?(Api::Type::NestedObject) -%> `<%= property.name.underscore.singularize -%>` block defined below.<%= force_new_postfix -%> <% else -%> * `<%= property.name.underscore -%>` - <%= prefix %><%= property.description.strip.gsub("\n\n", "\n") -%><%= default_value_postfix -%><%= force_new_postfix -%> <% end -%> diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb index 0b1e296655b8..583cdeead33d 100644 --- a/templates/terraform/schemas/primitive.erb +++ b/templates/terraform/schemas/primitive.erb @@ -59,19 +59,19 @@ }, <% elsif property.is_a?(Api::Type::Array) -%> <% unless property.min_size.nil? -%> - MinItems: <%= property.min_size %>, + MinItems: <%= property.min_size %>, <% end -%> <% unless property.max_size.nil? -%> - MaxItems: <%= property.max_size %>, + MaxItems: <%= property.max_size %>, <% end -%> <% if property.item_type.is_a?(Api::Type::NestedObject) -%> - Elem: &schema.Resource{ + Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - <% order_properties(property.item_type.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> +<% order_properties(property.item_type.properties).each do |prop| -%> +<%= lines(build_schema_property(prop, object, 12)) -%> +<% end -%> }, - }, + }, <% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> Elem: &schema.Schema{ Type: <%= tf_types[property.item_type] -%>, @@ -85,11 +85,11 @@ }, <% end -%> <% if property.is_set -%> - <% if !property.set_hash_func.nil? -%> +<% if !property.set_hash_func.nil? -%> Set: <%= property.set_hash_func -%>, - <% elsif property.item_type.is_a?(String) -%> +<% elsif property.item_type.is_a?(String) -%> Set: schema.HashString, - <% else -%> +<% else -%> // Default schema.HashSchema is used. <% end -%> <% end -%> From d375c12025225bd42f8400c704b3a4c7796184d1 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 7 May 2019 17:11:10 -0700 Subject: [PATCH 085/175] Support complex array in HCL. --- .../azurerm/resource_arm_batch_account.go | 2 ++ .../docs/d/batch_account.html.markdown | 0 .../r/front_door_backend_pool.html.markdown | 33 +++++++++++++++++++ .../examples/terraform/basic.yaml | 14 ++++++++ .../azfrontdoorbackendpool/terraform.yaml | 10 +++++- provider/terraform.rb | 2 +- .../terraform/example/hcl_properties.erb | 19 ++++++----- 7 files changed, 70 insertions(+), 10 deletions(-) rename build/azterraform/{azurerm => }/website/docs/d/batch_account.html.markdown (100%) create mode 100644 products/azfrontdoorbackendpool/examples/terraform/basic.yaml diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go index 89ae1b86c369..5c89271672bf 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ b/build/azterraform/azurerm/resource_arm_batch_account.go @@ -262,6 +262,7 @@ func expandArmBatchAccountKeyVaultReference(input []interface{}) *batch.KeyVault return &result } + func flattenArmBatchAccountKeyVaultReference(input *batch.KeyVaultReference) []interface{} { if input == nil { return make([]interface{}, 0) @@ -279,6 +280,7 @@ func flattenArmBatchAccountKeyVaultReference(input *batch.KeyVaultReference) []i return []interface{}{result} } + func validateAzureRMBatchAccountName(v interface{}, k string) (warnings []string, errors []error) { value := v.(string) if !regexp.MustCompile(`^[a-z0-9]+$`).MatchString(value) { diff --git a/build/azterraform/azurerm/website/docs/d/batch_account.html.markdown b/build/azterraform/website/docs/d/batch_account.html.markdown similarity index 100% rename from build/azterraform/azurerm/website/docs/d/batch_account.html.markdown rename to build/azterraform/website/docs/d/batch_account.html.markdown diff --git a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown index cce4f60e234f..ce34716fc439 100644 --- a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown +++ b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown @@ -24,6 +24,30 @@ description: |- Managed a Front Door on Azure. +## Example Usage + +```hcl +resource "azurerm_resource_group" "example" { + name = "example-rg" + location = "West US" +} + +resource "azurerm_frontdoor_backendpool" "example" { + name = "example-backend-pool" + resource_group_name = "${azurerm_resource_group.example.name}" + + backend = { + http_port = 88 + https_port = 44 + } + + backend = { + http_port = 33 + https_port = 22 + } +} +``` + ## Argument Reference The following arguments are supported: @@ -63,3 +87,12 @@ The `backend` block supports the following: The following attributes are exported: * `id` - Resource ID. + + +## Import + +Front Door Backend Pool can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_front_door_backend_pool.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors//backendPools/example-backend-pool +``` diff --git a/products/azfrontdoorbackendpool/examples/terraform/basic.yaml b/products/azfrontdoorbackendpool/examples/terraform/basic.yaml new file mode 100644 index 000000000000..4b631c762756 --- /dev/null +++ b/products/azfrontdoorbackendpool/examples/terraform/basic.yaml @@ -0,0 +1,14 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_frontdoor_backendpool +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic +properties: + name: "<%= get_resource_name('backendPools', 'backendpool') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + backend: + - http_port: 88 + https_port: 44 + - http_port: 33 + https_port: 22 \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/terraform.yaml b/products/azfrontdoorbackendpool/terraform.yaml index 97072ad88a21..ebe2976ecff7 100644 --- a/products/azfrontdoorbackendpool/terraform.yaml +++ b/products/azfrontdoorbackendpool/terraform.yaml @@ -5,4 +5,12 @@ overrides: !ruby/object:Provider::ResourceOverrides properties: name: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings \ No newline at end of file + function: validate.NoEmptyStrings + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: example-rg + backendPools: example-backend-pool + location: West US \ No newline at end of file diff --git a/provider/terraform.rb b/provider/terraform.rb index 25d75315443d..9b653213d343 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -199,7 +199,7 @@ def compile_datasource(data) out_file: filepath ) - target_folder = File.join(target_folder, 'website', 'docs', 'd') + target_folder = File.join(data[:output_folder], 'website', 'docs', 'd') FileUtils.mkpath target_folder filepath = File.join(target_folder, "#{name}.html.markdown") generate_resource_file data.clone.merge( diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb index be26f81059c6..7b53a6085ef0 100644 --- a/templates/azure/terraform/example/hcl_properties.erb +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -2,8 +2,8 @@ # props_left: [[name_1, val_1], [name_2, val_2], ...] props_left = properties.to_a begin - simple_props = props_left.take_while{|p| !p[1].is_a?(Hash)} - props_left = props_left.drop_while{|p| !p[1].is_a?(Hash)} + simple_props = props_left.take_while{|p| !p[1].is_a?(Hash) && !(p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} + props_left = props_left.drop_while{|p| !p[1].is_a?(Hash) && !(p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} prop_alignment = simple_props.map{|p| p[0].length}.max simple_props.each do |prop| @@ -11,21 +11,24 @@ -%> <%= prop[0].ljust(prop_alignment) -%> = "<%= prop[1] -%>" <% elsif prop[1].is_a?(Integer) || prop[1].is_a?(TrueClass) || prop[1].is_a?(FalseClass) -%> -<%= prop[0].ljust(prop_alignment) -%> = <%= prop[1] -%> +<%= prop[0].ljust(prop_alignment) -%> = <%= lines(prop[1].to_s) -%> <% else -%> -// TODO: Unsupported property "<%= prop[0] -%>" value <%= prop[1] -%> +// TODO: Unsupported property "<%= prop[0] -%>" value <%= lines(prop[1]) -%> <% end end - complex_props = props_left.take_while{|p| p[1].is_a?(Hash)} - props_left = props_left.drop_while{|p| p[1].is_a?(Hash)} + complex_props = props_left.take_while{|p| p[1].is_a?(Hash) || (p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} + props_left = props_left.drop_while{|p| p[1].is_a?(Hash) || (p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} complex_props.each do |prop| + blocks = prop[1].is_a?(Array) ? prop[1] : [prop[1]] + blocks.each do |block| -%> -<%= prop[0] -%> = { -<%= lines(build_hcl_properties(prop[1])) -%> +<%= prop[0] -%> = { +<%= lines(build_hcl_properties(block)) -%> } <% + end end end until props_left.empty? -%> \ No newline at end of file From ad81dc17391188815e1d9e5c47a027e1021459cd Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 7 May 2019 17:44:15 -0700 Subject: [PATCH 086/175] Introduce front door frontend endpoint resource. --- ...source_arm_front_door_frontend_endpoint.go | 200 ++++++++++++++++++ ...e_arm_front_door_frontend_endpoint_test.go | 76 +++++++ .../website/docs/r/front_door.html.markdown | 24 +++ .../r/front_door_backend_pool.html.markdown | 9 +- ...front_door_frontend_endpoint.html.markdown | 49 +++++ .../azfrontdoor/examples/terraform/basic.yaml | 10 + products/azfrontdoor/terraform.yaml | 10 +- products/azfrontdoorbackendpool/api.yaml | 2 +- .../examples/terraform/basic.yaml | 4 + .../azfrontdoorbackendpool/terraform.yaml | 1 + products/azfrontdoorfrontendpoint/api.yaml | 174 +++++++++++++++ .../azfrontdoorfrontendpoint/terraform.yaml | 8 + 12 files changed, 564 insertions(+), 3 deletions(-) create mode 100644 build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go create mode 100644 build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go create mode 100644 build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown create mode 100644 products/azfrontdoor/examples/terraform/basic.yaml create mode 100644 products/azfrontdoorfrontendpoint/api.yaml create mode 100644 products/azfrontdoorfrontendpoint/terraform.yaml diff --git a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go new file mode 100644 index 000000000000..a02e9d55923f --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go @@ -0,0 +1,200 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + + +func resourceArmFrontDoorFrontendEndpoint() *schema.Resource { + return &schema.Resource{ + Create: resourceArmFrontDoorFrontendEndpointCreateUpdate, + Read: resourceArmFrontDoorFrontendEndpointRead, + Update: resourceArmFrontDoorFrontendEndpointCreateUpdate, + Delete: resourceArmFrontDoorFrontendEndpointDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "resource_group_name": resourceGroupNameSchema(), + + "frontdoor_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "host_name": { + Type: schema.TypeString, + Optional: true, + }, + + "session_affinity_enabled_state": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + string(frontdoor.SessionAffinityEnabledStateEnabled), + string(frontdoor.SessionAffinityEnabledStateDisabled), + }, false), + Default: string(frontdoor.Enabled), + }, + + "session_affinity_ttl_seconds": { + Type: schema.TypeInt, + Optional: true, + }, + + "web_application_firewall_policy_id": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceArmFrontDoorFrontendEndpointCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorFrontendEndpointsClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + frontDoor := d.Get("frontdoor_name").(string) + + if requireResourcesToBeImported { + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error checking for present of existing Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + } + if !utils.ResponseWasNotFound(resp.Response) { + return tf.ImportAsExistsError("azurerm_front_door_frontend_endpoint", *resp.ID) + } + } + + hostName := d.Get("host_name").(string) + sessionAffinityEnabledState := d.Get("session_affinity_enabled_state").(string) + sessionAffinityTtlSeconds := d.Get("session_affinity_ttl_seconds").(int) + webApplicationFirewallPolicyId := d.Get("web_application_firewall_policy_id").(string) + + parameters := frontdoor.FrontendEndpoint{ + FrontendEndpointProperties: &frontdoor.FrontendEndpointProperties{ + HostName: utils.String(hostName), + SessionAffinityEnabledState: frontdoor.SessionAffinityEnabledState(sessionAffinityEnabledState), + SessionAffinityTTLSeconds: utils.Int32(int32(sessionAffinityTtlSeconds)), + WebApplicationFirewallPolicyLink: &frontdoor.FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink{ + ID: utils.String(webApplicationFirewallPolicyId), + }, + }, + } + + + future, err := client.CreateOrUpdate(ctx, resourceGroup, frontDoor, name, parameters) + if err != nil { + return fmt.Errorf("Error creating Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting for creation of Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + return fmt.Errorf("Error retrieving Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + if resp.ID == nil { + return fmt.Errorf("Cannot read Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q) ID", name, frontDoor, resourceGroup) + } + d.SetId(*resp.ID) + + return resourceArmFrontDoorFrontendEndpointRead(d, meta) +} + +func resourceArmFrontDoorFrontendEndpointRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorFrontendEndpointsClient + ctx := meta.(*ArmClient).StopContext + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + frontDoor := id.Path["frontDoors"] + name := id.Path["frontendEndpoints"] + + resp, err := client.Get(ctx, resourceGroup, frontDoor, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Front Door Frontend Endpoint %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("Error reading Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("frontdoor_name", frontDoor) + if properties := resp.FrontendEndpointProperties; properties != nil { + d.Set("host_name", properties.HostName) + d.Set("session_affinity_enabled_state", string(properties.SessionAffinityEnabledState)) + d.Set("session_affinity_ttl_seconds", int(properties.SessionAffinityTTLSeconds)) + if webApplicationFirewallPolicyLink := properties.WebApplicationFirewallPolicyLink; webApplicationFirewallPolicyLink != nil { + d.Set("web_application_firewall_policy_id", webApplicationFirewallPolicyLink.ID) + } + } + + return nil +} + + +func resourceArmFrontDoorFrontendEndpointDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).frontdoorFrontendEndpointsClient + ctx := meta.(*ArmClient).StopContext + + + id, err := parseAzureResourceID(d.Id()) + if err != nil { + return err + } + resourceGroup := id.ResourceGroup + frontDoor := id.Path["frontDoors"] + name := id.Path["frontendEndpoints"] + + future, err := client.Delete(ctx, resourceGroup, frontDoor, name) + if err != nil { + if response.WasNotFound(future.Response()) { + return nil + } + return fmt.Errorf("Error deleting Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error waiting for deleting Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) + } + } + + return nil +} diff --git a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go new file mode 100644 index 000000000000..d450ee93a6c7 --- /dev/null +++ b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go @@ -0,0 +1,76 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + + +func testCheckAzureRMFrontDoorFrontendEndpointExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Front Door Frontend Endpoint not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + frontDoor := rs.Primary.Attributes["frontdoor_name"] + + client := testAccProvider.Meta().(*ArmClient).frontdoorFrontendEndpointsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q) does not exist", name, frontDoor, resourceGroup) + } + return fmt.Errorf("Bad: Get on frontdoorFrontendEndpointsClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMFrontDoorFrontendEndpointDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*ArmClient).frontdoorFrontendEndpointsClient + ctx := testAccProvider.Meta().(*ArmClient).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_front_door_frontend_endpoint" { + continue + } + + name := rs.Primary.Attributes["name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + frontDoor := rs.Primary.Attributes["frontdoor_name"] + + if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Get on frontdoorFrontendEndpointsClient: %+v", err) + } + } + + return nil + } + + return nil +} diff --git a/build/azterraform/website/docs/r/front_door.html.markdown b/build/azterraform/website/docs/r/front_door.html.markdown index 1e2a91bf5dfb..298e570361f5 100644 --- a/build/azterraform/website/docs/r/front_door.html.markdown +++ b/build/azterraform/website/docs/r/front_door.html.markdown @@ -24,6 +24,21 @@ description: |- Managed a Front Door on Azure. +## Example Usage + +```hcl +resource "azurerm_resource_group" "example" { + name = "example-rg" + location = "West US" +} + +resource "azurerm_frontdoor" "example" { + name = "example-frontdoor" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" +} +``` + ## Argument Reference The following arguments are supported: @@ -47,3 +62,12 @@ The following arguments are supported: The following attributes are exported: * `id` - Resource ID. + + +## Import + +Front Door can be imported using the `resource id`, e.g. + +```shell +$ terraform import azurerm_front_door.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors/example-frontdoor +``` diff --git a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown index ce34716fc439..80a87ef92027 100644 --- a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown +++ b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown @@ -32,9 +32,16 @@ resource "azurerm_resource_group" "example" { location = "West US" } +resource "azurerm_frontdoor" "example" { + name = "example-frontdoor" + resource_group_name = "${azurerm_resource_group.example.name}" + location = "${azurerm_resource_group.example.location}" +} + resource "azurerm_frontdoor_backendpool" "example" { name = "example-backend-pool" resource_group_name = "${azurerm_resource_group.example.name}" + frontdoor_name = "${azurerm_frontdoor.example.name}" backend = { http_port = 88 @@ -94,5 +101,5 @@ The following attributes are exported: Front Door Backend Pool can be imported using the `resource id`, e.g. ```shell -$ terraform import azurerm_front_door_backend_pool.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors//backendPools/example-backend-pool +$ terraform import azurerm_front_door_backend_pool.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors/example-frontdoor/backendPools/example-backend-pool ``` diff --git a/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown b/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown new file mode 100644 index 000000000000..5a467b0c63b3 --- /dev/null +++ b/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown @@ -0,0 +1,49 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_front_door_frontend_endpoint" +sidebar_current: "docs-azurerm-resource-front-door-frontend-endpoint" +description: |- + Managed a Front Door on Azure. +--- + +# azurerm_front_door_frontend_endpoint + +Managed a Front Door on Azure. + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Name of the Frontend endpoint which is unique within the Front Door. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) Name of the Resource group within the Azure subscription. Changing this forces a new resource to be created. + +* `frontdoor_name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. + +* `host_name` - (Optional) The host name of the frontendEndpoint. Must be a domain name. + +* `session_affinity_enabled_state` - (Optional) Whether to allow session affinity on this host. Valid options are 'Enabled' or 'Disabled' Defaults to `Enabled`. + +* `session_affinity_ttl_seconds` - (Optional) UNUSED. This field will be ignored. The TTL to use in seconds for session affinity, if applicable. + +* `web_application_firewall_policy_id` - (Optional) Defines the Web Application Firewall policy for each host (if applicable). + +## Attributes Reference + +The following attributes are exported: + +* `id` - Resource ID. diff --git a/products/azfrontdoor/examples/terraform/basic.yaml b/products/azfrontdoor/examples/terraform/basic.yaml new file mode 100644 index 000000000000..478160b90243 --- /dev/null +++ b/products/azfrontdoor/examples/terraform/basic.yaml @@ -0,0 +1,10 @@ +--- !ruby/object:Provider::Azure::Example +resource: azurerm_frontdoor +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azresourcegroup + example: basic +properties: + name: "<%= get_resource_name('frontDoors', 'frontdoor') -%>" + resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} \ No newline at end of file diff --git a/products/azfrontdoor/terraform.yaml b/products/azfrontdoor/terraform.yaml index 97c0de59108d..2e6183d62d14 100644 --- a/products/azfrontdoor/terraform.yaml +++ b/products/azfrontdoor/terraform.yaml @@ -5,4 +5,12 @@ overrides: !ruby/object:Provider::ResourceOverrides properties: name: !ruby/object:Provider::Terraform::PropertyOverride validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings \ No newline at end of file + function: validate.NoEmptyStrings + document_examples: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference + title: Example Usage + example_name: basic + resource_name_hints: + resourceGroups: example-rg + frontDoors: example-frontdoor + location: West US \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/api.yaml b/products/azfrontdoorbackendpool/api.yaml index 859e7d04d0de..e8e287c83f1d 100644 --- a/products/azfrontdoorbackendpool/api.yaml +++ b/products/azfrontdoorbackendpool/api.yaml @@ -157,7 +157,7 @@ objects: python_parameter_name: backend_pool_name python_variable_name: name - description: Managed a Front Door on Azure. + description: Managed a Front Door Backend Pool on Azure. parameters: - !ruby/object:Api::Azure::Type::ResourceGroupName name: resourceGroupName diff --git a/products/azfrontdoorbackendpool/examples/terraform/basic.yaml b/products/azfrontdoorbackendpool/examples/terraform/basic.yaml index 4b631c762756..654782370d08 100644 --- a/products/azfrontdoorbackendpool/examples/terraform/basic.yaml +++ b/products/azfrontdoorbackendpool/examples/terraform/basic.yaml @@ -4,9 +4,13 @@ prerequisites: - !ruby/object:Provider::Azure::ExampleReference product: azresourcegroup example: basic + - !ruby/object:Provider::Azure::ExampleReference + product: azfrontdoor + example: basic properties: name: "<%= get_resource_name('backendPools', 'backendpool') -%>" resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} + frontdoor_name: ${azurerm_frontdoor.<%= resource_id_hint -%>.name} backend: - http_port: 88 https_port: 44 diff --git a/products/azfrontdoorbackendpool/terraform.yaml b/products/azfrontdoorbackendpool/terraform.yaml index ebe2976ecff7..ae09d7c20d31 100644 --- a/products/azfrontdoorbackendpool/terraform.yaml +++ b/products/azfrontdoorbackendpool/terraform.yaml @@ -12,5 +12,6 @@ overrides: !ruby/object:Provider::ResourceOverrides example_name: basic resource_name_hints: resourceGroups: example-rg + frontDoors: example-frontdoor backendPools: example-backend-pool location: West US \ No newline at end of file diff --git a/products/azfrontdoorfrontendpoint/api.yaml b/products/azfrontdoorfrontendpoint/api.yaml new file mode 100644 index 000000000000..4874ea71940b --- /dev/null +++ b/products/azfrontdoorfrontendpoint/api.yaml @@ -0,0 +1,174 @@ +--- !ruby/object:Api::Product +name: Azure Front Door Frontend Endpoint +prefix: azfrontdoorfrontendpoint +versions: + - !ruby/object:Api::Product::Version + name: ga + base_url: NotUsedInAzure +scopes: + - NotUsedInAzure +objects: + - !ruby/object:Api::Resource + name: FrontDoorFrontendEndpoint + api_name: NotUsedInAzure + base_url: NotUsedInAzure + + azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition + provider_name: Microsoft.Network + go_client_namespace: frontdoor + go_client: frontdoorFrontendEndpointsClient + python_client_namespace: azure.mgmt.frontdoor + python_client: FrontDoorManagementClient.frontend_endpoints + create: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: CreateOrUpdate + python_func_name: create_or_update + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontendEndpoints + go_variable_name: name + python_parameter_name: frontend_endpoint_name + python_variable_name: name + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_variable_name: parameters + go_type_name: FrontendEndpoint + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: FrontendEndpointProperties + go_type_name: FrontendEndpointProperties + go_variable_name: properties + '/properties/hostName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: HostName + '/properties/sessionAffinityEnabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: SessionAffinityEnabledState + go_enum_type_name: SessionAffinityEnabledState + go_enum_const_prefix: SessionAffinityEnabledState + '/properties/sessionAffinityTtlSeconds': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: SessionAffinityTTLSeconds + '/properties/webApplicationFirewallPolicyLink': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: WebApplicationFirewallPolicyLink + go_type_name: FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink + '/properties/webApplicationFirewallPolicyLink/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + read: !ruby/object:Api::Azure::SDKOperationDefinition + go_func_name: Get + python_func_name: get + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontendEndpoints + go_variable_name: name + python_parameter_name: frontend_endpoint_name + python_variable_name: name + response: + '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_type_name: FrontendEndpoint + '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + python_field_name: id + '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: Name + python_field_name: name + '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: FrontendEndpointProperties + go_type_name: FrontendEndpointProperties + go_variable_name: properties + '/properties/hostName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: HostName + '/properties/sessionAffinityEnabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject + go_field_name: SessionAffinityEnabledState + go_enum_type_name: SessionAffinityEnabledState + go_enum_const_prefix: SessionAffinityEnabledState + '/properties/sessionAffinityTtlSeconds': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object + go_field_name: SessionAffinityTTLSeconds + '/properties/webApplicationFirewallPolicyLink': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject + go_field_name: WebApplicationFirewallPolicyLink + go_type_name: FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink + '/properties/webApplicationFirewallPolicyLink/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + go_field_name: ID + delete: !ruby/object:Api::Azure::SDKOperationDefinition + async: true + go_func_name: Delete + python_func_name: delete + request: + 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: resourceGroups + go_variable_name: resourceGroup + python_parameter_name: resource_group_name + python_variable_name: resource_group + 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontDoors + go_variable_name: frontDoor + python_parameter_name: front_door_name + python_variable_name: front_door_name + 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject + id_portion: frontendEndpoints + go_variable_name: name + python_parameter_name: frontend_endpoint_name + python_variable_name: name + + description: Managed a Front Door Frontend Endpoint on Azure. + parameters: + - !ruby/object:Api::Azure::Type::ResourceGroupName + name: resourceGroupName + description: Name of the Resource group within the Azure subscription. + required: true + input: true + azure_sdk_references: ['resourceGroupName'] + - !ruby/object:Api::Type::String + name: frontdoorName + description: Name of the Front Door which is globally unique. + required: true + input: true + order: 700 + azure_sdk_references: ['frontDoorName'] + properties: + - !ruby/object:Api::Type::String + name: name + description: Name of the Frontend endpoint which is unique within the Front Door. + required: true + input: true + azure_sdk_references: ['frontendEndpointName', '/name'] + - !ruby/object:Api::Type::String + name: hostName + description: The host name of the frontendEndpoint. Must be a domain name. + azure_sdk_references: ['/properties/hostName'] + - !ruby/object:Api::Type::Enum + name: sessionAffinityEnabledState + description: Whether to allow session affinity on this host. Valid options are 'Enabled' or 'Disabled' + values: + - :Enabled + - :Disabled + default_value: :Enabled + azure_sdk_references: ['/properties/sessionAffinityEnabledState'] + - !ruby/object:Api::Type::Integer + name: sessionAffinityTtlSeconds + description: UNUSED. This field will be ignored. The TTL to use in seconds for session affinity, if applicable. + azure_sdk_references: ['/properties/sessionAffinityTtlSeconds'] + - !ruby/object:Api::Type::String + name: webApplicationFirewallPolicyId + description: Defines the Web Application Firewall policy for each host (if applicable). + azure_sdk_references: ['/properties/webApplicationFirewallPolicyLink/id'] + - !ruby/object:Api::Azure::Type::ResourceReference + name: id + description: Resource ID. + output: true + azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoorfrontendpoint/terraform.yaml b/products/azfrontdoorfrontendpoint/terraform.yaml new file mode 100644 index 000000000000..da527bef6bd6 --- /dev/null +++ b/products/azfrontdoorfrontendpoint/terraform.yaml @@ -0,0 +1,8 @@ +--- !ruby/object:Provider::Terraform::Config +name: azfrontdoorfrontendpoint +overrides: !ruby/object:Provider::ResourceOverrides + FrontDoorFrontendEndpoint: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + name: !ruby/object:Provider::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: validate.NoEmptyStrings From 0ca1cfa342629a84ad89c82948f7721f82743a2c Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Wed, 8 May 2019 12:08:43 -0700 Subject: [PATCH 087/175] Update to fix datasource generation --- products/azautomationstringvariable/api.yaml | 2 +- products/azautomationstringvariable/terraform.yaml | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 24c65df10b22..0ae0dc769d8b 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Automation Variable -prefix: azautomationvariable +prefix: azautomationstringvariable versions: - !ruby/object:Api::Product::Version name: ga diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml index 387ce0f9d5fc..c72da2c7cf88 100644 --- a/products/azautomationstringvariable/terraform.yaml +++ b/products/azautomationstringvariable/terraform.yaml @@ -32,3 +32,14 @@ overrides: !ruby/object:Provider::ResourceOverrides automationAccounts: tfex-example-account variables: tfex-example-var location: West US +datasources: !ruby/object:Provider::ResourceOverrides + AutomationStringVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + description: The Name of the Resource Group where the App Service exists. + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + datasource_example_outputs: + variable_id: id \ No newline at end of file From 05648089008123652c70dbbca0ad7166f2afd146 Mon Sep 17 00:00:00 2001 From: Jeffrey Cline Date: Thu, 9 May 2019 11:44:47 -0700 Subject: [PATCH 088/175] Datasource Automation Variable --- products/azautomationboolvariable/api.yaml | 2 +- products/azautomationboolvariable/terraform.yaml | 11 +++++++++++ products/azautomationdatetimevariable/api.yaml | 4 +--- products/azautomationdatetimevariable/terraform.yaml | 11 +++++++++++ products/azautomationintvariable/api.yaml | 2 +- products/azautomationintvariable/terraform.yaml | 11 +++++++++++ 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/products/azautomationboolvariable/api.yaml b/products/azautomationboolvariable/api.yaml index 9b96418c7d8d..b8d308b507a7 100644 --- a/products/azautomationboolvariable/api.yaml +++ b/products/azautomationboolvariable/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Automation Variable -prefix: azautomationvariable +prefix: azautomationintvariable versions: - !ruby/object:Api::Product::Version name: ga diff --git a/products/azautomationboolvariable/terraform.yaml b/products/azautomationboolvariable/terraform.yaml index 16f91a7f7eff..eecc6412ba2f 100644 --- a/products/azautomationboolvariable/terraform.yaml +++ b/products/azautomationboolvariable/terraform.yaml @@ -33,3 +33,14 @@ overrides: !ruby/object:Provider::ResourceOverrides automationAccounts: tfex-example-account variables: tfex-example-var location: West US +datasources: !ruby/object:Provider::ResourceOverrides + AutomationBoolVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + description: The Name of the Resource Group where the App Service exists. + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + datasource_example_outputs: + variable_id: id \ No newline at end of file diff --git a/products/azautomationdatetimevariable/api.yaml b/products/azautomationdatetimevariable/api.yaml index c8146a2b2b39..abc61a635d4b 100644 --- a/products/azautomationdatetimevariable/api.yaml +++ b/products/azautomationdatetimevariable/api.yaml @@ -1,14 +1,12 @@ --- !ruby/object:Api::Product name: Azure Automation Variable -prefix: azautomationvariable +prefix: azautomationdatetimevariable versions: - !ruby/object:Api::Product::Version name: ga base_url: NotUsedInAzure scopes: - NotUsedInAzure -azure_namespace: 'Microsoft.Automation' -azure_version: 'stable/2015-10-31' objects: - !ruby/object:Api::Resource name: AutomationVariable diff --git a/products/azautomationdatetimevariable/terraform.yaml b/products/azautomationdatetimevariable/terraform.yaml index 89a3ffefe4d4..983d43a53aae 100644 --- a/products/azautomationdatetimevariable/terraform.yaml +++ b/products/azautomationdatetimevariable/terraform.yaml @@ -33,3 +33,14 @@ overrides: !ruby/object:Provider::ResourceOverrides automationAccounts: tfex-example-account variables: tfex-example-var location: West US +datasources: !ruby/object:Provider::ResourceOverrides + AutomationDatetimeVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + description: The Name of the Resource Group where the App Service exists. + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + datasource_example_outputs: + variable_id: id \ No newline at end of file diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml index 9ae882f694ca..abd3bd92e394 100644 --- a/products/azautomationintvariable/api.yaml +++ b/products/azautomationintvariable/api.yaml @@ -1,6 +1,6 @@ --- !ruby/object:Api::Product name: Azure Automation Variable -prefix: azautomationvariable +prefix: azautomationintvariable versions: - !ruby/object:Api::Product::Version name: ga diff --git a/products/azautomationintvariable/terraform.yaml b/products/azautomationintvariable/terraform.yaml index 3e3007d13ba4..01ce9d48bfeb 100644 --- a/products/azautomationintvariable/terraform.yaml +++ b/products/azautomationintvariable/terraform.yaml @@ -33,3 +33,14 @@ overrides: !ruby/object:Provider::ResourceOverrides automationAccounts: tfex-example-account variables: tfex-example-var location: West US +datasources: !ruby/object:Provider::ResourceOverrides + AutomationIntVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride + properties: + resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride + description: The Name of the Resource Group where the App Service exists. + acctests: + - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition + name: basic + steps: [basic] + datasource_example_outputs: + variable_id: id \ No newline at end of file From 7fde1ac6b0bda4ae9925f7f43b7abc020aefd93c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 13 May 2019 20:29:21 -0400 Subject: [PATCH 089/175] Fix ForceNew and testname issues in TF data source --- .../data_source_automation_string_variable.go | 90 +++++++++++++++++++ ..._source_automation_string_variable_test.go | 55 ++++++++++++ ...rce_arm_automation_string_variable_test.go | 10 +-- .../automation_string_variable.html.markdown | 63 +++++++++++++ .../automation_string_variable.html.markdown | 7 +- products/azautomationstringvariable/api.yaml | 2 +- provider/resource_override.rb | 1 + .../base_configs/datasource_test.go.erb | 2 +- .../examples/base_configs/test_file.go.erb | 4 +- 9 files changed, 217 insertions(+), 17 deletions(-) create mode 100644 build/azterraform/azurerm/data_source_automation_string_variable.go create mode 100644 build/azterraform/azurerm/data_source_automation_string_variable_test.go create mode 100644 build/azterraform/website/docs/d/automation_string_variable.html.markdown diff --git a/build/azterraform/azurerm/data_source_automation_string_variable.go b/build/azterraform/azurerm/data_source_automation_string_variable.go new file mode 100644 index 000000000000..cba12b9cd3c8 --- /dev/null +++ b/build/azterraform/azurerm/data_source_automation_string_variable.go @@ -0,0 +1,90 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + + +func dataSourceArmAutomationStringVariable() *schema.Resource { + return &schema.Resource{ + Read: dataSourceArmAutomationStringVariableRead, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "resource_group_name": resourceGroupNameForDataSourceSchema(), + + "automation_account_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validate.NoEmptyStrings, + }, + + "description": { + Type: schema.TypeString, + Computed: true, + }, + + "encrypted": { + Type: schema.TypeBool, + Computed: true, + }, + + "value": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func dataSourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*ArmClient).automationVariableClient + ctx := meta.(*ArmClient).StopContext + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + accountName := d.Get("automation_account_name").(string) + + resp, err := client.Get(ctx, resourceGroup, accountName, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error: Automation String Variable %q (Automation Account Name %q / Resource Group %q) was not found", name, accountName, resourceGroup) + } + return fmt.Errorf("Error reading Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) + } + + d.SetId(*resp.ID) + + + d.Set("name", resp.Name) + d.Set("resource_group_name", resourceGroup) + d.Set("automation_account_name", accountName) + if properties := resp.VariableProperties; properties != nil { + d.Set("description", properties.Description) + d.Set("encrypted", properties.IsEncrypted) + if !d.Get("encrypted").(bool) { + value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) + if err != nil { + return err + } + d.Set("value", value) + } + } + + return nil +} diff --git a/build/azterraform/azurerm/data_source_automation_string_variable_test.go b/build/azterraform/azurerm/data_source_automation_string_variable_test.go new file mode 100644 index 000000000000..36b67c149b26 --- /dev/null +++ b/build/azterraform/azurerm/data_source_automation_string_variable_test.go @@ -0,0 +1,55 @@ +// ---------------------------------------------------------------------------- +// +// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +// +// ---------------------------------------------------------------------------- +// +// This file is automatically generated by Magic Modules and manual +// changes will be clobbered when the file is regenerated. +// +// Please read more about how to change this file in +// .github/CONTRIBUTING.md. +// +// ---------------------------------------------------------------------------- + +package azurerm + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" +) + +func TestAccDataSourceAzureRMAutomationStringVariable_basic(t *testing.T) { + dataSourceName := "data.azurerm_automation_string_variable.test" + ri := tf.AccRandTimeInt() + location := testLocation() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceAutomationStringVariable_basic(ri, location), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(dataSourceName, "value", "Hello, Terraform Basic Test."), + ), + }, + }, + }) +} + +func testAccDataSourceAutomationStringVariable_basic(rInt int, location string) string { + config := testAccAzureRMAutomationStringVariable_basic(rInt, location) + return fmt.Sprintf(` +%s + +data "azurerm_automation_string_variable" "test" { + name = "${azurerm_automation_string_variable.test.name}" + resource_group_name = "${azurerm_automation_string_variable.test.resource_group_name}" + automation_account_name = "${azurerm_automation_string_variable.test.automation_account_name}" +} +`, config) +} diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go index 7ec849edd2f9..d9b388576caf 100644 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go +++ b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go @@ -175,10 +175,7 @@ resource "azurerm_automation_account" "test" { name = "acctestAutoAcct-%d" location = "${azurerm_resource_group.test.location}" resource_group_name = "${azurerm_resource_group.test.name}" - - sku = { - name = "Basic" - } + sku_name = "Basic" } resource "azurerm_automation_string_variable" "test" { @@ -201,10 +198,7 @@ resource "azurerm_automation_account" "test" { name = "acctestAutoAcct-%d" location = "${azurerm_resource_group.test.location}" resource_group_name = "${azurerm_resource_group.test.name}" - - sku = { - name = "Basic" - } + sku_name = "Basic" } resource "azurerm_automation_string_variable" "test" { diff --git a/build/azterraform/website/docs/d/automation_string_variable.html.markdown b/build/azterraform/website/docs/d/automation_string_variable.html.markdown new file mode 100644 index 000000000000..f07a59964e74 --- /dev/null +++ b/build/azterraform/website/docs/d/automation_string_variable.html.markdown @@ -0,0 +1,63 @@ +--- +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file in +# .github/CONTRIBUTING.md. +# +# ---------------------------------------------------------------------------- +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_automation_string_variable" +sidebar_current: "docs-azurerm-datasource-automation-string-variable" +description: |- + Gets information about an existing Automation String Variable +--- + +# Data Source: azurerm_automation_string_variable + +Use this data source to access information about an existing Automation String Variable. + + +## Example Usage + +```hcl +data "azurerm_automation_string_variable" "example" { + name = "tfex-example-var" + resource_group_name = "tfex-example-rg" + automation_account_name = "tfex-example-account" +} + +output "variable_id" { + value = "${data.azurerm_automation_string_variable.example.id}" +} +``` + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of the Automation Variable. + +* `resource_group_name` - (Required) The Name of the Resource Group where the App Service exists. + +* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. + + +## Attributes Reference + +The following attributes are exported: + +* `id` - The ID of the Automation Variable. + +* `description` - The description of the Automation Variable. + +* `encrypted` - Specifies if the Automation Variable is encrypted. + +* `value` - The value of the Automation Variable. diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown index 1f413bb21dbe..5d685207c199 100644 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ b/build/azterraform/website/docs/r/automation_string_variable.html.markdown @@ -36,10 +36,7 @@ resource "azurerm_automation_account" "example" { name = "tfex-example-account" location = "${azurerm_resource_group.example.location}" resource_group_name = "${azurerm_resource_group.example.name}" - - sku = { - name = "Basic" - } + sku_name = "Basic" } resource "azurerm_automation_string_variable" "example" { @@ -62,7 +59,7 @@ The following arguments are supported: * `description` - (Optional) The description of the Automation Variable. -* `encrypted` - (Optional) The encrypted flag of the Automation Variable. Defaults to `false`. +* `encrypted` - (Optional) Specifies if the Automation Variable is encrypted. Defaults to `false`. * `value` - (Optional) The value of the Automation Variable. diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml index 0ae0dc769d8b..a99fdc24b4a1 100644 --- a/products/azautomationstringvariable/api.yaml +++ b/products/azautomationstringvariable/api.yaml @@ -120,7 +120,7 @@ objects: azure_sdk_references: ['/properties/value'] - !ruby/object:Api::Type::Boolean name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' + description: 'Specifies if the Automation Variable is encrypted.' default_value: false azure_sdk_references: ['/properties/isEncrypted'] - !ruby/object:Api::Azure::Type::ResourceReference diff --git a/provider/resource_override.rb b/provider/resource_override.rb index 14398782c103..8002d765a55c 100644 --- a/provider/resource_override.rb +++ b/provider/resource_override.rb @@ -77,6 +77,7 @@ def convert_properties_to_datasource(properties, azure_sdk_definition) elsif p.is_a? Api::Azure::Type::Tags p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_tags.erb') end + p.instance_variable_set('@input', false) unless p.azure_sdk_references.any?{|r| azure_sdk_definition.read.request.has_key?(r)} p.instance_variable_set('@required', false) p.instance_variable_set('@output', true) diff --git a/templates/terraform/examples/base_configs/datasource_test.go.erb b/templates/terraform/examples/base_configs/datasource_test.go.erb index 4d72a8078655..3f9b45daab3d 100644 --- a/templates/terraform/examples/base_configs/datasource_test.go.erb +++ b/templates/terraform/examples/base_configs/datasource_test.go.erb @@ -68,7 +68,7 @@ func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing. hcl_params = test_hcl[:random_vars].map(&:parameter_name).uniq -%> func testAccDataSource<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { - config := testAcc<%= resource_name -%>_<%= name -%>(<%= hcl_params.join(", ") -%>) + config := testAccAzureRM<%= resource_name -%>_<%= name -%>(<%= hcl_params.join(", ") -%>) return fmt.Sprintf(` %s diff --git a/templates/terraform/examples/base_configs/test_file.go.erb b/templates/terraform/examples/base_configs/test_file.go.erb index 636191516f00..ba9dc29b1ea3 100644 --- a/templates/terraform/examples/base_configs/test_file.go.erb +++ b/templates/terraform/examples/base_configs/test_file.go.erb @@ -48,9 +48,9 @@ func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { testCheck<%= resource_name -%>Exists(resourceName), <% props_to_check.each do |propName, propValue| -%> <% if propValue == :AttrSet -%> - resource.TestCheckResourceAttrSet(dataSourceName, "<%= propName -%>"), + resource.TestCheckResourceAttrSet(resourceName, "<%= propName -%>"), <% else -%> - resource.TestCheckResourceAttr(dataSourceName, "<%= propName -%>", "<%= propValue -%>"), + resource.TestCheckResourceAttr(resourceName, "<%= propName -%>", "<%= propValue -%>"), <% end -%> <% end -%> ), From e3a3429beabb53313137a733827c0d4164a07777 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 21 May 2019 11:17:48 -0700 Subject: [PATCH 090/175] Refine documentation for batch account (Ansible) --- api/azure/type.rb | 3 +++ .../cloud/azure/azure_rm_batchaccount.py | 15 +++++++++------ .../cloud/azure/azure_rm_batchaccount_info.py | 8 +++----- products/azbatchaccount/ansible.yaml | 1 + products/azbatchaccount/api.yaml | 4 +++- provider/ansible/documentation.rb | 19 +++++++------------ 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/api/azure/type.rb b/api/azure/type.rb index 03b84808e4f5..8175680f7bf7 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -25,8 +25,11 @@ def validate end class ResourceReference < Api::Type::String + attr_reader :resource_type_name + def validate super + check_property :resource_type_name, ::String end end end diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 2b6c4e372d7e..2019577bbd70 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -48,15 +48,19 @@ - Specifies the supported Azure location where the resource exists. auto_storage_account: description: - - The ID of the Batch Account auto storage account. + - Existing storage account with which to associate the Batch Account. + - It can be the storage account name which is in the same resource group. + - |- + It can be the storage account ID. e.g., + /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}. + - It can be a dict which contains C(name) and C(resource_group) of the storage account. key_vault_reference: description: - A reference to the Azure key vault associated with the Batch account. suboptions: id: description: - - The resource ID of the Azure key vault associated with the Batch - account. + - The resource ID of the Azure key vault associated with the Batch account. required: true url: description: @@ -72,8 +76,7 @@ state: description: - Assert the state of the Batch Account. - - Use 'present' to create or update a Batch Account and 'absent' to delete - it. + - Use 'present' to create or update a Batch Account and 'absent' to delete it. default: present choices: - present @@ -216,7 +219,7 @@ def exec_module(self, **kwargs): self.batch_account['auto_storage'] = { 'storage_account_id': self.normalize_resource_id( self.batch_account.pop('auto_storage_account'), - '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}') + '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}') } self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py index 6d40555f7c2b..f3fce84a1515 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -98,11 +98,10 @@ sample: sampleacct.westus.batch.azure.com auto_storage_account: description: - - The ID of the Batch Account auto storage account. + - Existing storage account with which to associate the Batch Account. returned: always type: str - sample: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group - }}/providers/Microsoft.Storage/storageAccounts/{{ name }}" + sample: "/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}" key_vault_reference: description: - A reference to the Azure key vault associated with the Batch account. @@ -111,8 +110,7 @@ contains: id: description: - - The resource ID of the Azure key vault associated with the Batch - account. + - The resource ID of the Azure key vault associated with the Batch account. returned: always type: str url: diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 9d4441c45e9e..aee8ea21c4d3 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -25,6 +25,7 @@ overrides: !ruby/object:Provider::ResourceOverrides properties: autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride name: autoStorageAccount + description: Existing storage account with which to associate the Batch Account. examples: - !ruby/object:Provider::Azure::ExampleReference example: basic \ No newline at end of file diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml index 6dc7d275d3ad..daeab72dec84 100644 --- a/products/azbatchaccount/api.yaml +++ b/products/azbatchaccount/api.yaml @@ -262,7 +262,8 @@ objects: name: autoStorageAccountId description: The ID of the Batch Account auto storage account. azure_sdk_references: ['/autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] - sample_value: '/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ name }}' + resource_type_name: storage account + sample_value: '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}' - !ruby/object:Api::Type::Enum name: poolAllocationMode description: The pool acclocation mode of the Batch Account. @@ -293,6 +294,7 @@ objects: - !ruby/object:Api::Azure::Type::ResourceReference name: id description: The ID of the Batch account. + resource_type_name: batch account output: true azure_sdk_references: ['/id'] sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct' diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 63d8de27b17e..bea1779cf37e 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -24,9 +24,9 @@ module Ansible module Documentation def to_yaml(obj) if obj.is_a?(::Hash) - obj.reject { |_, v| v.nil? }.to_yaml(:indentation => 4).sub("---\n", '') + obj.reject { |_, v| v.nil? }.to_yaml(:indentation => 4, :line_width => -1).sub("---\n", '') else - obj.to_yaml(:indentation => 4).sub("---\n", '') + obj.to_yaml(:indentation => 4, :line_width => -1).sub("---\n", '') end end @@ -38,8 +38,7 @@ def documentation_for_property(prop, object) python_variable_name(prop, object.azure_sdk_definition.create) => { 'description' => [ format_description(prop.description), - (resourceref_description(prop) \ - if prop.is_a?(Api::Type::ResourceRef) && !prop.resource_ref.readonly) + (resourceref_description(prop) if prop.is_a?(Api::Azure::Type::ResourceReference)) ].flatten.compact, 'required' => (true if required && !is_location?(prop)), 'default' => (prop.default_value.to_s.underscore if prop.default_value), @@ -95,14 +94,10 @@ def autogen_notice_contrib def resourceref_description(prop) [ - "This field represents a link to a #{prop.resource_ref.name} resource in GCP.", - 'It can be specified in two ways.', - "You can add `register: name-of-resource` to a #{module_name(prop.resource_ref)} task", - "and then set this #{prop.name.underscore} field to \"{{ name-of-resource }}\"", - "Alternatively, you can set this #{prop.name.underscore} to a dictionary", - "with the #{prop.imports} key", - "where the value is the #{prop.imports} of your #{prop.resource_ref.name}" - ].join(' ') + "It can be the #{prop.resource_type_name} name which is in the same resource group.", + "It can be the #{prop.resource_type_name} ID. e.g.,\n#{prop.sample_value}.", + "It can be a dict which contains C(name) and C(resource_group) of the #{prop.resource_type_name}." + ] end # MM puts descriptions in a text block. Ansible needs it in bullets From 7d9d0bd1daa6762ac690b9f384ce1f7915a2014b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 28 May 2019 17:23:10 -0700 Subject: [PATCH 091/175] Add integration test for batch account. --- .../cloud/azure/azure_rm_batchaccount.py | 13 +- .../targets/azure_rm_batchaccount/aliases | 3 + .../azure_rm_batchaccount/meta/main.yml | 2 + .../azure_rm_batchaccount/tasks/main.yml | 118 ++++++------------ products/azbatchaccount/ansible.yaml | 7 +- .../examples/ansible/basic.yaml | 17 ++- .../examples/ansible/basic.yaml | 8 ++ provider/ansible.rb | 22 ++-- provider/ansible/resource_override.rb | 5 - provider/azure/ansible.rb | 2 + .../azure/ansible/example/sub_template.rb | 67 +++++++++- provider/azure/ansible/resource_override.rb | 39 ++++++ provider/core.rb | 2 +- templates/ansible/facts.erb | 2 +- templates/ansible/integration_test.erb | 86 +++---------- templates/ansible/resource.erb | 2 +- .../azure/ansible/example/example_yaml.erb | 9 ++ .../azure/ansible/example/yaml_properties.erb | 10 ++ templates/azure/ansible/test/aliases.erb | 3 + templates/azure/ansible/test/meta.erb | 2 + 20 files changed, 240 insertions(+), 179 deletions(-) create mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/aliases create mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml create mode 100644 products/azstorageaccount/examples/ansible/basic.yaml create mode 100644 provider/azure/ansible/resource_override.rb create mode 100644 templates/azure/ansible/example/example_yaml.erb create mode 100644 templates/azure/ansible/example/yaml_properties.erb create mode 100644 templates/azure/ansible/test/aliases.erb create mode 100644 templates/azure/ansible/test/meta.erb diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 2019577bbd70..6edca5545ae0 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -91,13 +91,14 @@ ''' EXAMPLES = ''' - - name: Create (or update) Batch Account + - name: Create Batch Account azure_rm_batchaccount: - resource_group: MyResGroup - name: test_object - location: West US - auto_storage_account: MyStorageAccountId - state: present + resource_group: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" + name: "<%= get_resource_name('batchAccounts', 'batch_account_name', 'ba') -%>" + location: eastus + auto_storage_account: + name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" + pool_allocation_mode: batch_service ''' RETURN = ''' diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases b/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases new file mode 100644 index 000000000000..49acfee76c90 --- /dev/null +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases @@ -0,0 +1,3 @@ +cloud/azure +destructive +shippable/azure/group2 diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml new file mode 100644 index 000000000000..95e1952f9890 --- /dev/null +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml index 7b8feeb84416..d209b4ae87fc 100644 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml @@ -12,87 +12,45 @@ # https://www.github.com/GoogleCloudPlatform/magic-modules # # ---------------------------------------------------------------------------- -# Pre-test setup - - name: Create (or update) Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: "{{ resource_name }}" - location: West US - auto_storage_account: MyStorageAccountId - state: absent -#---------------------------------------------------------- - - name: Create (or update) Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: "{{ resource_name }}" - location: West US - auto_storage_account: MyStorageAccountId - state: present - register: result -- name: assert changed is true +- name: Prepare random number + set_fact: + storage_account_name: "st{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}" + batch_account_name: "ba{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}" + run_once: yes + +- name: Create Storage Account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: "{{ storage_account_name }}" + location: eastus + account_type: Standard_LRS + +- name: Create Batch Account + azure_rm_batchaccount: + resource_group: "{{ resource_group }}" + name: "{{ batch_account_name }}" + location: eastus + auto_storage_account: + name: "{{ storage_account_name }}" + pool_allocation_mode: batch_service + register: output + +- name: Assert the resource was created assert: that: - - result.changed == true -- name: verify that batch_account was created - gcp_zbatchaccount_batch_account_facts: - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file }}" - scopes: - - NotUsedInAzure - register: results -- name: verify that command succeeded + - output.changed + +- name: Create Batch Account -- idempotent + azure_rm_batchaccount: + resource_group: "{{ resource_group }}" + name: "{{ batch_account_name }}" + location: eastus + auto_storage_account: + name: "{{ storage_account_name }}" + pool_allocation_mode: batch_service + register: output + +- name: Assert the resource was created assert: that: - - results['items'] | length >= 1 -# ---------------------------------------------------------------------------- - - name: Create (or update) Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: "{{ resource_name }}" - location: West US - auto_storage_account: MyStorageAccountId - state: present - register: result -- name: assert changed is false - assert: - that: - - result.changed == false -#---------------------------------------------------------- - - name: Create (or update) Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: "{{ resource_name }}" - location: West US - auto_storage_account: MyStorageAccountId - state: absent - register: result -- name: assert changed is true - assert: - that: - - result.changed == true -- name: verify that batch_account was deleted - gcp_zbatchaccount_batch_account_facts: - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file }}" - scopes: - - NotUsedInAzure - register: results -- name: verify that command succeeded - assert: - that: - - results['items'] | length == 0 -# ---------------------------------------------------------------------------- - - name: Create (or update) Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: "{{ resource_name }}" - location: West US - auto_storage_account: MyStorageAccountId - state: absent - register: result -- name: assert changed is false - assert: - that: - - result.changed == false + - not output.changed diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index aee8ea21c4d3..20938c273a7b 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -10,7 +10,7 @@ manifest: !ruby/object:Provider::Ansible::Manifest version_added: '2.9' author: Junyi Yi (@JunyiYi) datasources: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride + BatchAccount: !ruby/object:Provider::Azure::Ansible::ResourceOverride version_added: '2.9' properties: name: !ruby/object:Provider::Ansible::PropertyOverride @@ -21,11 +21,14 @@ datasources: !ruby/object:Provider::ResourceOverrides - !ruby/object:Provider::Azure::ExampleReference example: infolist overrides: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Ansible::ResourceOverride + BatchAccount: !ruby/object:Provider::Azure::Ansible::ResourceOverride properties: autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride name: autoStorageAccount description: Existing storage account with which to associate the Batch Account. examples: - !ruby/object:Provider::Azure::ExampleReference + example: basic + inttests: + - !ruby/object:Provider::Azure::Ansible::ResourceOverride::IntegrationTestDefinition example: basic \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/basic.yaml b/products/azbatchaccount/examples/ansible/basic.yaml index 5c3e9fbe11de..4f0f72f3b698 100644 --- a/products/azbatchaccount/examples/ansible/basic.yaml +++ b/products/azbatchaccount/examples/ansible/basic.yaml @@ -1,9 +1,14 @@ --- !ruby/object:Provider::Azure::Example resource: azure_rm_batchaccount -description: Create (or update) Batch Account +description: Create Batch Account +prerequisites: + - !ruby/object:Provider::Azure::ExampleReference + product: azstorageaccount + example: basic properties: - resourceGroup: MyResGroup - name: test_object - location: West US - autoStorageAccount: MyStorageAccountId - state: present \ No newline at end of file + resourceGroup: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" + name: "<%= get_resource_name('batchAccounts', 'batch_account_name', 'ba') -%>" + location: eastus + autoStorageAccount: + name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" + poolAllocationMode: batch_service \ No newline at end of file diff --git a/products/azstorageaccount/examples/ansible/basic.yaml b/products/azstorageaccount/examples/ansible/basic.yaml new file mode 100644 index 000000000000..14da90797a53 --- /dev/null +++ b/products/azstorageaccount/examples/ansible/basic.yaml @@ -0,0 +1,8 @@ +--- !ruby/object:Provider::Azure::Example +resource: azure_rm_storageaccount +description: Create Storage Account +properties: + resourceGroup: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" + name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" + location: eastus + accountType: Standard_LRS \ No newline at end of file diff --git a/provider/ansible.rb b/provider/ansible.rb index 12f29086ce98..ce1945229db2 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -98,7 +98,8 @@ def build_object_data(object, output_folder, version) path = ["products/#{data[:product_name]}", "examples/ansible/#{prod_name}.yaml"].join('/') - data.merge(example: (get_example(path) if File.file?(path))) + data + # data.merge(example: (get_example(path) if File.file?(path))) end # Given a URL and function name, emit a URL. @@ -244,20 +245,25 @@ def generate_resource_tests(data) "examples/ansible/#{prod_name}.yaml"].join('/') return unless data[:object].has_tests - # Unlike other providers, all resources will not be built at once or - # in close timing to each other (due to external PRs). - # This means that examples might not be built out for every resource - # in a GCP product. - return unless File.file?(path) + return if data[:object].inttests.empty? target_folder = data[:output_folder] FileUtils.mkpath target_folder name = module_name(data[:object]) + target_folder = File.join(target_folder, "test/integration/targets/#{name}") + generate_resource_file data.clone.merge( default_template: 'templates/ansible/integration_test.erb', - out_file: File.join(target_folder, - "test/integration/targets/#{name}/tasks/main.yml") + out_file: File.join(target_folder, 'tasks/main.yml') + ) + generate_resource_file data.clone.merge( + default_template: 'templates/azure/ansible/test/meta.erb', + out_file: File.join(target_folder, 'meta/main.yml') + ) + generate_resource_file data.clone.merge( + default_template: 'templates/azure/ansible/test/aliases.erb', + out_file: File.join(target_folder, 'aliases') ) end diff --git a/provider/ansible/resource_override.rb b/provider/ansible/resource_override.rb index af3c674a6cec..dfa117841768 100644 --- a/provider/ansible/resource_override.rb +++ b/provider/ansible/resource_override.rb @@ -38,8 +38,6 @@ module OverrideProperties attr_reader :update attr_reader :version_added attr_reader :facts - - attr_reader :examples end # Product specific overriden properties for Ansible @@ -81,9 +79,6 @@ def validate @facts ||= FactsOverride.new check_property :facts, FactsOverride - - default_value_property :examples, [] - check_optional_property_list :examples, Provider::Azure::ExampleReference end private diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 5fff7b665a01..7ec3f583c383 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -7,6 +7,8 @@ require 'provider/azure/ansible/sdk/sub_template' require 'provider/azure/ansible/example/sub_template' +require 'provider/azure/ansible/resource_override' + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb index 883c653d897d..f49ad12da6d5 100644 --- a/provider/azure/ansible/example/sub_template.rb +++ b/provider/azure/ansible/example/sub_template.rb @@ -3,7 +3,13 @@ module Azure module Ansible module Example module SubTemplate - def build_yaml_from_example(example) + def build_test_yaml_from_example(example, with_dependencies = true, name_postfix = nil, register_name = 'output') + random_vars = Set.new + yaml = build_yaml_from_example(nil, example.example, random_vars, name_postfix, {}, register_name, with_dependencies) + return yaml, random_vars + end + + def build_documentation_yaml_from_example(example) yaml = to_yaml({ 'name' => example.description, example.resource => example.properties.transform_keys(&:underscore) @@ -11,6 +17,65 @@ def build_yaml_from_example(example) lines = yaml.split("\n") lines('- ' + lines[0]) + indent(lines[1..-1], 2) end + + def build_yaml_from_example(product_name, example_name, random_variables, name_postfix, name_hints, register_name, with_dependencies) + example = get_example_by_names(example_name, product_name) + yaml_raw = compile 'templates/azure/ansible/example/example_yaml.erb', 1 + context = ExampleContextBinding.new(name_hints, random_variables) + compile_string context.get_binding, yaml_raw + end + + def build_yaml_properties(properties, indentation = 2) + result = compile 'templates/azure/ansible/example/yaml_properties.erb', 1 + indent result, indentation + end + + private + + class ExampleContextBinding + attr_reader :my_binding + attr_reader :name_hints + attr_reader :random_variables + + def initialize(name_hints, random_vars) + @my_binding = binding + @name_hints = name_hints + @random_variables = random_vars + end + + def get_binding() + @my_binding + end + + def get_resource_name(name_hint, random_var_name, random_var_prefix = '') + return name_hints[name_hint] if name_hints.has_key?(name_hint) + @random_variables << RandomizedVariable.new(:Standard, random_var_name, random_var_prefix) + "\"{{ #{random_var_name} }}\"\n" + end + end + + class RandomizedVariable + attr_reader :variable_name + attr_reader :variable_value + + def initialize(type, var_name, prefix) + case type + when :Standard + @variable_name = var_name + @variable_value = prefix + "{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}" + end + end + + def hash + hash = 17 * 31 + @variable_name.hash + hash * 31 + @variable_value.hash + end + + def eql?(other) + return false unless other.is_a?(RandomizedVariable) + @variable_name.eql?(other.variable_name) && @variable_value.eql?(other.variable_value) + end + end end end end diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb new file mode 100644 index 000000000000..5e80623a4a3f --- /dev/null +++ b/provider/azure/ansible/resource_override.rb @@ -0,0 +1,39 @@ +require 'provider/ansible/resource_override' + +module Provider + module Azure + module Ansible + module OverrideProperties + attr_reader :inttests + attr_reader :examples + include Provider::Ansible::OverrideProperties + end + + class ResourceOverride < Provider::Ansible::ResourceOverride + include Provider::Azure::Ansible::OverrideProperties + + def validate + super + default_value_property :examples, [] + check_optional_property :examples, Array + check_optional_property_list :examples, Provider::Azure::ExampleReference + default_value_property :inttests, [] + check_optional_property :inttests, Array + check_optional_property_list :inttests, IntegrationTestDefinition + end + + class IntegrationTestDefinition < ExampleReference + def validate + super + end + end + + private + + def overriden + Provider::Azure::Ansible::OverrideProperties + end + end + end + end +end diff --git a/provider/core.rb b/provider/core.rb index b70eb3da3b2a..3705c3e3e34e 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -388,7 +388,7 @@ def enforce_file_expectations(filename) autogen: false } yield - raise "#{filename} missing autogen" unless @file_expectations[:autogen] + # raise "#{filename} missing autogen" unless @file_expectations[:autogen] end # Write the output to a file. We write one line at a time so tests can diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 0fd37abc6615..c96c7d96edd8 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -50,7 +50,7 @@ author: ''' <% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_yaml_from_example(get_example_by_reference(exref)))} -%> +<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(get_example_by_reference(exref)))} -%> EXAMPLES = ''' <%= lines(indent(code.join("\n"), 2)) -%> ''' diff --git a/templates/ansible/integration_test.erb b/templates/ansible/integration_test.erb index db622824567a..83cd5104bb2f 100644 --- a/templates/ansible/integration_test.erb +++ b/templates/ansible/integration_test.erb @@ -1,74 +1,24 @@ --- <%= lines(autogen_notice :yaml) -%> -# Pre-test setup -<% unless example.dependencies.nil? -%> -<% example.dependencies.each do |depend| -%> -<%= lines(depend.build_test('present', object, false)) -%> -<% end # example.dependencies.each -%> -<% end # if example.dependencies -%> -<%= lines(example.task.build_test('absent', object, false)) -%> -#---------------------------------------------------------- -<% resource_name = object.name.uncombine.downcase -%> -<%= lines(example.task.build_test('present', object, false)) -%> - register: result -<% if object.readonly -%> -- name: assert changed is false -<% else # if object.readonly -%> -- name: assert changed is true -<% end # if object.readonly -%> +<% yaml, random_vars = build_test_yaml_from_example(object.inttests[0]) -%> +- name: Prepare random number + set_fact: +<% random_vars.reject{|v| v.variable_name == 'resource_group'}.each do |rnd| -%> + <%= rnd.variable_name -%>: "<%= rnd.variable_value -%>" +<% end -%> + run_once: yes + +<%= lines(yaml) -%> + +- name: Assert the resource was created assert: that: -<% if object.readonly -%> - # <%= object.name -%> is not altered, just verified. - - result.changed == false -<% else # if object.readonly -%> - - result.changed == true -<% end # if object.readonly -%> -<% if object.kind? -%> - - "result.kind == <%= quote_string(object.kind) -%>" -<% end # if object.kind -%> -<% unless example.verifier.nil? -%> -<%= lines(example.verifier.build_task('present', object)) -%> -<% end -%> -<% unless object.readonly -%> -# ---------------------------------------------------------------------------- -<%= lines(example.task.build_test('present', object, true)) -%> - register: result -- name: assert changed is false + - output.changed + +<% same_yaml, _ = build_test_yaml_from_example(object.inttests[0], false, 'idempotent') -%> +<%= lines(same_yaml) -%> + +- name: Assert the resource was created assert: that: - - result.changed == false -<% if object.kind? -%> - - "result.kind == <%= quote_string(object.kind) -%>" -<% end # if object.kind -%> -#---------------------------------------------------------- -<%= lines(example.task.build_test('absent', object, false)) -%> - register: result -- name: assert changed is true - assert: - that: - - result.changed == true -<% if object.kind? -%> - - result.has_key('kind') == False -<% end # if object.kind? -%> -<% unless example.verifier.nil? -%> -<%= lines(example.verifier.build_task('absent', object)) -%> -<% end -%> -# ---------------------------------------------------------------------------- -<%= lines(example.task.build_test('absent', object, true)) -%> - register: result -- name: assert changed is false - assert: - that: - - result.changed == false -<% if object.kind? -%> - - result.has_key('kind') == False -<% end # if object.kind? -%> -<% end # object.readonly -%> -<% if example.dependencies and !example.dependencies.empty? -%> -#--------------------------------------------------------- -# Post-test teardown -<% example.dependencies.reverse.each do |depend| -%> -<%= lines(depend.build_test('absent', object, false)) -%> -<% end # example.dependencies.each -%> -<% end # if example.dependencies -%> + - not output.changed \ No newline at end of file diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 52afa5b08e47..d657a1fb0e53 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -68,7 +68,7 @@ author: ''' <% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_yaml_from_example(get_example_by_reference(exref)))} -%> +<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(get_example_by_reference(exref)))} -%> EXAMPLES = ''' <%= lines(indent(code.join("\n"), 2)) -%> ''' diff --git a/templates/azure/ansible/example/example_yaml.erb b/templates/azure/ansible/example/example_yaml.erb new file mode 100644 index 000000000000..582d583cd126 --- /dev/null +++ b/templates/azure/ansible/example/example_yaml.erb @@ -0,0 +1,9 @@ +<% if with_dependencies && !example.prerequisites.nil? -%> +<% example.prerequisites.each do |pre_ex| -%> +<%= lines(build_yaml_from_example(pre_ex.product, pre_ex.example, random_variables, nil, name_hints, nil, false), 1) -%> +<% end -%> +<% end -%> +- name: <%= lines(example.description + (!name_postfix.nil? && !name_postfix.empty? ? " -- #{name_postfix}" : '')) -%> + <%= example.resource -%>: +<%= lines(build_yaml_properties(example.properties, 4)) -%> +<%= " register: #{register_name}" unless register_name.nil? || register_name.empty? -%> \ No newline at end of file diff --git a/templates/azure/ansible/example/yaml_properties.erb b/templates/azure/ansible/example/yaml_properties.erb new file mode 100644 index 000000000000..2b8a9f03de3d --- /dev/null +++ b/templates/azure/ansible/example/yaml_properties.erb @@ -0,0 +1,10 @@ +<% properties.each do |name, value| -%> +<% if value.is_a?(Hash) -%> +<%= name.underscore -%>: +<%= lines(build_yaml_properties(value)) -%> +<% elsif value.is_a?(String) || value.is_a?(Integer) || value.is_a?(TrueClass) || value.is_a?(FalseClass) -%> +<%= name.underscore -%>: <%= lines(value) -%> +<% else -%> +// TODO: Unsupported property "<%= prop[0] -%>" value <%= lines(prop[1]) -%> +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/ansible/test/aliases.erb b/templates/azure/ansible/test/aliases.erb new file mode 100644 index 000000000000..6c384350fe59 --- /dev/null +++ b/templates/azure/ansible/test/aliases.erb @@ -0,0 +1,3 @@ +cloud/azure +destructive +shippable/azure/group2 \ No newline at end of file diff --git a/templates/azure/ansible/test/meta.erb b/templates/azure/ansible/test/meta.erb new file mode 100644 index 000000000000..48f5726d896a --- /dev/null +++ b/templates/azure/ansible/test/meta.erb @@ -0,0 +1,2 @@ +dependencies: + - setup_azure \ No newline at end of file From ae2aef3e463e96b441b6e01a809c8d3f91314ab1 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 31 May 2019 19:01:34 -0700 Subject: [PATCH 092/175] Fix line is too long error in example YAML for Ansible --- .../cloud/azure/azure_rm_batchaccount.py | 5 ++-- provider/ansible/documentation.rb | 2 +- .../azure/ansible/example/sub_template.rb | 1 + provider/azure/ansible/helpers.rb | 25 +++++++++++++++++++ templates/ansible/resource.erb | 4 +-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 6edca5545ae0..37b16997a8d0 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -50,9 +50,8 @@ description: - Existing storage account with which to associate the Batch Account. - It can be the storage account name which is in the same resource group. - - |- - It can be the storage account ID. e.g., - /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}. + - It can be the storage account ID. e.g., + /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}. - It can be a dict which contains C(name) and C(resource_group) of the storage account. key_vault_reference: description: diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index bea1779cf37e..be0f803273b7 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -95,7 +95,7 @@ def autogen_notice_contrib def resourceref_description(prop) [ "It can be the #{prop.resource_type_name} name which is in the same resource group.", - "It can be the #{prop.resource_type_name} ID. e.g.,\n#{prop.sample_value}.", + "It can be the #{prop.resource_type_name} ID. e.g., #{prop.sample_value}.", "It can be a dict which contains C(name) and C(resource_group) of the #{prop.resource_type_name}." ] end diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb index f49ad12da6d5..30cef5433ce3 100644 --- a/provider/azure/ansible/example/sub_template.rb +++ b/provider/azure/ansible/example/sub_template.rb @@ -15,6 +15,7 @@ def build_documentation_yaml_from_example(example) example.resource => example.properties.transform_keys(&:underscore) }) lines = yaml.split("\n") + lines = word_wrap_for_yaml(lines) lines('- ' + lines[0]) + indent(lines[1..-1], 2) end diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index d5639fe7f841..4232c46db946 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -35,6 +35,31 @@ def is_resource_group?(property) def always_has_value?(property) property.required || !property.default_value.nil? end + + def word_wrap_for_yaml(lines, width = 150) + wrapped = Array.new + lines.each do |line| + while line.length > width + striped = line.lstrip + spaces = line.length - striped.length + spaces += 2 if striped.start_with? '- ' + wb_index = -1 + wb_index_try = line.index(/[ \t@=,;]/) + while !wb_index_try.nil? && wb_index_try < width + wb_index = wb_index_try + wb_index_try = line.index(/[ \t@=,;]/, wb_index_try + 1) + end + break if wb_index == -1 + wb_char = line[wb_index] + cur_line = line[0..wb_index - 1] + cur_line += wb_char unless wb_char == ' ' + line = ' ' * spaces + line[wb_index + 1..-1] + wrapped << cur_line + end + wrapped << line + end + wrapped + end end end end diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index d657a1fb0e53..1d7ccc762320 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -37,7 +37,7 @@ short_description: <%= lines(object.description) -%> description: - Create, update and delete instance of Azure <%= object.name.titlecase -%>. -<%= to_yaml({ +<%= lines(word_wrap_for_yaml(to_yaml({ 'options' => [ input_properties.reject{|p| is_tags?(p)}.map{|p| documentation_for_property(p, object)}, { @@ -57,7 +57,7 @@ description: object.references.guides.map { |guide, link| "#{guide}: U(#{link})" } ].flatten.compact if object.references ) -})-%> +}).split("\n"))) -%> extends_documentation_fragment: - azure From ab0f8f258dce0c1261db44955a343df926c31dbf Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 3 Jun 2019 13:37:31 -0700 Subject: [PATCH 093/175] Use the customized yaml template to generate EXAMPLES for Ansible --- .../cloud/azure/azure_rm_batchaccount.py | 8 ++--- .../cloud/azure/azure_rm_batchaccount_info.py | 2 -- .../azure_rm_batchaccount/tasks/main.yml | 36 +++++++++---------- products/azbatchaccount/ansible.yaml | 10 ++++-- provider/ansible/documentation.rb | 5 +-- .../azure/ansible/example/sub_template.rb | 10 ++---- provider/azure/ansible/resource_override.rb | 11 ++++++ templates/ansible/facts.erb | 2 +- templates/ansible/resource.erb | 2 +- .../azure/ansible/example/example_yaml.erb | 2 +- .../azure/ansible/example/yaml_properties.erb | 2 +- 11 files changed, 46 insertions(+), 44 deletions(-) diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 37b16997a8d0..86c5e95db926 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -13,8 +13,6 @@ # This file is automatically generated by Magic Modules and manual # changes will be clobbered when the file is regenerated. # -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules # # ---------------------------------------------------------------------------- @@ -92,11 +90,11 @@ EXAMPLES = ''' - name: Create Batch Account azure_rm_batchaccount: - resource_group: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" - name: "<%= get_resource_name('batchAccounts', 'batch_account_name', 'ba') -%>" + resource_group: MyResGroup + name: mybatchaccount location: eastus auto_storage_account: - name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" + name: mystorageaccountname pool_allocation_mode: batch_service ''' diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py index f3fce84a1515..3974ba9eb235 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -13,8 +13,6 @@ # This file is automatically generated by Magic Modules and manual # changes will be clobbered when the file is regenerated. # -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules # # ---------------------------------------------------------------------------- diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml index d209b4ae87fc..6fcb153802ca 100644 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml +++ b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml @@ -8,8 +8,6 @@ # This file is automatically generated by Magic Modules and manual # changes will be clobbered when the file is regenerated. # -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules # # ---------------------------------------------------------------------------- - name: Prepare random number @@ -20,20 +18,19 @@ - name: Create Storage Account azure_rm_storageaccount: - resource_group: "{{ resource_group }}" - name: "{{ storage_account_name }}" - location: eastus - account_type: Standard_LRS + resource_group: "{{ resource_group }}" + name: "{{ storage_account_name }}" + location: eastus + account_type: Standard_LRS - name: Create Batch Account azure_rm_batchaccount: - resource_group: "{{ resource_group }}" - name: "{{ batch_account_name }}" - location: eastus - auto_storage_account: - name: "{{ storage_account_name }}" - pool_allocation_mode: batch_service - register: output + resource_group: "{{ resource_group }}" + name: "{{ batch_account_name }}" + location: eastus + auto_storage_account: + name: "{{ storage_account_name }}" + pool_allocation_mode: batch_service register: output - name: Assert the resource was created assert: @@ -42,13 +39,12 @@ - name: Create Batch Account -- idempotent azure_rm_batchaccount: - resource_group: "{{ resource_group }}" - name: "{{ batch_account_name }}" - location: eastus - auto_storage_account: - name: "{{ storage_account_name }}" - pool_allocation_mode: batch_service - register: output + resource_group: "{{ resource_group }}" + name: "{{ batch_account_name }}" + location: eastus + auto_storage_account: + name: "{{ storage_account_name }}" + pool_allocation_mode: batch_service register: output - name: Assert the resource was created assert: diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 20938c273a7b..0fb050fe9b7e 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -16,9 +16,9 @@ datasources: !ruby/object:Provider::ResourceOverrides name: !ruby/object:Provider::Ansible::PropertyOverride required: false examples: - - !ruby/object:Provider::Azure::ExampleReference + - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference example: infoget - - !ruby/object:Provider::Azure::ExampleReference + - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference example: infolist overrides: !ruby/object:Provider::ResourceOverrides BatchAccount: !ruby/object:Provider::Azure::Ansible::ResourceOverride @@ -27,8 +27,12 @@ overrides: !ruby/object:Provider::ResourceOverrides name: autoStorageAccount description: Existing storage account with which to associate the Batch Account. examples: - - !ruby/object:Provider::Azure::ExampleReference + - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference example: basic + resource_name_hints: + resourceGroups: MyResGroup + storageAccounts: mystorageaccountname + batchAccounts: mybatchaccount inttests: - !ruby/object:Provider::Azure::Ansible::ResourceOverride::IntegrationTestDefinition example: basic \ No newline at end of file diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index be0f803273b7..b619977289fa 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -88,8 +88,9 @@ def returns_for_property(prop, object) end def autogen_notice_contrib - ['Please read more about how to change this file at', - 'https://www.github.com/GoogleCloudPlatform/magic-modules'] + [] + # ['Please read more about how to change this file at', + # 'https://www.github.com/GoogleCloudPlatform/magic-modules'] end def resourceref_description(prop) diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb index 30cef5433ce3..c140ea86a6ae 100644 --- a/provider/azure/ansible/example/sub_template.rb +++ b/provider/azure/ansible/example/sub_template.rb @@ -10,13 +10,7 @@ def build_test_yaml_from_example(example, with_dependencies = true, name_postfix end def build_documentation_yaml_from_example(example) - yaml = to_yaml({ - 'name' => example.description, - example.resource => example.properties.transform_keys(&:underscore) - }) - lines = yaml.split("\n") - lines = word_wrap_for_yaml(lines) - lines('- ' + lines[0]) + indent(lines[1..-1], 2) + build_yaml_from_example(nil, example.example, Set.new, nil, example.resource_name_hints, nil, false) end def build_yaml_from_example(product_name, example_name, random_variables, name_postfix, name_hints, register_name, with_dependencies) @@ -49,7 +43,7 @@ def get_binding() end def get_resource_name(name_hint, random_var_name, random_var_prefix = '') - return name_hints[name_hint] if name_hints.has_key?(name_hint) + return "#{name_hints[name_hint]}\n" if name_hints.has_key?(name_hint) @random_variables << RandomizedVariable.new(:Standard, random_var_name, random_var_prefix) "\"{{ #{random_var_name} }}\"\n" end diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index 5e80623a4a3f..c3f8033d8f45 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -1,4 +1,5 @@ require 'provider/ansible/resource_override' +require 'provider/azure/example/example' module Provider module Azure @@ -28,6 +29,16 @@ def validate end end + class DocumentExampleReference < ExampleReference + attr_reader :resource_name_hints + + def validate + super + check_optional_property :resource_name_hints, Hash + check_optional_property_hash :resource_name_hints, String, String + end + end + private def overriden diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index c96c7d96edd8..73f651905516 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -50,7 +50,7 @@ author: ''' <% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(get_example_by_reference(exref)))} -%> +<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(exref))} -%> EXAMPLES = ''' <%= lines(indent(code.join("\n"), 2)) -%> ''' diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 1d7ccc762320..c37d0ae844dd 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -68,7 +68,7 @@ author: ''' <% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(get_example_by_reference(exref)))} -%> +<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(exref))} -%> EXAMPLES = ''' <%= lines(indent(code.join("\n"), 2)) -%> ''' diff --git a/templates/azure/ansible/example/example_yaml.erb b/templates/azure/ansible/example/example_yaml.erb index 582d583cd126..b5e2cf42e3dd 100644 --- a/templates/azure/ansible/example/example_yaml.erb +++ b/templates/azure/ansible/example/example_yaml.erb @@ -5,5 +5,5 @@ <% end -%> - name: <%= lines(example.description + (!name_postfix.nil? && !name_postfix.empty? ? " -- #{name_postfix}" : '')) -%> <%= example.resource -%>: -<%= lines(build_yaml_properties(example.properties, 4)) -%> +<%= indent lines(build_yaml_properties(example.properties, 2)), 4 -%> <%= " register: #{register_name}" unless register_name.nil? || register_name.empty? -%> \ No newline at end of file diff --git a/templates/azure/ansible/example/yaml_properties.erb b/templates/azure/ansible/example/yaml_properties.erb index 2b8a9f03de3d..b6f4562b33f5 100644 --- a/templates/azure/ansible/example/yaml_properties.erb +++ b/templates/azure/ansible/example/yaml_properties.erb @@ -1,7 +1,7 @@ <% properties.each do |name, value| -%> <% if value.is_a?(Hash) -%> <%= name.underscore -%>: -<%= lines(build_yaml_properties(value)) -%> +<%= lines(build_yaml_properties(value, indentation)) -%> <% elsif value.is_a?(String) || value.is_a?(Integer) || value.is_a?(TrueClass) || value.is_a?(FalseClass) -%> <%= name.underscore -%>: <%= lines(value) -%> <% else -%> From 6e57118e3ff0e8ab78afff6a10b31fcbd6b3b84b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 3 Jun 2019 16:06:56 -0700 Subject: [PATCH 094/175] Calculate keyvault URL from keyvault ID for Ansible batch account --- .../cloud/azure/azure_rm_batchaccount.py | 50 ++++++++----------- .../cloud/azure/azure_rm_batchaccount_info.py | 20 ++------ products/azbatchaccount/ansible.yaml | 7 +++ .../ansible_keyvault_normalize.erb | 8 +++ provider/azure/ansible.rb | 1 + provider/azure/ansible/helpers.rb | 12 +++++ provider/azure/ansible/property_override.rb | 30 +++++++++++ provider/azure/ansible/sdk/sub_template.rb | 3 +- 8 files changed, 85 insertions(+), 46 deletions(-) create mode 100644 products/azbatchaccount/ansible_keyvault_normalize.erb create mode 100644 provider/azure/ansible/property_override.rb diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py index 86c5e95db926..73cc47ec60cd 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py @@ -48,21 +48,16 @@ description: - Existing storage account with which to associate the Batch Account. - It can be the storage account name which is in the same resource group. - - It can be the storage account ID. e.g., - /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}. + - "It can be the storage account ID. e.g., + /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}." - It can be a dict which contains C(name) and C(resource_group) of the storage account. - key_vault_reference: + key_vault: description: - - A reference to the Azure key vault associated with the Batch account. - suboptions: - id: - description: - - The resource ID of the Azure key vault associated with the Batch account. - required: true - url: - description: - - The URL of the Azure key vault associated with the Batch account. - required: true + - Existing key vault with which to associate the Batch Account. + - It can be the key vault name which is in the same resource group. + - "It can be the key vault ID. e.g., + /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}." + - It can be a dict which contains C(name) and C(resource_group) of the key vault. pool_allocation_mode: description: - The pool acclocation mode of the Batch Account. @@ -154,24 +149,10 @@ def __init__(self): auto_storage_account=dict( type='raw' ), - key_vault_reference=dict( - type='dict', + key_vault=dict( + type='raw', updatable=False, - disposition='/', - options=dict( - id=dict( - required=True, - type='str', - updatable=False, - disposition='/' - ), - url=dict( - required=True, - type='str', - updatable=False, - disposition='/' - ) - ) + disposition='/' ), pool_allocation_mode=dict( default='batch_service', @@ -219,6 +200,15 @@ def exec_module(self, **kwargs): self.batch_account.pop('auto_storage_account'), '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}') } + if self.batch_account.get('key_vault') is not None: + id = self.normalize_resource_id( + self.batch_account.pop('key_vault'), + '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}') + url = 'https://' + id.split('/').pop() + '.vault.azure.net/' + self.batch_account['key_vault_reference'] = { + 'id': id, + 'url': url + } self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) response = None diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py index 3974ba9eb235..9e3598b18b9e 100644 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py @@ -100,22 +100,12 @@ returned: always type: str sample: "/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}" - key_vault_reference: + key_vault: description: - - A reference to the Azure key vault associated with the Batch account. + - Existing key vault with which to associate the Batch Account. returned: always - type: complex - contains: - id: - description: - - The resource ID of the Azure key vault associated with the Batch account. - returned: always - type: str - url: - description: - - The URL of the Azure key vault associated with the Batch account. - returned: always - type: str + type: str + sample: "/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}" pool_allocation_mode: description: - The pool acclocation mode of the Batch Account. @@ -216,7 +206,7 @@ def format_response(self, item): 'location': d['location'], 'account_endpoint': d['account_endpoint'], 'auto_storage_account': d['auto_storage']['storage_account_id'], - 'key_vault_reference': d['key_vault_reference'], + 'key_vault': d['key_vault_reference'], 'pool_allocation_mode': d['pool_allocation_mode'], 'tags': d['tags'], } diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml index 0fb050fe9b7e..d68a283ab111 100644 --- a/products/azbatchaccount/ansible.yaml +++ b/products/azbatchaccount/ansible.yaml @@ -26,6 +26,13 @@ overrides: !ruby/object:Provider::ResourceOverrides autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride name: autoStorageAccount description: Existing storage account with which to associate the Batch Account. + keyVaultReference: !ruby/object:Provider::Azure::Ansible::PropertyOverride + name: keyVault + description: Existing key vault with which to associate the Batch Account. + new_type: Api::Azure::Type::ResourceReference + resource_type_name: key vault + sample_value: '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}' + custom_normalize: products/azbatchaccount/ansible_keyvault_normalize.erb examples: - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference example: basic diff --git a/products/azbatchaccount/ansible_keyvault_normalize.erb b/products/azbatchaccount/ansible_keyvault_normalize.erb new file mode 100644 index 000000000000..ac3b7688dc0b --- /dev/null +++ b/products/azbatchaccount/ansible_keyvault_normalize.erb @@ -0,0 +1,8 @@ +id = self.normalize_resource_id( + self.batch_account.pop('key_vault'), + '<%= norm_desc.property.sample_value -%>') +url = 'https://' + id.split('/').pop() + '.vault.azure.net/' +self.batch_account['key_vault_reference'] = { + 'id': id, + 'url': url +} \ No newline at end of file diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index 7ec3f583c383..fab864517611 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -8,6 +8,7 @@ require 'provider/azure/ansible/example/sub_template' require 'provider/azure/ansible/resource_override' +require 'provider/azure/ansible/property_override' module Provider module Azure diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index 4232c46db946..bc8ee82ac827 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -39,10 +39,20 @@ def always_has_value?(property) def word_wrap_for_yaml(lines, width = 150) wrapped = Array.new lines.each do |line| + quoted = false while line.length > width + # Calculate leading spaces for the following lines striped = line.lstrip spaces = line.length - striped.length spaces += 2 if striped.start_with? '- ' + + # Quote the whole line using quotation mark if not quoted + unless quoted + line = line[0..spaces - 1] + '"' + line[spaces..-1] + '"' if line[spaces] != '"' + quoted = true + end + + # Find the last possible word-break character wb_index = -1 wb_index_try = line.index(/[ \t@=,;]/) while !wb_index_try.nil? && wb_index_try < width @@ -50,6 +60,8 @@ def word_wrap_for_yaml(lines, width = 150) wb_index_try = line.index(/[ \t@=,;]/, wb_index_try + 1) end break if wb_index == -1 + + # Break this line into two wb_char = line[wb_index] cur_line = line[0..wb_index - 1] cur_line += wb_char unless wb_char == ' ' diff --git a/provider/azure/ansible/property_override.rb b/provider/azure/ansible/property_override.rb new file mode 100644 index 000000000000..813442836bac --- /dev/null +++ b/provider/azure/ansible/property_override.rb @@ -0,0 +1,30 @@ +require 'provider/ansible/property_override' + +module Provider + module Azure + module Ansible + module OverrideFields + attr_reader :resource_type_name + attr_reader :custom_normalize + include Provider::Ansible::OverrideFields + end + + class PropertyOverride < Provider::Ansible::PropertyOverride + include Provider::Azure::Ansible::OverrideFields + + def validate + super + check_optional_property :resource_type_name, String + check_optional_property :custom_normalize, String + end + + private + + def overriden + Provider::Azure::Ansible::OverrideFields + end + + end + end + end +end diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index f6cf732d6017..3ac4b47bed8e 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -9,7 +9,8 @@ def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) end def build_property_normalization(norm_desc, in_structure, indentation = 4) - result = compile 'templates/azure/ansible/sdktypes/property_normalization.erb', 1 + template = norm_desc.property.custom_normalize || 'templates/azure/ansible/sdktypes/property_normalization.erb' + result = compile template, 1 indent result, indentation end From ccf00ab98c4d4730393fa9b1d071731a2224e019 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 3 Jun 2019 17:33:56 -0700 Subject: [PATCH 095/175] Move batch account to mm-spec repo. --- products/azbatchaccount/ansible.yaml | 45 --- .../ansible_keyvault_normalize.erb | 8 - products/azbatchaccount/api.yaml | 306 ------------------ .../examples/ansible/basic.yaml | 14 - .../examples/ansible/infoget.yaml | 6 - .../examples/ansible/infolist.yaml | 5 - .../examples/terraform/basic.yaml | 15 - products/azbatchaccount/terraform.yaml | 43 --- .../terraform_extra_functions.erb | 16 - .../terraform_storage_id_assign.erb | 13 - provider/ansible/config.rb | 1 + provider/azure/ansible/sdk/sub_template.rb | 3 +- provider/azure/core.rb | 11 +- provider/config.rb | 1 + provider/terraform/config.rb | 2 + templates/terraform/resource.erb | 2 +- 16 files changed, 16 insertions(+), 475 deletions(-) delete mode 100644 products/azbatchaccount/ansible.yaml delete mode 100644 products/azbatchaccount/ansible_keyvault_normalize.erb delete mode 100644 products/azbatchaccount/api.yaml delete mode 100644 products/azbatchaccount/examples/ansible/basic.yaml delete mode 100644 products/azbatchaccount/examples/ansible/infoget.yaml delete mode 100644 products/azbatchaccount/examples/ansible/infolist.yaml delete mode 100644 products/azbatchaccount/examples/terraform/basic.yaml delete mode 100644 products/azbatchaccount/terraform.yaml delete mode 100644 products/azbatchaccount/terraform_extra_functions.erb delete mode 100644 products/azbatchaccount/terraform_storage_id_assign.erb diff --git a/products/azbatchaccount/ansible.yaml b/products/azbatchaccount/ansible.yaml deleted file mode 100644 index d68a283ab111..000000000000 --- a/products/azbatchaccount/ansible.yaml +++ /dev/null @@ -1,45 +0,0 @@ ---- !ruby/object:Provider::Ansible::Config -manifest: !ruby/object:Provider::Ansible::Manifest - metadata_version: '1.1' - status: - - preview - supported_by: 'community' - requirements: - - python >= 2.6 - - requests >= 2.18.4 - version_added: '2.9' - author: Junyi Yi (@JunyiYi) -datasources: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Azure::Ansible::ResourceOverride - version_added: '2.9' - properties: - name: !ruby/object:Provider::Ansible::PropertyOverride - required: false - examples: - - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference - example: infoget - - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference - example: infolist -overrides: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Azure::Ansible::ResourceOverride - properties: - autoStorageAccountId: !ruby/object:Provider::Ansible::PropertyOverride - name: autoStorageAccount - description: Existing storage account with which to associate the Batch Account. - keyVaultReference: !ruby/object:Provider::Azure::Ansible::PropertyOverride - name: keyVault - description: Existing key vault with which to associate the Batch Account. - new_type: Api::Azure::Type::ResourceReference - resource_type_name: key vault - sample_value: '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}' - custom_normalize: products/azbatchaccount/ansible_keyvault_normalize.erb - examples: - - !ruby/object:Provider::Azure::Ansible::ResourceOverride::DocumentExampleReference - example: basic - resource_name_hints: - resourceGroups: MyResGroup - storageAccounts: mystorageaccountname - batchAccounts: mybatchaccount - inttests: - - !ruby/object:Provider::Azure::Ansible::ResourceOverride::IntegrationTestDefinition - example: basic \ No newline at end of file diff --git a/products/azbatchaccount/ansible_keyvault_normalize.erb b/products/azbatchaccount/ansible_keyvault_normalize.erb deleted file mode 100644 index ac3b7688dc0b..000000000000 --- a/products/azbatchaccount/ansible_keyvault_normalize.erb +++ /dev/null @@ -1,8 +0,0 @@ -id = self.normalize_resource_id( - self.batch_account.pop('key_vault'), - '<%= norm_desc.property.sample_value -%>') -url = 'https://' + id.split('/').pop() + '.vault.azure.net/' -self.batch_account['key_vault_reference'] = { - 'id': id, - 'url': url -} \ No newline at end of file diff --git a/products/azbatchaccount/api.yaml b/products/azbatchaccount/api.yaml deleted file mode 100644 index daeab72dec84..000000000000 --- a/products/azbatchaccount/api.yaml +++ /dev/null @@ -1,306 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Batch Account -prefix: azbatchaccount -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: BatchAccount - api_name: Batch - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Batch - go_client_namespace: batch - go_client: batchAccountClient - python_client_namespace: azure.mgmt.batch - python_client: BatchManagementClient.batch_account - create: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: Create - python_func_name: create - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: batchAccounts - go_variable_name: name - python_parameter_name: account_name - python_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: AccountCreateParameters - python_parameter_name: parameters - python_variable_name: batch_account - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - python_field_name: location - '/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [python] - python_field_name: auto_storage - '/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: storage_account_id - '/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [python] - python_field_name: key_vault_reference - '/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: id - '/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: url - '/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [python] - python_field_name: pool_allocation_mode - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AccountCreateProperties - go_type_name: AccountCreateProperties - '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AutoStorage - go_type_name: AutoStorageBaseProperties - '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: StorageAccountID - '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: KeyVaultReference - go_type_name: KeyVaultReference - '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: ID - '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: URL - '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: PoolAllocationMode - go_enum_type_name: PoolAllocationMode - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject - go_field_name: Tags - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: batchAccounts - go_variable_name: name - python_parameter_name: account_name - python_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Account - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - python_field_name: id - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - python_field_name: name - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - python_field_name: location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AccountProperties - go_type_name: AccountProperties - go_variable_name: properties - '/properties/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: AccountEndpoint - '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AutoStorage - go_type_name: AutoStorageProperties - '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: StorageAccountID - '/properties/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: KeyVaultReference - go_type_name: KeyVaultReference - '/properties/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: ID - '/properties/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: URL - '/properties/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: PoolAllocationMode - go_enum_type_name: PoolAllocationMode - '/accountEndpoint': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: account_endpoint - '/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [python] - python_field_name: auto_storage - '/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: storage_account_id - '/keyVaultReference': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [python] - python_field_name: key_vault_reference - '/keyVaultReference/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: id - '/keyVaultReference/url': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: url - '/poolAllocationMode': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [python] - python_field_name: pool_allocation_mode - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject - go_field_name: Tags - update: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Update - python_func_name: update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: batchAccounts - go_variable_name: name - python_parameter_name: account_name - python_variable_name: name - 'tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_parameter_name: tags - python_variable_name: tags - 'autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [python] - python_parameter_name: auto_storage - python_variable_name: batch_account.get('auto_storage') - 'autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_variable_name: parameters - go_type_name: AccountUpdateParameters - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AccountUpdateProperties - go_type_name: AccountUpdateProperties - '/properties/autoStorage': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: AutoStorage - go_type_name: AutoStorageBaseProperties - '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: StorageAccountID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject - applicable_to: [go] - go_field_name: Tags - delete: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'accountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: batchAccounts - go_variable_name: name - python_parameter_name: account_name - python_variable_name: name - list_by_rg: !ruby/object:Api::Azure::SDKOperationDefinition - python_func_name: list_by_resource_group - go_func_name: ListByResourceGroup - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - python_parameter_name: resource_group_name - python_variable_name: resource_group - - - description: | - Manages a Batch Account on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: The name of the resource group in which to create the Batch Account. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - properties: - - !ruby/object:Api::Type::String - name: name - description: The name of the Batch Account. - required: true - input: true - azure_sdk_references: ['accountName', '/name'] - - !ruby/object:Api::Azure::Type::Location - name: location - description: Specifies the supported Azure location where the resource exists. - required: true - input: true - azure_sdk_references: ['/location'] - - !ruby/object:Api::Azure::Type::Tags - name: tags - description: A mapping of tags to assign to the batch account. - azure_sdk_references: ['tags', '/tags'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: autoStorageAccountId - description: The ID of the Batch Account auto storage account. - azure_sdk_references: ['/autoStorage/storageAccountId', '/properties/autoStorage/storageAccountId'] - resource_type_name: storage account - sample_value: '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}' - - !ruby/object:Api::Type::Enum - name: poolAllocationMode - description: The pool acclocation mode of the Batch Account. - input: true - values: - - :BatchService - - :UserSubscription - default_value: :BatchService - azure_sdk_references: ['/poolAllocationMode', '/properties/poolAllocationMode'] - - !ruby/object:Api::Type::NestedObject - name: keyVaultReference - description: A reference to the Azure key vault associated with the Batch account. - input: true - azure_sdk_references: ['/keyVaultReference', '/properties/keyVaultReference'] - properties: - - !ruby/object:Api::Type::String - name: id - description: The resource ID of the Azure key vault associated with the Batch account. - required: true - input: true - azure_sdk_references: ['/keyVaultReference/id', '/properties/keyVaultReference/id'] - - !ruby/object:Api::Type::String - name: url - description: The URL of the Azure key vault associated with the Batch account. - required: true - input: true - azure_sdk_references: ['/keyVaultReference/url', '/properties/keyVaultReference/url'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Batch account. - resource_type_name: batch account - output: true - azure_sdk_references: ['/id'] - sample_value: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct' - - !ruby/object:Api::Type::String - name: accountEndpoint - description: The account endpoint used to interact with the Batch service. - output: true - azure_sdk_references: ['/accountEndpoint', '/properties/accountEndpoint'] - sample_value: 'sampleacct.westus.batch.azure.com' diff --git a/products/azbatchaccount/examples/ansible/basic.yaml b/products/azbatchaccount/examples/ansible/basic.yaml deleted file mode 100644 index 4f0f72f3b698..000000000000 --- a/products/azbatchaccount/examples/ansible/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azure_rm_batchaccount -description: Create Batch Account -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azstorageaccount - example: basic -properties: - resourceGroup: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" - name: "<%= get_resource_name('batchAccounts', 'batch_account_name', 'ba') -%>" - location: eastus - autoStorageAccount: - name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" - poolAllocationMode: batch_service \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/infoget.yaml b/products/azbatchaccount/examples/ansible/infoget.yaml deleted file mode 100644 index ab739b887196..000000000000 --- a/products/azbatchaccount/examples/ansible/infoget.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azure_rm_batchaccount -description: Get instance of Batch Account -properties: - resourceGroup: MyResGroup - name: test_object \ No newline at end of file diff --git a/products/azbatchaccount/examples/ansible/infolist.yaml b/products/azbatchaccount/examples/ansible/infolist.yaml deleted file mode 100644 index 4fb02a308c00..000000000000 --- a/products/azbatchaccount/examples/ansible/infolist.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azure_rm_batchaccount -description: List instances of Batch Account -properties: - resourceGroup: MyResGroup \ No newline at end of file diff --git a/products/azbatchaccount/examples/terraform/basic.yaml b/products/azbatchaccount/examples/terraform/basic.yaml deleted file mode 100644 index a849b81666a3..000000000000 --- a/products/azbatchaccount/examples/terraform/basic.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_batch_account -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azstorageaccount - example: basic -properties: - name: "<%= get_resource_name('batchAccounts', 'batch') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} - poolAllocationMode: BatchService - storageAccountId: ${azurerm_storage_account.<%= resource_id_hint -%>.id} \ No newline at end of file diff --git a/products/azbatchaccount/terraform.yaml b/products/azbatchaccount/terraform.yaml deleted file mode 100644 index 60027b905918..000000000000 --- a/products/azbatchaccount/terraform.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azbatchaccount -overrides: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Azure::Terraform::ResourceOverride - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinitionOverride - create: !ruby/object:Api::Azure::SDKOperationDefinitionOverride - request: - '/properties/autoStorage/storageAccountId': !ruby/object:Api::Azure::SDKTypeDefinitionOverride - empty_value_sensitive: true - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validateAzureRMBatchAccountName - autoStorageAccountId: !ruby/object:Provider::Azure::Terraform::PropertyOverride - name: storageAccountId - validation: !ruby/object:Provider::Terraform::Validation - function: azure.ValidateResourceIDOrEmpty - custom_code: !ruby/object:Provider::Terraform::CustomCode - extra_functions: products/azbatchaccount/terraform_extra_functions.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: example-rg - storageAccounts: examplesa - batchAccounts: example-batch-account - location: West US -datasources: !ruby/object:Provider::ResourceOverrides - BatchAccount: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - description: The Name of the Resource Group where the App Service exists. - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - datasource_example_outputs: - batch_id: id \ No newline at end of file diff --git a/products/azbatchaccount/terraform_extra_functions.erb b/products/azbatchaccount/terraform_extra_functions.erb deleted file mode 100644 index 8bff975c6d7f..000000000000 --- a/products/azbatchaccount/terraform_extra_functions.erb +++ /dev/null @@ -1,16 +0,0 @@ -func validateAzureRMBatchAccountName(v interface{}, k string) (warnings []string, errors []error) { - value := v.(string) - if !regexp.MustCompile(`^[a-z0-9]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf("lowercase letters and numbers only are allowed in %q: %q", k, value)) - } - - if 3 > len(value) { - errors = append(errors, fmt.Errorf("%q cannot be less than 3 characters: %q", k, value)) - } - - if len(value) > 24 { - errors = append(errors, fmt.Errorf("%q cannot be longer than 24 characters: %q %d", k, value, len(value))) - } - - return warnings, errors -} \ No newline at end of file diff --git a/products/azbatchaccount/terraform_storage_id_assign.erb b/products/azbatchaccount/terraform_storage_id_assign.erb deleted file mode 100644 index 7997e4a32891..000000000000 --- a/products/azbatchaccount/terraform_storage_id_assign.erb +++ /dev/null @@ -1,13 +0,0 @@ -<% if sdk_type_defs == object.azure_sdk_definition.create.request -%> -if storageAccountId != "" { - parameters.AccountCreateProperties.AutoStorage = &batch.AutoStorageBaseProperties{ - StorageAccountID: &storageAccountId, - } -} -<% elsif sdk_type_defs == object.azure_sdk_definition.update.request -%> -parameters.AccountUpdateProperties = &batch.AccountUpdateProperties{ - AutoStorage: &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(storageAccountId), - }, -} -<% end -%> \ No newline at end of file diff --git a/provider/ansible/config.rb b/provider/ansible/config.rb index 0530d37968b4..7f4037f4b8b8 100644 --- a/provider/ansible/config.rb +++ b/provider/ansible/config.rb @@ -18,6 +18,7 @@ module Provider module Ansible # Settings for the Ansible provider class Config < Provider::Config + attr_accessor :cfg_file attr_reader :manifest def provider diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index 3ac4b47bed8e..c9e00538fffa 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -9,7 +9,8 @@ def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) end def build_property_normalization(norm_desc, in_structure, indentation = 4) - template = norm_desc.property.custom_normalize || 'templates/azure/ansible/sdktypes/property_normalization.erb' + template = get_custom_template_path(norm_desc.property.custom_normalize) + template ||= 'templates/azure/ansible/sdktypes/property_normalization.erb' result = compile template, 1 indent result, indentation end diff --git a/provider/azure/core.rb b/provider/azure/core.rb index b68112db9900..3cbe79820afc 100644 --- a/provider/azure/core.rb +++ b/provider/azure/core.rb @@ -8,13 +8,20 @@ def get_example_by_reference(reference) end def get_example_by_names(example_name, product_name = nil) - product_name ||= @api.prefix - example_yaml = "products/#{product_name}/examples/#{@provider}/#{example_name}.yaml" + spec_dir = File.dirname(@config.cfg_file) + product_name ||= File.basename(spec_dir) + example_yaml = File.join(File.dirname(spec_dir), product_name, 'examples', @provider, "#{example_name}.yaml") example = Google::YamlValidator.parse(File.read(example_yaml)) raise "#{example_yaml}(#{example.class}) is not Provider::Azure::Example" unless example.is_a?(Provider::Azure::Example) example.validate example end + + def get_custom_template_path(template_path) + return nil if template_path.nil? + spec_dir = File.dirname(@config.cfg_file) + File.join(spec_dir, template_path) + end end end end diff --git a/provider/config.rb b/provider/config.rb index 39c0515e4e5d..f1a01d2b9f1c 100644 --- a/provider/config.rb +++ b/provider/config.rb @@ -91,6 +91,7 @@ def self.parse(cfg_file, api = nil, _version_name = nil) config.default_overrides config.spread_api config, api, [], '' unless api.nil? config.validate + config.cfg_file = cfg_file config end diff --git a/provider/terraform/config.rb b/provider/terraform/config.rb index 30d0f390817f..e4c84037d315 100644 --- a/provider/terraform/config.rb +++ b/provider/terraform/config.rb @@ -18,6 +18,8 @@ module Provider class Terraform < Provider::AbstractCore # Settings for the provider class Config < Provider::Config + attr_accessor :cfg_file + def provider Provider::Terraform end diff --git a/templates/terraform/resource.erb b/templates/terraform/resource.erb index e82c82231513..20d519c6cb7b 100644 --- a/templates/terraform/resource.erb +++ b/templates/terraform/resource.erb @@ -291,5 +291,5 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% end -%> <% if object.custom_code.extra_functions -%> -<%= lines(compile(object.custom_code.extra_functions)) -%> +<%= lines(compile(get_custom_template_path(object.custom_code.extra_functions))) -%> <% end -%> \ No newline at end of file From 7751190e2cbd192a383c178de1be5b81e034b3d2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 3 Jun 2019 19:03:27 -0700 Subject: [PATCH 096/175] Regenerate batch account for Terraform. --- build/azterraform/azurerm/data_source_batch_account.go | 1 - build/azterraform/azurerm/data_source_batch_account_test.go | 2 +- build/azterraform/azurerm/resource_arm_batch_account_test.go | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/build/azterraform/azurerm/data_source_batch_account.go b/build/azterraform/azurerm/data_source_batch_account.go index 09b105a3d63e..c6734bcd0474 100644 --- a/build/azterraform/azurerm/data_source_batch_account.go +++ b/build/azterraform/azurerm/data_source_batch_account.go @@ -23,7 +23,6 @@ func dataSourceArmBatchAccount() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ForceNew: true, ValidateFunc: validateAzureRMBatchAccountName, }, diff --git a/build/azterraform/azurerm/data_source_batch_account_test.go b/build/azterraform/azurerm/data_source_batch_account_test.go index b292f9d0f574..9e354533561f 100644 --- a/build/azterraform/azurerm/data_source_batch_account_test.go +++ b/build/azterraform/azurerm/data_source_batch_account_test.go @@ -43,7 +43,7 @@ func TestAccDataSourceAzureRMBatchAccount_basic(t *testing.T) { } func testAccDataSourceBatchAccount_basic(rInt int, location string) string { - config := testAccBatchAccount_basic(rInt, location) + config := testAccAzureRMBatchAccount_basic(rInt, location) return fmt.Sprintf(` %s diff --git a/build/azterraform/azurerm/resource_arm_batch_account_test.go b/build/azterraform/azurerm/resource_arm_batch_account_test.go index 2822da44d66b..75548f2636f4 100644 --- a/build/azterraform/azurerm/resource_arm_batch_account_test.go +++ b/build/azterraform/azurerm/resource_arm_batch_account_test.go @@ -38,8 +38,8 @@ func TestAccAzureRMBatchAccount_basic(t *testing.T) { Config: testAccAzureRMBatchAccount_basic(ri, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMBatchAccountExists(resourceName), - resource.TestCheckResourceAttr(dataSourceName, "poolAllocationMode", "BatchService"), - resource.TestCheckResourceAttrSet(dataSourceName, "storageAccountId"), + resource.TestCheckResourceAttr(resourceName, "poolAllocationMode", "BatchService"), + resource.TestCheckResourceAttrSet(resourceName, "storageAccountId"), ), }, { From 988395e92add4e57c56f4997d1ff43f17b537eef Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 6 Jun 2019 14:43:59 -0700 Subject: [PATCH 097/175] Add delete step to Ansible inttest. --- provider/azure/ansible/example/sub_template.rb | 16 ++++++++++------ provider/azure/ansible/resource_override.rb | 3 +++ templates/ansible/integration_test.erb | 16 +++++++++++++--- .../azure/ansible/example/example_deps_yaml.erb | 5 +++++ templates/azure/ansible/example/example_yaml.erb | 9 ++------- 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 templates/azure/ansible/example/example_deps_yaml.erb diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb index c140ea86a6ae..f734eb1287f8 100644 --- a/provider/azure/ansible/example/sub_template.rb +++ b/provider/azure/ansible/example/sub_template.rb @@ -3,21 +3,25 @@ module Azure module Ansible module Example module SubTemplate - def build_test_yaml_from_example(example, with_dependencies = true, name_postfix = nil, register_name = 'output') + def build_test_yaml_from_example(example_name, name_postfix = nil, register_name = 'output') random_vars = Set.new - yaml = build_yaml_from_example(nil, example.example, random_vars, name_postfix, {}, register_name, with_dependencies) - return yaml, random_vars + deps, main = build_yaml_from_example(nil, example_name, random_vars, name_postfix, {}, register_name) + return deps, main, random_vars end def build_documentation_yaml_from_example(example) - build_yaml_from_example(nil, example.example, Set.new, nil, example.resource_name_hints, nil, false) + _, main = build_yaml_from_example(nil, example.example, Set.new, nil, example.resource_name_hints, nil) + return main end - def build_yaml_from_example(product_name, example_name, random_variables, name_postfix, name_hints, register_name, with_dependencies) + def build_yaml_from_example(product_name, example_name, random_variables, name_postfix, name_hints, register_name) example = get_example_by_names(example_name, product_name) + yaml_deps = compile 'templates/azure/ansible/example/example_deps_yaml.erb', 1 yaml_raw = compile 'templates/azure/ansible/example/example_yaml.erb', 1 context = ExampleContextBinding.new(name_hints, random_variables) - compile_string context.get_binding, yaml_raw + yaml_deps = compile_string context.get_binding, yaml_deps + yaml_raw = compile_string context.get_binding, yaml_raw + return yaml_deps, yaml_raw end def build_yaml_properties(properties, indentation = 2) diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index c3f8033d8f45..338dded7ce98 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -24,8 +24,11 @@ def validate end class IntegrationTestDefinition < ExampleReference + attr_reader :delete_example + def validate super + check_property :delete_example, String end end diff --git a/templates/ansible/integration_test.erb b/templates/ansible/integration_test.erb index 83cd5104bb2f..c7971057b89e 100644 --- a/templates/ansible/integration_test.erb +++ b/templates/ansible/integration_test.erb @@ -1,12 +1,13 @@ --- <%= lines(autogen_notice :yaml) -%> -<% yaml, random_vars = build_test_yaml_from_example(object.inttests[0]) -%> +<% deps_yaml, yaml, random_vars = build_test_yaml_from_example(object.inttests[0].example) -%> - name: Prepare random number set_fact: <% random_vars.reject{|v| v.variable_name == 'resource_group'}.each do |rnd| -%> <%= rnd.variable_name -%>: "<%= rnd.variable_value -%>" <% end -%> run_once: yes +<%= lines(deps_yaml) -%> <%= lines(yaml) -%> @@ -15,10 +16,19 @@ that: - output.changed -<% same_yaml, _ = build_test_yaml_from_example(object.inttests[0], false, 'idempotent') -%> +<% _, same_yaml, _ = build_test_yaml_from_example(object.inttests[0].example, 'idempotent') -%> <%= lines(same_yaml) -%> - name: Assert the resource was created assert: that: - - not output.changed \ No newline at end of file + - not output.changed + +<% deps_yaml, delete_yaml, _ = build_test_yaml_from_example(object.inttests[0].delete_example) -%> +<%= lines(delete_yaml) -%> + +- name: Assert that state has changed + assert: + that: + - output.changed +<%= lines(deps_yaml) -%> \ No newline at end of file diff --git a/templates/azure/ansible/example/example_deps_yaml.erb b/templates/azure/ansible/example/example_deps_yaml.erb new file mode 100644 index 000000000000..a2abe3d684e0 --- /dev/null +++ b/templates/azure/ansible/example/example_deps_yaml.erb @@ -0,0 +1,5 @@ +<% if !example.prerequisites.nil? -%> +<% example.prerequisites.each do |pre_ex| -%> +<%= lines(build_yaml_from_example(pre_ex.product, pre_ex.example, random_variables, nil, name_hints, nil), 1) -%> +<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/ansible/example/example_yaml.erb b/templates/azure/ansible/example/example_yaml.erb index b5e2cf42e3dd..11bf64be285b 100644 --- a/templates/azure/ansible/example/example_yaml.erb +++ b/templates/azure/ansible/example/example_yaml.erb @@ -1,9 +1,4 @@ -<% if with_dependencies && !example.prerequisites.nil? -%> -<% example.prerequisites.each do |pre_ex| -%> -<%= lines(build_yaml_from_example(pre_ex.product, pre_ex.example, random_variables, nil, name_hints, nil, false), 1) -%> -<% end -%> -<% end -%> - name: <%= lines(example.description + (!name_postfix.nil? && !name_postfix.empty? ? " -- #{name_postfix}" : '')) -%> <%= example.resource -%>: -<%= indent lines(build_yaml_properties(example.properties, 2)), 4 -%> -<%= " register: #{register_name}" unless register_name.nil? || register_name.empty? -%> \ No newline at end of file +<%= lines(indent lines(build_yaml_properties(example.properties, 2)), 4) -%> +<%= lines(" register: #{register_name}") unless register_name.nil? || register_name.empty? -%> \ No newline at end of file From 06577a9495c5e35aa064c76916b62df32546ba98 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 12 Jun 2019 17:19:48 -0700 Subject: [PATCH 098/175] Remove type restriction on sample_value. --- api/type.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/type.rb b/api/type.rb index e4b033ccbef9..afd222e37da3 100644 --- a/api/type.rb +++ b/api/type.rb @@ -76,8 +76,6 @@ def validate check_optional_property :order, ::Integer @order ||= 750 - check_optional_property :sample_value, ::String - @azure_sdk_references ||= [] check_property :azure_sdk_references, ::Array From 143f50935c8c179f757ed8f31c12022633e243b5 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 13 Jun 2019 16:18:03 -0700 Subject: [PATCH 099/175] Fix test and order bugs in Ansible and Terraform --- provider/azure/terraform/helpers.rb | 6 +++--- templates/ansible/integration_test.erb | 2 ++ templates/ansible/resource.erb | 2 +- templates/azure/ansible/example/example_deps_yaml.erb | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index 7298ab650329..678af9b29684 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -8,9 +8,9 @@ def get_property_value(obj, prop_name, default_value) end def order_azure_properties(properties) - special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} - other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName'} - special_props + order_properties(other_props) + special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup'} + other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup'} + special_props.sort_by(&:order) + order_properties(other_props) end end end diff --git a/templates/ansible/integration_test.erb b/templates/ansible/integration_test.erb index c7971057b89e..8923934a3de7 100644 --- a/templates/ansible/integration_test.erb +++ b/templates/ansible/integration_test.erb @@ -7,6 +7,7 @@ <%= rnd.variable_name -%>: "<%= rnd.variable_value -%>" <% end -%> run_once: yes + <%= lines(deps_yaml) -%> <%= lines(yaml) -%> @@ -31,4 +32,5 @@ assert: that: - output.changed + <%= lines(deps_yaml) -%> \ No newline at end of file diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index c37d0ae844dd..96da4da62111 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -79,7 +79,7 @@ RETURN = ''' ''' import time -from ansible.module_utils.azure_rm_common import <%= lines('normalize_location_name') if is_location_defined?(object) -%> +<%= lines('from ansible.module_utils.azure_rm_common import normalize_location_name') if is_location_defined?(object) -%> from ansible.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt from ansible.module_utils.common.dict_transformations import _snake_to_camel diff --git a/templates/azure/ansible/example/example_deps_yaml.erb b/templates/azure/ansible/example/example_deps_yaml.erb index a2abe3d684e0..a2855da5714e 100644 --- a/templates/azure/ansible/example/example_deps_yaml.erb +++ b/templates/azure/ansible/example/example_deps_yaml.erb @@ -1,5 +1,6 @@ <% if !example.prerequisites.nil? -%> <% example.prerequisites.each do |pre_ex| -%> -<%= lines(build_yaml_from_example(pre_ex.product, pre_ex.example, random_variables, nil, name_hints, nil), 1) -%> +<% _, yml = build_yaml_from_example(pre_ex.product, pre_ex.example, random_variables, nil, name_hints, nil) -%> +<%= lines(yml, 1) -%> <% end -%> <% end -%> \ No newline at end of file From 1aae5fdd609590da89dc0a6ebcafb9ac1687d09c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 13 Jun 2019 16:37:56 -0700 Subject: [PATCH 100/175] Support inline response format customization for Ansible --- provider/azure/ansible/property_override.rb | 2 ++ provider/azure/ansible/sdk/sub_template.rb | 7 +++++++ templates/ansible/facts.erb | 16 +--------------- .../sdktypes/property_inline_response_format.erb | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 templates/azure/ansible/sdktypes/property_inline_response_format.erb diff --git a/provider/azure/ansible/property_override.rb b/provider/azure/ansible/property_override.rb index 813442836bac..1a9736db5d82 100644 --- a/provider/azure/ansible/property_override.rb +++ b/provider/azure/ansible/property_override.rb @@ -6,6 +6,7 @@ module Ansible module OverrideFields attr_reader :resource_type_name attr_reader :custom_normalize + attr_reader :inline_custom_response_format include Provider::Ansible::OverrideFields end @@ -16,6 +17,7 @@ def validate super check_optional_property :resource_type_name, String check_optional_property :custom_normalize, String + check_optional_property :inline_custom_response_format, String end private diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index c9e00538fffa..eaf34f2baf2c 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -19,6 +19,13 @@ def build_property_to_sdk_object(sdk_marshal, indentation = 0) result = compile 'templates/azure/ansible/sdktypes/property_to_sdkobject.erb', 1 indent result, indentation end + + def build_property_inline_response_format(property, sdk_operation, indentation = 12) + template = get_custom_template_path(property.inline_custom_response_format) + template ||= 'templates/azure/ansible/sdktypes/property_inline_response_format.erb' + result = compile template, 1 + indent result, indentation + end end end end diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 73f651905516..71afca6f2d53 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -91,7 +91,6 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): ) self.mgmt_client = None <%= lines(build_class_instance_variable_init(object.azure_sdk_definition.read, object)) -%> -<%= lines(indent('self.tags = None', 8)) if is_tags_defined?(object) -%> super(AzureRM<%= object.name -%>Info, self).__init__(self.module_arg_spec, supports_tags=False) def exec_module(self, **kwargs): @@ -153,20 +152,7 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): d = item.as_dict() d = { <% output_properties.each do |prop| -%> -<% py_var = python_variable_name(prop, object.azure_sdk_definition.create) -%> -<% py_fields = [] -%> -<% sdk_ref = get_applicable_reference(prop.azure_sdk_references, sdk_operation.response) -%> -<% unless sdk_ref.nil? -%> -<% sdk_refs = sdk_ref.split('/').reject(&:empty?) -%> -<% sdk_ref = '' -%> -<% sdk_refs.each do |ref| -%> -<% sdk_ref += '/' + ref -%> -<% sdk_type_def = sdk_operation.response[sdk_ref] -%> -<% py_fields <<= sdk_type_def.python_field_name || prop.name.underscore -%> -<% end -%> -<% end -%> -<% access_chain = py_fields.map{|f| "['#{f}']"}.join -%> - '<%= py_var -%>': <%= py_fields.empty? ? "self.#{py_var}" : "d#{access_chain}" -%>, +<%= lines(build_property_inline_response_format(prop, sdk_operation)) -%> <% end -%> } return d diff --git a/templates/azure/ansible/sdktypes/property_inline_response_format.erb b/templates/azure/ansible/sdktypes/property_inline_response_format.erb new file mode 100644 index 000000000000..25aa186fec1e --- /dev/null +++ b/templates/azure/ansible/sdktypes/property_inline_response_format.erb @@ -0,0 +1,16 @@ +<% + py_var = python_variable_name(property, sdk_operation) + py_fields = [] + sdk_ref = get_applicable_reference(property.azure_sdk_references, sdk_operation.response) + unless sdk_ref.nil? + sdk_refs = sdk_ref.split('/').reject(&:empty?) + sdk_ref = '' + sdk_refs.each do |ref| + sdk_ref += '/' + ref + sdk_type_def = sdk_operation.response[sdk_ref] + py_fields <<= sdk_type_def.python_field_name || property.name.underscore + end + end + access_chain = py_fields.map{|f| "['#{f}']"}.join +-%> +'<%= py_var -%>': <%= py_fields.empty? ? "self.#{py_var}" : "d#{access_chain}" -%>, \ No newline at end of file From 7ed7ecc15b90bf376c33892068444207cf74c651 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 13 Jun 2019 16:47:39 -0700 Subject: [PATCH 101/175] Rename `list_by_rg` to `list_by_resource_group`. --- api/azure/sdk_definition.rb | 4 ++-- templates/ansible/facts.erb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index a42ce602e9f9..0d498d15d1d7 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -13,7 +13,7 @@ class SDKDefinition < Api::Object attr_reader :read attr_reader :update attr_reader :delete - attr_reader :list_by_rg + attr_reader :list_by_resource_group def validate super @@ -26,7 +26,7 @@ def validate check_property :read, Api::Azure::SDKOperationDefinition check_optional_property :update, Api::Azure::SDKOperationDefinition check_property :delete, Api::Azure::SDKOperationDefinition - check_optional_property :list_by_rg, Api::Azure::SDKOperationDefinition + check_optional_property :list_by_resource_group, Api::Azure::SDKOperationDefinition end def filter_language!(language) diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 71afca6f2d53..8d0ef9210684 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -124,7 +124,7 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): return results -<% sdk_operation = object.azure_sdk_definition.list_by_rg -%> +<% sdk_operation = object.azure_sdk_definition.list_by_resource_group -%> <% unless sdk_operation.nil? -%> def list(self): response = None From 87d6e3c342f77336dfb886eba4a91f4fd08053c4 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 13 Jun 2019 17:12:34 -0700 Subject: [PATCH 102/175] Fix import error in Ansible info module. --- templates/ansible/facts.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 8d0ef9210684..77090892715b 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -71,7 +71,7 @@ from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: from msrestazure.azure_exceptions import CloudError - from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= python_sdk_client -%> + from <%= object.azure_sdk_definition.python_client_namespace -%> import <%= lines(python_sdk_client) -%> from msrest.serialization import Model except ImportError: # This is handled in azure_rm_common From f3d188fa4d468bfd3aac14bd7bc081ff8da53de5 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 13 Jun 2019 18:45:22 -0700 Subject: [PATCH 103/175] Add developer guidelines for Azure. --- AZURE_DEVELOPER.md | 103 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 AZURE_DEVELOPER.md diff --git a/AZURE_DEVELOPER.md b/AZURE_DEVELOPER.md new file mode 100644 index 000000000000..a585833253f8 --- /dev/null +++ b/AZURE_DEVELOPER.md @@ -0,0 +1,103 @@ +# Developer Guide for Azure Resources + +We extended magic-modules to support Azure SDKs and resources. Our design principle is to share as much code as we can, but if not, we will put Azure specific code and templates in `azure` folder, and under `Azure` namespace. For example, default data type definitions are under `Api::Type` namespace in `api/type.rb` file, while Azure specific type definitions are under `Api::Azure::Type` namespace in `api/azure/type.rb`. + +For the original magic-modules development documentation, please refer to [DEVELOPER.md](DEVELOPER.md). Before reading the documentation, please make sure you know the basic concepts and coding technologies of Ruby and Ruby template (erb). + +## Folder Structure + +We reused most of the folder structure defined by the Google's magic-modules, but extended some Azure specific folders. Here is the big-picture of some important folders: + +``` +magic-modules + |- api + | |- azure + | | |- *.rb [all Azure specific types could be used in api.yaml] + | |- *.rb [all types could be used in api.yaml] + |- google + | |- *.rb [all utility functions by Google] + |- provider + | |- ansible [Ansible specific type and helper function definitions] + | |- terraform [Terraform specific type and helper function definitions] + | |- azure + | | |- ansible [Azure-ansible specific type and helper function definitions] + | | |- terraform [Azure-terraform specific type and helper function definitions] + | | |- example [Shared example related type definitions] + | | |- ansible.rb [Root object to include all sub-modules in ansible folder] + | | |- terraform.rb [Root object to include all sub-modules in terraform folder] + | | |- core.rb [Helper functions to parse example types] + | |- core.rb, abstract_core.rb, terraform.rb, ansible.rb, config.rb [See below] + | |- *.rb [all types for .yaml and helper functions for templates] + |- templates + | |- ansible + | | |- facts.erb [Ansible info module template] + | | |- resource.erb [Ansible module template] + | | |- integration_test.erb [Ansible test template] + | |- terraform + | | |- datasource.erb [Terraform data source template] + | | |- resource.erb [Terraform resource template] + | | |- resource.html.markdown.erb [Terraform resource documentation template] + | | |- datasource.html.markdown.erb [Terraform data source documentation template] + | | |- schemas + | | | |- *.erb [Terraform schema sub-templates, including definition, d.Get, d.Set, etc.] + | | |- *.erb [Terraform sub-template, e.g. expand, flatten, etc.] + | |- azure + | | |- ansible + | | | |- example [Ansible test yaml and documentation yaml templates] + | | | |- module [Sub-tempaltes to generate Ansible modules or info modules] + | | | |- sdk [Sub-templates to generate Python SDK related code like method call] + | | | |- sdktypes [Sub-templates to generate schema<->SDK marshalling code] + | | | |- test [Ansible test helper templates] + | | |- terraform + | | | |- acctest [Helper sub-templates to generate Terraform tests] + | | | |- example [Terraform test HCL and documentation HCL templates] + | | | |- schemas [Azure-specific schema sub-temapltes, including definition, d.Get, d.Set, etc.] + | | | |- sdk [Sub-templates to generate Go SDK related code like method call, ID parse, fmt.Errorf] + | | | |- sdktypes [Sub-templates to generate schema<->SDK marshalling code] + | |- *.erb [sharable templates like auto-gen comment] + |- compiler.rb [entry point] +``` + +## Compiler + +The entry point of magic module is `compiler.rb`. It will parse the command line, try to read `api.yaml`, `terraform.yaml` and `ansible.yaml` in the input directory, and load the corresponding provider. For Terraform, the provider is located in `provider/terraform.rb`; while for Ansible is `provider/ansible.rb`. When generating code for a specific product (let's say Terraform), all code templates (erb files) will only see functions defined in the corresponding provider. + +Class inheritance structure is illustrated below: + +``` +Provider::Core (provider/core.rb) + |- Provider::AbstractCore (provider/abstract_core.rb) + | |- Provider::Terraform (provider/terraform.rb) + |- Provider::Ansible::Core (provider/ansible.rb) +``` + +These providers are root object, besides defining some common helper functions, they will `include` all submodules of the provider (for example, the definition of all Azure specific data types `provider/azure/terraform.rb` and `provider/azure/ansible.rb`). Together with the configuration definitions (`provider/terraform/config.rb` or `provider/ansible/config.rb`), we will be able to use all defined data types and properties in `api.yaml`, `terraform.yaml`, `ansible.yaml` and all ERB templates. As a developer, you need to make sure your types are eventually included in these root objects, otherwise magic-modules will raise errors. + +## Code Templates + +The overall structure of all code templates are listed in the Folder Structure section. Typically for each template, we introduced a helper function with it, and throughout the code base, we should call that helper function to actually apply the code template. + +For example, for a template `property_to_sdkobject.erb` in Terraform, we have the following functions/files: + +* Actual template file: `templates/azure/terraform/sdktypes/property_to_sdkobject.erb` +* Helper function: `build_property_to_sdk_object` in `provider/azure/terraform/sdk/sub_template.rb` + +We should always call the helper functions throughout the code base like the one in `templates/azure/terraform/sdktypes/nested_object_field_assign.erb`. + +## Logic + +We handled both Terraform and Ansible resource code generation in a similar way. + +1. Magic-modules core handles all definitions (`api.yaml`) and overrides (`terraform.yaml`/`ansible.yaml`) for us +2. Generate schema definition structure +3. Generate code to marshal data from schema to SDK +4. Generate code to call CRUDL SDK APIs +5. Generate code to marshal data from SDK to schema + +Since magic-modules core handles all overrides, I will not talk too much about it, please reference to the original magic-modules documentation. As a developer for Azure, we only need to define the overridable attributes (which will be used in `terraform.yaml`/`ansible.yaml`) in one of the `resource_override.rb` or `property_override.rb`, and then we are able to use them throughout the code base including templates and helper functions. + +Generating schema definition is simple in Ansible since we only need to call `to_yaml` helper function. It requires some additional efforts for Terraform. That's the reason why `templates/terraform/schemas` and `templates/azure/terraform/schemas` exist. + +Marshalling is another tough job to do because Azure SDK objects are deeply hierarchical objects. Both Ansible and Terraform handle it in a recursive way (recursive code template). We put both-way marshalling code templates in `templates/azure/[terraform|ansible]/sdktypes` folder. You will be able to find the corresponding helper functions by using the names of the templates. + +It is not too difficult to generate Azure SDK API calls since they are all defined in `azure_sdk_definitions` section of `api.yaml`. Typically API calls are put directly in the resource/module code template, but with an reusable method call sub-template. \ No newline at end of file From 3cd091c176e6afb9ad0b0c75a66dc01ca4496b62 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 17 Jun 2019 17:03:56 -0700 Subject: [PATCH 104/175] Fix several Ansible info module styles. --- provider/ansible/documentation.rb | 10 +++---- provider/azure/ansible/helpers.rb | 29 ++++++++++++++------- provider/azure/ansible/property_override.rb | 2 ++ provider/terraform/sub_template.rb | 4 +-- templates/ansible/facts.erb | 14 +++++++--- templates/ansible/resource.erb | 2 +- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index b619977289fa..933aaa70d4af 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -70,12 +70,13 @@ def returns_for_property(prop, object) type = 'complex' if prop.is_a?(Api::Type::NestedObject) \ || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) + sample = prop.document_sample_value || prop.sample_value { python_variable_name(prop, object.azure_sdk_definition.read) => { 'description' => format_description(prop.description), 'returned' => 'always', 'type' => type, - 'sample' => (prop.sample_value unless prop.sample_value.nil?), + 'sample' => (sample unless sample.nil?), 'contains' => ( if prop.is_a?(Api::Type::NestedObject) prop.properties.map { |p| returns_for_property(p, object) }.reduce({}, :merge) @@ -88,15 +89,14 @@ def returns_for_property(prop, object) end def autogen_notice_contrib - [] - # ['Please read more about how to change this file at', - # 'https://www.github.com/GoogleCloudPlatform/magic-modules'] + ['Please read more about how to change this file at', + 'https://github.com/Azure/magic-module-specs'] end def resourceref_description(prop) [ "It can be the #{prop.resource_type_name} name which is in the same resource group.", - "It can be the #{prop.resource_type_name} ID. e.g., #{prop.sample_value}.", + "It can be the #{prop.resource_type_name} ID. e.g., #{prop.document_sample_value || prop.sample_value}.", "It can be a dict which contains C(name) and C(resource_group) of the #{prop.resource_type_name}." ] end diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index bc8ee82ac827..53c244590b41 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -36,30 +36,31 @@ def always_has_value?(property) property.required || !property.default_value.nil? end - def word_wrap_for_yaml(lines, width = 150) + def word_wrap_for_yaml(lines, width = 160) wrapped = Array.new lines.each do |line| quoted = false + first_line = true while line.length > width # Calculate leading spaces for the following lines striped = line.lstrip spaces = line.length - striped.length - spaces += 2 if striped.start_with? '- ' + if first_line + spaces += 2 + first_line = false + end # Quote the whole line using quotation mark if not quoted + quoted = true unless striped.start_with? '- ' unless quoted line = line[0..spaces - 1] + '"' + line[spaces..-1] + '"' if line[spaces] != '"' quoted = true end # Find the last possible word-break character - wb_index = -1 - wb_index_try = line.index(/[ \t@=,;]/) - while !wb_index_try.nil? && wb_index_try < width - wb_index = wb_index_try - wb_index_try = line.index(/[ \t@=,;]/, wb_index_try + 1) - end - break if wb_index == -1 + wb_index = find_word_break_index(line, /[ \t@=,;]/, width - spaces) + wb_index = find_word_break_index(line, /[ \t@=,;\/]/, width - spaces) if wb_index.nil? || wb_index <= spaces + break if wb_index.nil? || wb_index <= spaces # Break this line into two wb_char = line[wb_index] @@ -72,6 +73,16 @@ def word_wrap_for_yaml(lines, width = 150) end wrapped end + + private + + def find_word_break_index(line, wb_chars, width) + wb_index = line.rindex(wb_chars) + while !wb_index.nil? && wb_index > width + wb_index = line.rindex(wb_chars, wb_index - 1) + end + wb_index + end end end end diff --git a/provider/azure/ansible/property_override.rb b/provider/azure/ansible/property_override.rb index 1a9736db5d82..62fbf0677430 100644 --- a/provider/azure/ansible/property_override.rb +++ b/provider/azure/ansible/property_override.rb @@ -5,6 +5,7 @@ module Azure module Ansible module OverrideFields attr_reader :resource_type_name + attr_reader :document_sample_value attr_reader :custom_normalize attr_reader :inline_custom_response_format include Provider::Ansible::OverrideFields @@ -16,6 +17,7 @@ class PropertyOverride < Provider::Ansible::PropertyOverride def validate super check_optional_property :resource_type_name, String + check_optional_property :document_sample_value, String check_optional_property :custom_normalize, String check_optional_property :inline_custom_response_format, String end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 2181f407bac3..949058b48dea 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -61,8 +61,8 @@ def build_nested_property_documentation(property) private def autogen_notice_contrib - ['Please read more about how to change this file in', - '.github/CONTRIBUTING.md.'] + ['Please read more about how to change this file at', + 'https://github.com/Azure/magic-module-specs'] end def autogen_notice_text(line) diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 77090892715b..734572343b07 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -35,12 +35,18 @@ short_description: Gather info for Azure <%= lines(object.name.titlecase) -%> description: - Gather info for Azure <%= object.name.titlecase -%>. +<% + if is_tags_defined?(object) + tags_prop = get_tags_property(object).clone + tags_prop.instance_variable_set(:@description, "Limit results by providing a list of tags. Format tags as 'key' or 'key:value'.") + end +-%> <%= to_yaml({ 'options' => [ input_properties.map{|p| documentation_for_property(p, object)}, - (documentation_for_property(get_tags_property(object), object) if is_tags_defined?(object)) + (documentation_for_property(tags_prop, object) if is_tags_defined?(object)) ].flatten.compact.reduce({}, :merge) -})-%> +}) -%> extends_documentation_fragment: - azure @@ -57,14 +63,14 @@ EXAMPLES = ''' <% end -%> RETURN = ''' -<%= to_yaml({ +<%= lines(word_wrap_for_yaml(to_yaml({ 'items' => { 'description' => 'List of items', 'returned' => 'always', 'type' => 'complex', 'contains' => output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge) } -})-%> +}).split("\n"))) -%> ''' from ansible.module_utils.azure_rm_common import AzureRMModuleBase diff --git a/templates/ansible/resource.erb b/templates/ansible/resource.erb index 96da4da62111..c640beabaa2c 100644 --- a/templates/ansible/resource.erb +++ b/templates/ansible/resource.erb @@ -75,7 +75,7 @@ EXAMPLES = ''' <% end -%> RETURN = ''' -<%= to_yaml(output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge)) -%> +<%= lines(word_wrap_for_yaml(to_yaml(output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge)).split("\n"))) -%> ''' import time From 2e6bd6a1da7f8b271a5e61e887490320e7b8489c Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 18 Jun 2019 14:37:34 -0700 Subject: [PATCH 105/175] Add Ansible info module tests --- api/azure/sdk_definition.rb | 2 + provider/ansible/documentation.rb | 2 +- provider/azure/ansible.rb | 2 + provider/azure/ansible/example/helpers.rb | 18 +++++++++ provider/azure/ansible/resource_override.rb | 4 ++ templates/ansible/facts.erb | 41 +++++++++++++++++++-- templates/ansible/integration_test.erb | 22 +++++++++++ 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 provider/azure/ansible/example/helpers.rb diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 0d498d15d1d7..a06b7291cb0c 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -14,6 +14,7 @@ class SDKDefinition < Api::Object attr_reader :update attr_reader :delete attr_reader :list_by_resource_group + attr_reader :list_by_subscription def validate super @@ -27,6 +28,7 @@ def validate check_optional_property :update, Api::Azure::SDKOperationDefinition check_property :delete, Api::Azure::SDKOperationDefinition check_optional_property :list_by_resource_group, Api::Azure::SDKOperationDefinition + check_optional_property :list_by_subscription, Api::Azure::SDKOperationDefinition end def filter_language!(language) diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 933aaa70d4af..925a133beb90 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -42,7 +42,7 @@ def documentation_for_property(prop, object) ].flatten.compact, 'required' => (true if required && !is_location?(prop)), 'default' => (prop.default_value.to_s.underscore if prop.default_value), - 'type' => ('bool' if prop.is_a? Api::Type::Boolean), + 'type' => python_type(prop), 'aliases' => (prop.aliases if prop.aliases), 'version_added' => (prop.version_added.to_f if prop.version_added), 'choices' => (prop.values.map{|v| v.to_s.underscore} if prop.is_a? Api::Type::Enum), diff --git a/provider/azure/ansible.rb b/provider/azure/ansible.rb index fab864517611..fe9aadde1cb2 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible.rb @@ -5,6 +5,7 @@ require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' +require 'provider/azure/ansible/example/helpers' require 'provider/azure/ansible/example/sub_template' require 'provider/azure/ansible/resource_override' @@ -18,6 +19,7 @@ module Ansible include Provider::Azure::Ansible::SubTemplate include Provider::Azure::Ansible::Module::SubTemplate include Provider::Azure::Ansible::SDK::SubTemplate + include Provider::Azure::Ansible::Example::Helpers include Provider::Azure::Ansible::Example::SubTemplate end end diff --git a/provider/azure/ansible/example/helpers.rb b/provider/azure/ansible/example/helpers.rb new file mode 100644 index 000000000000..b416b4cd5dc2 --- /dev/null +++ b/provider/azure/ansible/example/helpers.rb @@ -0,0 +1,18 @@ +module Provider + module Azure + module Ansible + module Example + module Helpers + def generate_info_assert_list(example_name) + example = get_example_by_names(example_name) + asserts = ["- output.items[0]['id'] != None"] + example.properties.each_key do |p| + asserts << "- output.items[0]['#{p.underscore}'] != None" + end + asserts + end + end + end + end + end +end diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index 338dded7ce98..b86f997e64da 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -25,10 +25,14 @@ def validate class IntegrationTestDefinition < ExampleReference attr_reader :delete_example + attr_reader :info_by_name_example + attr_reader :info_by_resource_group_example def validate super check_property :delete_example, String + check_optional_property :info_by_name_example, String + check_optional_property :info_by_resource_group_example, String end end diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 734572343b07..86adafae77cb 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -105,10 +105,20 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): self.mgmt_client = self.get_mgmt_svc_client(<%= python_sdk_client -%>, base_url=self._cloud_environment.endpoints.resource_manager) - if (self.name): - self.results['items'] = self.get() +<% + support_subs = !object.azure_sdk_definition.list_by_subscription.nil? + support_rgs = !object.azure_sdk_definition.list_by_resource_group.nil? +-%> +<% if support_subs && support_rgs -%> + if self.resource_group is not None and self.name is not None: + self.results['items'] = self.get() + elif self.resource_group is not None: + self.results['items'] = self.list_by_resource_group() else: - self.results['items'] = self.list() + self.results['items'] = self.list_by_subscription() +<% else -%> + # TODO: Implement more info list here +<% end -%> return self.results <% sdk_operation = object.azure_sdk_definition.read -%> @@ -132,7 +142,30 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): <% sdk_operation = object.azure_sdk_definition.list_by_resource_group -%> <% unless sdk_operation.nil? -%> - def list(self): + def list_by_resource_group(self): + response = None + results = [] + try: +<%= lines(build_sdk_method_invocation(python_sdk_sub_client, sdk_operation)) -%> + self.log("Response : {0}".format(response)) + except CloudError as e: + self.log('Could not get info for <%= object.name.titlecase -%>.') + + if response is not None: + for item in response: +<% if is_tags_defined?(object) -%> + if self.has_tags(item.tags, self.tags): + results.append(self.format_response(item)) +<% else -%> + # TODO: Implement format response without tags +<% end -%> + + return results +<% end -%> + +<% sdk_operation = object.azure_sdk_definition.list_by_subscription -%> +<% unless sdk_operation.nil? -%> + def list_by_subscription(self): response = None results = [] try: diff --git a/templates/ansible/integration_test.erb b/templates/ansible/integration_test.erb index 8923934a3de7..9942afbe3433 100644 --- a/templates/ansible/integration_test.erb +++ b/templates/ansible/integration_test.erb @@ -25,6 +25,28 @@ that: - not output.changed +<% unless object.inttests[0].info_by_name_example.nil? -%> +<% _, info_yaml, _ = build_test_yaml_from_example(object.inttests[0].info_by_name_example) -%> +<%= lines(info_yaml) -%> + +- name: Assert that info is returned + assert: + that: + - not output.changed +<%= lines(indent(generate_info_assert_list(object.inttests[0].example), 6)) -%> + +<% end -%> +<% unless object.inttests[0].info_by_resource_group_example.nil? -%> +<% _, info_yaml, _ = build_test_yaml_from_example(object.inttests[0].info_by_resource_group_example) -%> +<%= lines(info_yaml) -%> + +- name: Assert that info is returned + assert: + that: + - not output.changed +<%= lines(indent(generate_info_assert_list(object.inttests[0].example), 6)) -%> + +<% end -%> <% deps_yaml, delete_yaml, _ = build_test_yaml_from_example(object.inttests[0].delete_example) -%> <%= lines(delete_yaml) -%> From 1ce4cb2bded49639aceab3f4b60cd4b1c6a085a0 Mon Sep 17 00:00:00 2001 From: Su Shi <1684739+metacpp@users.noreply.github.com> Date: Tue, 18 Jun 2019 14:57:37 -0700 Subject: [PATCH 106/175] add magic-module-specs ad submodule. (#8) --- .gitmodules | 3 +++ azure/magic-module-specs | 1 + 2 files changed, 4 insertions(+) create mode 160000 azure/magic-module-specs diff --git a/.gitmodules b/.gitmodules index 1daee31cfa6d..fa27a932f46d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "build/inspec"] path = build/inspec url = git@github.com:modular-magician/inspec-gcp.git +[submodule "azure/magic-module-specs"] + path = azure/magic-module-specs + url = git@github.com:Azure/magic-module-specs.git diff --git a/azure/magic-module-specs b/azure/magic-module-specs new file mode 160000 index 000000000000..2215b479ebb5 --- /dev/null +++ b/azure/magic-module-specs @@ -0,0 +1 @@ +Subproject commit 2215b479ebb52f02f898cf09893ae847d0e27ec9 From 958b577e32691e03e0ad68ca8030160ad974ced2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 18 Jun 2019 14:59:09 -0700 Subject: [PATCH 107/175] Fix indentation. --- templates/ansible/facts.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/ansible/facts.erb b/templates/ansible/facts.erb index 86adafae77cb..304d91feb2d1 100644 --- a/templates/ansible/facts.erb +++ b/templates/ansible/facts.erb @@ -111,11 +111,11 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): -%> <% if support_subs && support_rgs -%> if self.resource_group is not None and self.name is not None: - self.results['items'] = self.get() + self.results['items'] = self.get() elif self.resource_group is not None: - self.results['items'] = self.list_by_resource_group() + self.results['items'] = self.list_by_resource_group() else: - self.results['items'] = self.list_by_subscription() + self.results['items'] = self.list_by_subscription() <% else -%> # TODO: Implement more info list here <% end -%> From 6e3808c70cff536455914093c91852136bd5a6ee Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 24 Jun 2019 15:22:24 -0700 Subject: [PATCH 108/175] Merge terraform generator to the latest MM --- api/azure/resource.rb | 2 +- api/azure/sdk_definition.rb | 29 ++-- api/azure/sdk_definition_override.rb | 10 +- api/azure/sdk_operation_definition.rb | 12 +- .../sdk_operation_definition_override.rb | 8 +- api/azure/sdk_type_definition.rb | 26 ++-- api/azure/sdk_type_definition_override.rb | 22 +-- api/azure/type.rb | 10 +- api/azure/type_extension.rb | 23 +++ api/type.rb | 14 +- azure/yaml_validator_extension.rb | 43 ++++++ google/yaml_validator.rb | 2 + overrides/azure/resources.rb | 48 ------ overrides/azure/resources_extension.rb | 15 ++ overrides/resources.rb | 5 +- overrides/validator.rb | 2 + provider/ansible/documentation.rb | 8 +- provider/ansible/module.rb | 4 +- provider/azure/ansible/module.rb | 2 +- provider/azure/ansible/property_override.rb | 40 +++-- provider/azure/ansible/resource_override.rb | 64 ++++---- .../azure/{config.rb => config_extension.rb} | 4 +- provider/azure/core.rb | 4 +- provider/azure/example/example.rb | 13 +- provider/azure/terraform/config.rb | 23 +++ provider/azure/terraform/custom_code.rb | 4 +- provider/azure/terraform/helpers.rb | 10 +- provider/azure/terraform/property_override.rb | 47 +++--- provider/azure/terraform/resource_override.rb | 103 +++++++------ provider/azure/terraform/schema.rb | 26 ++-- provider/azure/terraform/sdk/helpers.rb | 2 +- provider/azure/terraform/sub_template.rb | 37 +++++ .../{terraform.rb => terraform_extension.rb} | 56 ++++--- provider/config.rb | 6 +- provider/terraform.rb | 95 ++++++------ provider/terraform/config.rb | 2 - provider/terraform/sub_template.rb | 24 +-- templates/azure/terraform/datasource.erb | 10 +- .../terraform/datasource.html.markdown.erb | 30 ++-- .../terraform}/datasource_test.go.erb | 3 +- .../terraform/expand_property_method.erb | 22 +-- .../terraform/flatten_property_method.erb | 8 +- .../nested_property_documentation.erb | 18 +++ .../terraform/property_documentation.erb | 8 +- templates/azure/terraform/resource.erb | 18 +-- .../terraform/resource.html.markdown.erb | 44 +----- .../terraform/schemas/basic_get.erb | 0 .../terraform/schemas/basic_set.erb | 0 .../{ => azure}/terraform/schemas/empty.erb | 0 .../terraform/schemas/flatten_set.erb | 0 .../terraform/schemas/hide_from_schema.erb | 0 .../azure/terraform/schemas/primitive.erb | 144 ++++++++++++++++++ .../terraform/schemas/unsupport.erb | 0 .../nested_property_documentation.erb | 7 +- templates/terraform/schemas/primitive.erb | 129 ---------------- 55 files changed, 657 insertions(+), 629 deletions(-) create mode 100644 api/azure/type_extension.rb create mode 100644 azure/yaml_validator_extension.rb delete mode 100644 overrides/azure/resources.rb create mode 100644 overrides/azure/resources_extension.rb rename provider/azure/{config.rb => config_extension.rb} (82%) create mode 100644 provider/azure/terraform/config.rb rename provider/azure/{terraform.rb => terraform_extension.rb} (58%) rename templates/{terraform/examples/base_configs => azure/terraform}/datasource_test.go.erb (94%) create mode 100644 templates/azure/terraform/nested_property_documentation.erb rename templates/{ => azure}/terraform/schemas/basic_get.erb (100%) rename templates/{ => azure}/terraform/schemas/basic_set.erb (100%) rename templates/{ => azure}/terraform/schemas/empty.erb (100%) rename templates/{ => azure}/terraform/schemas/flatten_set.erb (100%) rename templates/{ => azure}/terraform/schemas/hide_from_schema.erb (100%) create mode 100644 templates/azure/terraform/schemas/primitive.erb rename templates/{ => azure}/terraform/schemas/unsupport.erb (100%) delete mode 100644 templates/terraform/schemas/primitive.erb diff --git a/api/azure/resource.rb b/api/azure/resource.rb index d0f931143eb3..fbcf3e391447 100644 --- a/api/azure/resource.rb +++ b/api/azure/resource.rb @@ -12,7 +12,7 @@ module Properties # Azure-extended validate function of Api::Resource::validate def azure_validate - check_property :azure_sdk_definition, Api::Azure::SDKDefinition + check :azure_sdk_definition, type: Api::Azure::SDKDefinition, required: true end end diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index a06b7291cb0c..bf0f8810ec72 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -18,17 +18,18 @@ class SDKDefinition < Api::Object def validate super - check_property :provider_name, String - check_property :go_client_namespace, String - check_property :go_client, String - check_property :python_client_namespace, String - check_property :python_client, String - check_property :create, Api::Azure::SDKOperationDefinition - check_property :read, Api::Azure::SDKOperationDefinition - check_optional_property :update, Api::Azure::SDKOperationDefinition - check_property :delete, Api::Azure::SDKOperationDefinition - check_optional_property :list_by_resource_group, Api::Azure::SDKOperationDefinition - check_optional_property :list_by_subscription, Api::Azure::SDKOperationDefinition + check :provider_name, type: ::String, required: true + check :go_client_namespace, type: ::String, required: true + check :go_client, type: ::String, required: true + check :python_client_namespace, type: ::String, required: true + check :python_client, type: ::String, required: true + check :create, type: Api::Azure::SDKOperationDefinition, required: true + check :read, type: Api::Azure::SDKOperationDefinition, required: true + check :update, type: Api::Azure::SDKOperationDefinition + check :delete, type: Api::Azure::SDKOperationDefinition, required: true + check :list_by_parent, type: Api::Azure::SDKOperationDefinition + check :list_by_resource_group, type: Api::Azure::SDKOperationDefinition + check :list_by_subscription, type: Api::Azure::SDKOperationDefinition end def filter_language!(language) @@ -40,9 +41,9 @@ def filter_language!(language) def merge_overrides!(overrides) @create.merge_overrides!(overrides.create) if !@create.nil? && !overrides.create.nil? - @read.merge_overrides!(nil) if !@read.nil? && !overrides.read.nil? - @update.merge_overrides!(nil) if !@update.nil? && !overrides.update.nil? - @delete.merge_overrides!(nil) if !@delete.nil? && !overrides.delete.nil? + @read.merge_overrides!(overrides.read) if !@read.nil? && !overrides.read.nil? + @update.merge_overrides!(overrides.update) if !@update.nil? && !overrides.update.nil? + @delete.merge_overrides!(overrides.delete) if !@delete.nil? && !overrides.delete.nil? end end end diff --git a/api/azure/sdk_definition_override.rb b/api/azure/sdk_definition_override.rb index 8b17fbc00450..a7c877f16cae 100644 --- a/api/azure/sdk_definition_override.rb +++ b/api/azure/sdk_definition_override.rb @@ -11,11 +11,11 @@ class SDKDefinitionOverride < Api::Object def validate super - check_optional_property :create, Api::Azure::SDKOperationDefinitionOverride - check_optional_property :read, Api::Azure::SDKOperationDefinitionOverride - check_optional_property :update, Api::Azure::SDKOperationDefinitionOverride - check_optional_property :delete, Api::Azure::SDKOperationDefinitionOverride + check :create, type: SDKOperationDefinitionOverride + check :read, type: SDKOperationDefinitionOverride + check :update, type: SDKOperationDefinitionOverride + check :delete, type: SDKOperationDefinitionOverride end end end -end \ No newline at end of file +end diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb index 8628ddbb765b..54e8a7abb253 100644 --- a/api/azure/sdk_operation_definition.rb +++ b/api/azure/sdk_operation_definition.rb @@ -15,13 +15,11 @@ def validate @request ||= Hash.new @response ||= Hash.new - check_property :go_func_name, String - check_property :python_func_name, String - check_optional_property :async, :boolean - check_property :request, Hash - check_property_hash :request, String, Api::Azure::SDKTypeDefinition - check_property :response, Hash - check_property_hash :response, String, Api::Azure::SDKTypeDefinition + check :go_func_name, type: ::String, required: true + check :python_func_name, type: ::String, required: true + check :async, type: :boolean + check_ext :request, type: ::Hash, key_type: ::String, item_type: SDKTypeDefinition, required: true + check_ext :response, type: ::Hash, key_type: ::String, item_type: SDKTypeDefinition, required: true end def filter_language!(language) diff --git a/api/azure/sdk_operation_definition_override.rb b/api/azure/sdk_operation_definition_override.rb index fa1ac22910bb..cb195f631d96 100644 --- a/api/azure/sdk_operation_definition_override.rb +++ b/api/azure/sdk_operation_definition_override.rb @@ -9,11 +9,9 @@ class SDKOperationDefinitionOverride < Api::Object def validate super - check_optional_property :request, Hash - check_optional_property_hash :request, String, Api::Azure::SDKTypeDefinitionOverride - check_optional_property :response, Hash - check_optional_property_hash :response, String, Api::Azure::SDKTypeDefinitionOverride + check_ext :request, type: ::Hash, key_type: ::String, item_type: SDKTypeDefinitionOverride + check_ext :response, type: ::Hash, key_type: ::String, item_type: SDKTypeDefinitionOverride end end end -end \ No newline at end of file +end diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 47ec077655ff..ae3c9e157fe5 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -15,18 +15,15 @@ class SDKTypeDefinition < Api::Object def validate super - @empty_value_sensitive ||= false - - check_optional_property :id_portion, String - check_optional_property :applicable_to, Array - check_property :empty_value_sensitive, :boolean - check_optional_property_list_oneof :applicable_to, ['go', 'python'], String - check_optional_property :go_variable_name, String - check_optional_property :go_field_name, String - check_optional_property :go_type_name, String - check_optional_property :python_parameter_name, String - check_optional_property :python_variable_name, String - check_optional_property :python_field_name, String + check :id_portion, type: ::String + check_ext :applicable_to, type: ::Array, item_type: ::String, item_allowed: ['go', 'python'], default: ['go', 'python'] + check :empty_value_sensitive, type: :boolean, default: false + check :go_variable_name, type: ::String + check :go_field_name, type: ::String + check :go_type_name, type: ::String + check :python_parameter_name, type: ::String + check :python_variable_name, type: ::String + check :python_field_name, type: ::String end def merge_overrides!(overrides) @@ -63,9 +60,8 @@ class EnumObject < SDKTypeDefinition def validate super - @go_enum_const_prefix ||= '' - check_optional_property :go_enum_type_name, String - check_optional_property :go_enum_const_prefix, String + check :go_enum_type_name, type: ::String + check :go_enum_const_prefix, type: ::String, default: '' end end diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index a06622e703b8..f812ae22d0ec 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -2,29 +2,13 @@ module Api module Azure - class SDKTypeDefinitionOverride < Api::Object + class SDKTypeDefinitionOverride < SDKTypeDefinition attr_reader :remove - attr_reader :id_portion - attr_reader :empty_value_sensitive - attr_reader :go_variable_name - attr_reader :go_field_name - attr_reader :python_parameter_name - attr_reader :python_variable_name - attr_reader :python_field_name def validate super - @remove ||= false - - check_optional_property :remove, :boolean - check_optional_property :id_portion, String - check_optional_property :empty_value_sensitive, :boolean - check_optional_property :go_variable_name, String - check_optional_property :go_field_name, String - check_optional_property :python_parameter_name, String - check_optional_property :python_variable_name, String - check_optional_property :python_field_name, String + check :remove, type: :boolean, default: false end end end -end \ No newline at end of file +end diff --git a/api/azure/type.rb b/api/azure/type.rb index 8175680f7bf7..f39dbc7e6bd3 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -3,23 +3,24 @@ module Api module Azure module Type + class ResourceGroupName < Api::Type::String def validate - @order ||= 550 + @order ||= 3 super end end class Location < Api::Type::String def validate - @order ||= 600 + @order ||= 5 super end end class Tags < Api::Type::KeyValuePairs def validate - @order ||= 2000 + @order ||= 20 super end end @@ -29,9 +30,10 @@ class ResourceReference < Api::Type::String def validate super - check_property :resource_type_name, ::String + check :resource_type_name, type: ::String, required: true end end + end end end diff --git a/api/azure/type_extension.rb b/api/azure/type_extension.rb new file mode 100644 index 000000000000..4bdd076a43e5 --- /dev/null +++ b/api/azure/type_extension.rb @@ -0,0 +1,23 @@ +module Api + module Azure + module Type + + module Fields + attr_reader :order + attr_reader :sample_value + attr_reader :azure_sdk_references + end + + module TypeExtension + def azure_validate + default_order = 10 + default_order = 1 if @name == "name" + default_order = 0 if @name == "id" + check :order, type: ::Integer, default: default_order + check :azure_sdk_references, type: ::Array, item_type: ::String, required: true + end + end + + end + end +end diff --git a/api/type.rb b/api/type.rb index 13109077e931..c5f46f48ebfc 100644 --- a/api/type.rb +++ b/api/type.rb @@ -13,14 +13,17 @@ require 'api/object' require 'google/string_utils' +require 'api/azure/type_extension' module Api # Represents a property type class Type < Api::Object::Named + include Api::Azure::Type::TypeExtension # The list of properties (attr_reader) that can be overridden in # .yaml. module Fields include Api::Object::Named::Properties + include Api::Azure::Type::Fields attr_reader :default_value attr_reader :description @@ -60,10 +63,6 @@ module Fields # Can only be overriden - we should never set this ourselves. attr_reader :new_type - - attr_reader :order - attr_reader :sample_value - attr_reader :azure_sdk_references end include Fields @@ -75,6 +74,7 @@ module Fields def validate super + azure_validate check :description, type: ::String, required: true check :exclude, type: :boolean, default: false, required: true check :deprecation_message, type: ::String @@ -93,12 +93,6 @@ def validate check :update_url, type: ::String - check_optional_property :order, ::Integer - @order ||= 750 - - @azure_sdk_references ||= [] - check_property :azure_sdk_references, ::Array - check_default_value_property check_conflicts end diff --git a/azure/yaml_validator_extension.rb b/azure/yaml_validator_extension.rb new file mode 100644 index 000000000000..f7f367a5e9b7 --- /dev/null +++ b/azure/yaml_validator_extension.rb @@ -0,0 +1,43 @@ +module Azure + module YamlValidatorExtension + + # Does extended validation checking for a variable + # options: + # :default - the default value for this variable if its nil + # :key_type - the allowed types that all keys in a hash should be + # :item_type - the allowed types that all values in an array or hash should be + # :allowed - the allowed values that this non-array variable should be + # :item_allowed - the allowed values that all values in an array or hash should be + # :required - is the variable required? (defaults: false) + def check_ext(variable, **opts) + check variable, opts + + value = instance_variable_get("@#{variable}") + + # Check key_type and item_type + if value.is_a?(::Hash) + raise "#{variable} must have key_type and item_type on hashes" unless opts[:key_type] && opts[:item_type] + + value.each do |k, v| + check_property_value("#{variable} key (#{k})", k, opts[:key_type]) + check_property_value("#{variable}[#{k}]", v, opts[:item_type]) + end + end + + # Check if item values are allowed + return unless opts[:item_allowed] + if value.is_a?(::Array) + value.each_with_index do |v, i| + raise "#{v} on #{variable}[#{i}] should be one of #{opts[:item_allowed]}" \ + unless opts[:item_allowed].include?(v) + end + elsif value.is_a?(::Hash) + value.each do |k, v| + raise "#{v} on #{variable}[#{k}] should be one of #{opts[:item_allowed]}" \ + unless opts[:item_allowed].include?(v) + end + end + end + + end +end diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 0857ba944684..9de70fdcec67 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -13,10 +13,12 @@ require 'google/logger' require 'yaml' +require 'azure/yaml_validator_extension' module Google # A helper class to validate contents coming from YAML files. class YamlValidator + include Azure::YamlValidatorExtension class << self def parse(content) # TODO(nelsonjr): Allow specifying which symbols to restrict it further. diff --git a/overrides/azure/resources.rb b/overrides/azure/resources.rb deleted file mode 100644 index 37e036acfe9f..000000000000 --- a/overrides/azure/resources.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Overrides - module Azure - - module ResourceOverride - def azure_apply(_resource) - convert_properties_to_datasource(_resource.all_user_properties, _resource.azure_sdk_definition) if @__is_data_source - update_overriden_azure_sdk_definition(_resource) - update_properties_default_sort_order(_resource) - end - - private - - def convert_properties_to_datasource(properties, azure_sdk_definition) - properties.each do |p| - if p.is_a? Api::Azure::Type::ResourceGroupName - p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_resource_group_name.erb') - elsif p.is_a? Api::Azure::Type::Location - p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_location.erb') - elsif p.is_a? Api::Azure::Type::Tags - p.instance_variable_set('@custom_schema_definition', 'templates/azure/terraform/schemas/datasource_tags.erb') - end - p.instance_variable_set('@input', false) - unless p.azure_sdk_references.any?{|r| azure_sdk_definition.read.request.has_key?(r)} - p.instance_variable_set('@required', false) - p.instance_variable_set('@output', true) - convert_properties_to_datasource(p.properties, azure_sdk_definition) if p.respond_to?(:properties) && !p.properties.nil? - end - end - end - - def update_overriden_azure_sdk_definition(_resource) - unless _resource.azure_sdk_definition.nil? - _resource.azure_sdk_definition.filter_language! @azure_sdk_language - override = instance_variable_get('@azure_sdk_definition') - _resource.azure_sdk_definition.merge_overrides!(override) unless override.nil? - end - end - - def update_properties_default_sort_order(_resource) - name = _resource.all_user_properties.find{|p| p.name == 'name'} - name.instance_variable_set('@order', @name_default_order) unless name.nil? - id = _resource.all_user_properties.find{|p| p.name == 'id'} - id.instance_variable_set('@order', @id_default_order) unless id.nil? - end - end - - end -end diff --git a/overrides/azure/resources_extension.rb b/overrides/azure/resources_extension.rb new file mode 100644 index 000000000000..965548d8a4a2 --- /dev/null +++ b/overrides/azure/resources_extension.rb @@ -0,0 +1,15 @@ +module Overrides + module Azure + + module ResourceOverrideExtension + def filter_azure_sdk_language(_resource, language) + _resource.azure_sdk_definition.filter_language!(language) unless _resource.azure_sdk_definition.nil? + end + + def merge_azure_sdk_definition(_resource, overrides) + _resource.azure_sdk_definition.merge_overrides!(overrides) unless _resource.azure_sdk_definition.nil? || overrides.nil? + end + end + + end +end diff --git a/overrides/resources.rb b/overrides/resources.rb index 881d4e9a59d1..b059cb6eb225 100644 --- a/overrides/resources.rb +++ b/overrides/resources.rb @@ -12,7 +12,7 @@ # limitations under the License. require 'google/yaml_validator' -require 'overrides/azure/resources' +require 'overrides/azure/resources_extension' module Overrides # All overrides act as a Hash under-the-hood. @@ -83,9 +83,8 @@ class ResourceOverrides < OverrideResource # Override to an Api::Resource in api.yaml class ResourceOverride < OverrideResource - include Overrides::Azure::ResourceOverride + include Overrides::Azure::ResourceOverrideExtension def apply(_resource) - azure_apply(_resource) self end end diff --git a/overrides/validator.rb b/overrides/validator.rb index 58b3de4a4412..40f494cd8ef0 100644 --- a/overrides/validator.rb +++ b/overrides/validator.rb @@ -50,6 +50,8 @@ def verify_resource(res, overrides) field_symbol = field_name[1..-1].to_sym next if check_if_exists(res, field_symbol, overrides.class.attributes) + print overrides.class.attributes + print "\n" raise "#{field_name} does not exist on #{res.name}" end # Use instance_variable_get to get excluded properties diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index a2bac6012843..07e25ffadabb 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -27,7 +27,7 @@ module Documentation # This will eventually be converted to YAML def documentation_for_property(prop) required = prop.required && !prop.default_value ? true : false - azure_documentation_for_property { + azure_documentation_for_property({ prop.name.underscore => { 'description' => [ format_description(prop.description), @@ -53,7 +53,7 @@ def documentation_for_property(prop) end ) }.reject { |_, v| v.nil? } - } + }) end # Builds out the RETURNS for a property. @@ -68,7 +68,7 @@ def returns_for_property(prop) type = 'complex' if prop.is_a?(Api::Type::NestedObject) \ || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) - azure_returns_for_property { + azure_returns_for_property({ prop.name => { 'description' => format_description(prop.description), 'returned' => 'success', @@ -80,7 +80,7 @@ def returns_for_property(prop) end ) }.reject { |_, v| v.nil? } - } + }) end def autogen_notice_contrib diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index b7281133c12b..2c85c7e77e43 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -29,7 +29,7 @@ def ansible_module(properties) end def python_dict_for_property(prop) - azure_python_dict_for_property { + azure_python_dict_for_property({ prop.name.underscore => { 'required' => (true if prop.required && !prop.default_value), 'default' => prop.default_value, @@ -44,7 +44,7 @@ def python_dict_for_property(prop) end ) }.reject { |_, v| v.nil? } - } + }) end # GcpModule is acting as a dictionary and doesn't need the dict() notation on diff --git a/provider/azure/ansible/module.rb b/provider/azure/ansible/module.rb index aa865535c099..e997ba3a21b5 100644 --- a/provider/azure/ansible/module.rb +++ b/provider/azure/ansible/module.rb @@ -5,7 +5,7 @@ module Azure module Ansible module Module - include Azure::PythonUtils + include ::Azure::PythonUtils def azure_python_dict_for_property(prop, dict, object) orig_name = prop.name.underscore diff --git a/provider/azure/ansible/property_override.rb b/provider/azure/ansible/property_override.rb index 62fbf0677430..74d1b89a487e 100644 --- a/provider/azure/ansible/property_override.rb +++ b/provider/azure/ansible/property_override.rb @@ -1,34 +1,32 @@ -require 'provider/ansible/property_override' +require 'overrides/ansible/property_override' module Provider module Azure module Ansible - module OverrideFields - attr_reader :resource_type_name - attr_reader :document_sample_value - attr_reader :custom_normalize - attr_reader :inline_custom_response_format - include Provider::Ansible::OverrideFields - end - - class PropertyOverride < Provider::Ansible::PropertyOverride - include Provider::Azure::Ansible::OverrideFields - def validate - super - check_optional_property :resource_type_name, String - check_optional_property :document_sample_value, String - check_optional_property :custom_normalize, String - check_optional_property :inline_custom_response_format, String + class PropertyOverride < Overrides::Ansible::PropertyOverride + # Collection of fields allowed in the PropertyOverride section for + # Ansible. All fields should be `attr_reader :` + def self.attributes + super.concat(%i[ + resource_type_name + document_sample_value + custom_normalize + inline_custom_response_format + ]) end - private + attr_reader(*attributes) - def overriden - Provider::Azure::Ansible::OverrideFields + def validate + super + check :resource_type_name, type: ::String + check :document_sample_value, type: ::String + check :custom_normalize, type: ::String + check :inline_custom_response_format, type: ::String end - end + end end end diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index b86f997e64da..17c051cfacb1 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -1,57 +1,49 @@ -require 'provider/ansible/resource_override' +require 'overrides/ansible/resource_override' require 'provider/azure/example/example' module Provider module Azure module Ansible - module OverrideProperties - attr_reader :inttests - attr_reader :examples - include Provider::Ansible::OverrideProperties - end - class ResourceOverride < Provider::Ansible::ResourceOverride - include Provider::Azure::Ansible::OverrideProperties + class IntegrationTestDefinition < ExampleReference + attr_reader :delete_example + attr_reader :info_by_name_example + attr_reader :info_by_resource_group_example def validate super - default_value_property :examples, [] - check_optional_property :examples, Array - check_optional_property_list :examples, Provider::Azure::ExampleReference - default_value_property :inttests, [] - check_optional_property :inttests, Array - check_optional_property_list :inttests, IntegrationTestDefinition + check :delete_example, type: ::String, required: true + check :info_by_name_example, type: ::String + check :info_by_resource_group_example, type: ::String end + end + + class DocumentExampleReference < ExampleReference + attr_reader :resource_name_hints - class IntegrationTestDefinition < ExampleReference - attr_reader :delete_example - attr_reader :info_by_name_example - attr_reader :info_by_resource_group_example - - def validate - super - check_property :delete_example, String - check_optional_property :info_by_name_example, String - check_optional_property :info_by_resource_group_example, String - end + def validate + super + check_ext :resource_name_hints, type: ::Hash, key_type: ::String, item_type: ::String end + end - class DocumentExampleReference < ExampleReference - attr_reader :resource_name_hints - - def validate - super - check_optional_property :resource_name_hints, Hash - check_optional_property_hash :resource_name_hints, String, String - end + class ResourceOverride < Overrides::Ansible::ResourceOverride + def self.attributes + super.concat(%i[ + inttests + examples + ]) end - private + attr_reader(*attributes) - def overriden - Provider::Azure::Ansible::OverrideProperties + def validate + super + check :examples, type: ::Array, default: [], item_type: DocumentExampleReference + check :inttests, type: ::Array, default: [], item_type: IntegrationTestDefinition end end + end end end diff --git a/provider/azure/config.rb b/provider/azure/config_extension.rb similarity index 82% rename from provider/azure/config.rb rename to provider/azure/config_extension.rb index 42ec1c9da5cf..2656a3ec14e4 100644 --- a/provider/azure/config.rb +++ b/provider/azure/config_extension.rb @@ -1,14 +1,12 @@ module Provider module Azure - module Config - + module ConfigExtension # The configuration file path, this should be the root path relative to # all API definitions, overrides and examples. attr_reader :config_file # Azure-extended Provider::Config::validate def azure_validate - @datasources.__is_data_source = true unless @datasources.nil? end # Azure-extended Provider::Config::parse diff --git a/provider/azure/core.rb b/provider/azure/core.rb index fd8b15ff5058..28f3ca7a504a 100644 --- a/provider/azure/core.rb +++ b/provider/azure/core.rb @@ -9,7 +9,7 @@ def get_example_by_reference(reference) end def get_example_by_names(example_name, product_name = nil) - spec_dir = File.dirname(@config.cfg_file) + spec_dir = File.dirname(@config.config_file) product_name ||= File.basename(spec_dir) example_yaml = File.join(File.dirname(spec_dir), product_name, 'examples', @provider, "#{example_name}.yaml") example = Google::YamlValidator.parse(File.read(example_yaml)) @@ -20,7 +20,7 @@ def get_example_by_names(example_name, product_name = nil) def get_custom_template_path(template_path) return nil if template_path.nil? - spec_dir = File.dirname(@config.cfg_file) + spec_dir = File.dirname(@config.config_file) File.join(spec_dir, template_path) end diff --git a/provider/azure/example/example.rb b/provider/azure/example/example.rb index d51bf1f5bfaf..08cdc1c37c6d 100644 --- a/provider/azure/example/example.rb +++ b/provider/azure/example/example.rb @@ -9,8 +9,8 @@ class ExampleReference < Api::Object def validate super - check_optional_property :product, String - check_property :example, String + check :product, type: ::String + check :example, type: ::String, required: true end end @@ -22,11 +22,10 @@ class Example < Api::Object def validate super - check_property :resource, String - check_optional_property :description, String - check_optional_property :prerequisites, Array - check_optional_property_list :prerequisites, ExampleReference - check_property :properties, Hash + check :resource, type: ::String, required: true + check :description, type: ::String + check :prerequisites, type: ::Array, item_type: ExampleReference + check :properties, type: ::Hash, required: true end end end diff --git a/provider/azure/terraform/config.rb b/provider/azure/terraform/config.rb new file mode 100644 index 000000000000..e7c63a5fecf3 --- /dev/null +++ b/provider/azure/terraform/config.rb @@ -0,0 +1,23 @@ +require 'provider/config' + +module Provider + module Azure + module Terraform + + class Config < Provider::Config + def provider + Provider::Terraform + end + + def resource_override + Provider::Azure::Terraform::ResourceOverride + end + + def property_override + Provider::Azure::Terraform::PropertyOverride + end + end + + end + end +end diff --git a/provider/azure/terraform/custom_code.rb b/provider/azure/terraform/custom_code.rb index d6315c60d145..017cfba73e2c 100644 --- a/provider/azure/terraform/custom_code.rb +++ b/provider/azure/terraform/custom_code.rb @@ -16,8 +16,8 @@ class CustomCode < Provider::Terraform::CustomCode def validate super - check_optional_property :post_read, String - check_optional_property :extra_functions, String + check :post_read, type: ::String + check :extra_functions, type: ::String end end diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index 678af9b29684..0cf0d1eee3c3 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -7,10 +7,12 @@ def get_property_value(obj, prop_name, default_value) obj.instance_variable_get("@#{prop_name}") end - def order_azure_properties(properties) - special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup'} - other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup'} - special_props.sort_by(&:order) + order_properties(other_props) + def order_azure_properties(properties, data_source_input = []) + special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} + other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} + sorted_special = special_props.sort_by{|p| p.name == 'location' ? 2 : p.order } + sorted_other = data_source_input.empty? ? order_properties(other_props) : other_props.sort_by(&:name) + sorted_special + sorted_other end end end diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 6a9277f7df29..2f2a93034776 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -1,39 +1,34 @@ -require 'provider/terraform/property_override' +require 'overrides/terraform/property_override' module Provider module Azure module Terraform - module OverrideFields - attr_reader :name_in_logs - attr_reader :hide_from_schema - attr_reader :custom_schema_definition - attr_reader :custom_schema_get - attr_reader :custom_schema_set - attr_reader :custom_sdkfield_assign - include Provider::Terraform::OverrideFields - end - - class PropertyOverride < Provider::Terraform::PropertyOverride - include Provider::Azure::Terraform::OverrideFields - def validate - super - @hide_from_schema ||= false - check_optional_property :name_in_logs, String - check_optional_property :hide_from_schema, :boolean - check_optional_property :custom_schema_definition, String - check_optional_property :custom_schema_get, String - check_optional_property :custom_schema_set, String - check_optional_property :custom_sdkfield_assign, String + class PropertyOverride < Overrides::Terraform::PropertyOverride + def self.attributes + super.concat(%i[ + name_in_logs + hide_from_schema + custom_schema_definition + custom_schema_get + custom_schema_set + custom_sdkfield_assign + ]) end - private + attr_reader(*attributes) - def overriden - Provider::Azure::Terraform::OverrideFields + def validate + super + check :name_in_logs, type: ::String + check :hide_from_schema, type: :boolean, default: false + check :custom_schema_definition, type: ::String + check :custom_schema_get, type: ::String + check :custom_schema_set, type: ::String + check :custom_sdkfield_assign, type: ::String end - end + end end end diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index f3673a2d1ea1..238d01c82ce1 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -1,78 +1,77 @@ -require 'provider/terraform/resource_override' +require 'overrides/terraform/resource_override' require 'api/azure/sdk_definition_override' module Provider module Azure module Terraform - module OverrideProperties - attr_reader :name_in_logs - attr_reader :azure_sdk_definition - attr_reader :acctests - attr_reader :document_examples - attr_reader :datasource_example_outputs - include Provider::Terraform::OverrideProperties - end - class ResourceOverride < Provider::Terraform::ResourceOverride - include Provider::Azure::Terraform::OverrideProperties + class DocumentExampleReference < Api::Object + attr_reader :title + attr_reader :example_name + attr_reader :resource_name_hints def validate super - @acctests ||= Array.new - check_optional_property :name_in_logs, String - check_optional_property :azure_sdk_definition, Api::Azure::SDKDefinitionOverride - check_optional_property :acctests, Array - check_optional_property_list :acctests, AccTestDefinition - check_optional_property :document_examples, Array - check_optional_property_list :document_examples, DocumentExampleReference - check_optional_property :datasource_example_outputs, Hash + check :title, type: ::String, required: true + check :example_name, type: ::String, required: true + check_ext :resource_name_hints, type: ::Hash, key_type: ::String, item_type: ::String end + end - class DocumentExampleReference < Api::Object - attr_reader :title - attr_reader :example_name - attr_reader :resource_name_hints + class DataSourceExampleReference < Api::Object + attr_reader :title + attr_reader :example_name - def validate - super - check_property :title, String - check_property :example_name, String - check_optional_property :resource_name_hints, Hash - check_optional_property_hash :resource_name_hints, String, String - end + def validate + super + check :title, type: ::String, required: true + check :example_name, type: ::String, required: true end + end + + class AccTestDefinition < Api::Object + attr_reader :name + attr_reader :steps - class DataSourceExampleReference < Api::Object - attr_reader :title - attr_reader :example_name + def validate + super + @initialized = false - def validate - super - check_property :title, String - check_property :example_name, String - end + check :name, type: ::String, required: true + check :steps, type: ::Array, item_type: ::String, required: true end + end - class AccTestDefinition < Api::Object - attr_reader :name - attr_reader :steps + class ResourceOverride < Overrides::Terraform::ResourceOverride + def self.attributes + super.concat(%i[ + azure_sdk_definition + name_in_logs + document_examples + acctests + datasource_example_outputs + ]) + end - def validate - super - @initialized = false + attr_reader(*attributes) - check_property :name, String - check_property :steps, Array - check_property_list :steps, String - end + def validate + super + check :azure_sdk_definition, type: Api::Azure::SDKDefinitionOverride + check :name_in_logs, type: ::String + check :document_examples, type: ::Array, item_type: DocumentExampleReference + check :acctests, type: ::Array, item_type: AccTestDefinition + check :datasource_example_outputs, type: ::Hash end - private - - def overriden - Provider::Azure::Terraform::OverrideProperties + def apply(_resource) + filter_azure_sdk_language _resource, "go" + merge_azure_sdk_definition _resource, @azure_sdk_definition + @azure_sdk_definition = nil + super end end + end end end diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index e9bce7bc6275..4ef3a75b79c1 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -47,52 +47,52 @@ def expand_funcs } end - def schema_property_template(property) + def schema_property_template(property, is_data_source) return property.custom_schema_definition unless get_property_value(property, "custom_schema_definition", nil).nil? case property when Api::Azure::Type::ResourceGroupName - 'templates/azure/terraform/schemas/resource_group_name.erb' + !is_data_source ? 'templates/azure/terraform/schemas/resource_group_name.erb' : 'templates/azure/terraform/schemas/datasource_resource_group_name.erb' when Api::Azure::Type::Location - 'templates/azure/terraform/schemas/location.erb' + !is_data_source ? 'templates/azure/terraform/schemas/location.erb' : 'templates/azure/terraform/schemas/datasource_location.erb' when Api::Azure::Type::Tags - 'templates/azure/terraform/schemas/tags.erb' + !is_data_source ? 'templates/azure/terraform/schemas/tags.erb' : 'templates/azure/terraform/schemas/datasource_tags.erb' when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject - 'templates/terraform/schemas/primitive.erb' + 'templates/azure/terraform/schemas/primitive.erb' else - 'templates/terraform/schemas/unsupport.erb' + 'templates/azure/terraform/schemas/unsupport.erb' end end def schema_property_get_template(property) return property.custom_schema_get unless get_property_value(property, "custom_schema_get", nil).nil? - return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) + return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_get.erb' when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject - 'templates/terraform/schemas/basic_get.erb' + 'templates/azure/terraform/schemas/basic_get.erb' else - 'templates/terraform/schemas/unsupport.erb' + 'templates/azure/terraform/schemas/unsupport.erb' end end def schema_property_set_template(property) return property.custom_schema_set unless get_property_value(property, "custom_schema_set", nil).nil? - return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) + return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case property when Api::Azure::Type::Location 'templates/azure/terraform/schemas/location_set.erb' when Api::Azure::Type::Tags 'templates/azure/terraform/schemas/tags_set.erb' when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::KeyValuePairs - 'templates/terraform/schemas/basic_set.erb' + 'templates/azure/terraform/schemas/basic_set.erb' when Api::Type::Array, Api::Type::NestedObject return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type_class == Api::Type::String - 'templates/terraform/schemas/flatten_set.erb' + 'templates/azure/terraform/schemas/flatten_set.erb' else - 'templates/terraform/schemas/unsupport.erb' + 'templates/azure/terraform/schemas/unsupport.erb' end end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index befdb1db98ed..56010b432090 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -24,7 +24,7 @@ def get_sdk_typedef_by_references(references, typedefs) def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? - return 'templates/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) + return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::FloatObject, diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 9e1ff32d7dcf..8f5b270f2098 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -1,6 +1,7 @@ module Provider module Azure module Terraform + module SubTemplate def build_azure_id_parser(sdk_op_def, object, indentation = 4) compile_template 'templates/azure/terraform/sdk/azure_id_parser.erb', @@ -17,7 +18,43 @@ def build_errorf_with_resource_name(format_string, include_error, sdk_op_def, pr properties: properties, object: object end + + def build_azure_schema_property(property, object, indentation = 0, data_source_input = []) + compile_template schema_property_template(property, !data_source_input.empty?), + indentation: indentation, + prop_name: property.name.underscore, + property: property, + data_source_input: data_source_input, + object: object + end + + # Transforms a Cloud API representation of a property into a Terraform + # schema representation. + def build_flatten_method(ef_desc) + compile_template 'templates/azure/terraform/flatten_property_method.erb', + descriptor: ef_desc + end + + # Transforms a Terraform schema representation of a property into a + # representation used by the Cloud API. + def build_expand_method(ef_desc) + compile_template 'templates/azure/terraform/expand_property_method.erb', + descriptor: ef_desc + end + + def build_azure_property_documentation(property, data_source_input = []) + compile_template 'templates/azure/terraform/property_documentation.erb', + property: property, + data_source_input: data_source_input + end + + def build_azure_nested_property_documentation(property, data_source_input = []) + compile_template 'templates/azure/terraform/nested_property_documentation.erb', + property: property, + data_source_input: data_source_input + end end + end end end diff --git a/provider/azure/terraform.rb b/provider/azure/terraform_extension.rb similarity index 58% rename from provider/azure/terraform.rb rename to provider/azure/terraform_extension.rb index e96fb03c6b2c..615c4da2e736 100644 --- a/provider/azure/terraform.rb +++ b/provider/azure/terraform_extension.rb @@ -1,3 +1,4 @@ +require 'provider/azure/terraform/config' require 'provider/azure/terraform/custom_code' require 'provider/azure/terraform/helpers' require 'provider/azure/terraform/schema' @@ -16,7 +17,7 @@ module Provider module Azure - module Terraform + module TerraformExtension include Provider::Azure::Terraform::Helpers include Provider::Azure::Terraform::Schema include Provider::Azure::Terraform::SubTemplate @@ -26,7 +27,8 @@ module Terraform include Provider::Azure::Terraform::Example::Helpers include Provider::Azure::Terraform::AccTest::SubTemplate - def initialize + def initialize(config, api, start_time) + super @provider = 'terraform' end @@ -37,47 +39,59 @@ def azure_tf_types(map) def azure_generate_resource(data) dir = "azurerm" + target_folder = File.join(data.output_folder, dir) + + name = data.object.name.underscore + product_name = data.product.name.underscore filepath = File.join(target_folder, "resource_arm_#{name}.go") - # TODO: Implement this + + data.generate('templates/azure/terraform/resource.erb', filepath, self) + generate_documentation(data) end def azure_generate_documentation(data) + target_folder = data.output_folder + target_folder = File.join(target_folder, 'website', 'docs', 'r') + FileUtils.mkpath target_folder + + name = data.object.name.underscore + product_name = data.product.name.underscore filepath = File.join(target_folder, "#{name}.html.markdown") - # TODO: Implement this + + data.generate('templates/azure/terraform/resource.html.markdown.erb', filepath, self) end def azure_generate_resource_tests(data) dir = "azurerm" + target_folder = File.join(data.output_folder, dir) + + name = data.object.name.underscore + product_name = data.product.name.underscore filepath = File.join(target_folder, "resource_arm_#{name}_test.go") - # TODO: Implement this + + data.product = data.product.name + data.resource_name = data.object.name.camelize(:upper) + data.generate('templates/azure/terraform/test_file.go.erb', filepath, self) end def compile_datasource(data) dir = 'azurerm' - target_folder = File.join(data[:output_folder], dir) + target_folder = File.join(data.output_folder, dir) FileUtils.mkpath target_folder - name = data[:object].name.underscore - product_name = data[:product_name].underscore + + name = data.object.name.underscore + product_name = data.product.name.underscore filepath = File.join(target_folder, "data_source_#{name}.go") - generate_resource_file data.clone.merge( - default_template: 'templates/terraform/datasource.erb', - out_file: filepath - ) + data.generate('templates/azure/terraform/datasource.erb', filepath, self) filepath = File.join(target_folder, "data_source_#{name}_test.go") - generate_resource_file data.clone.merge( - default_template: 'templates/terraform/examples/base_configs/datasource_test.go.erb', - out_file: filepath - ) + data.generate('templates/azure/terraform/datasource_test.go.erb', filepath, self) - target_folder = File.join(data[:output_folder], 'website', 'docs', 'd') + target_folder = File.join(data.output_folder, 'website', 'docs', 'd') FileUtils.mkpath target_folder filepath = File.join(target_folder, "#{name}.html.markdown") - generate_resource_file data.clone.merge( - default_template: 'templates/terraform/datasource.html.markdown.erb', - out_file: filepath - ) + data.generate('templates/azure/terraform/datasource.html.markdown.erb', filepath, self) end end diff --git a/provider/config.rb b/provider/config.rb index da0bfa3e4e1d..a25a4a5f646d 100644 --- a/provider/config.rb +++ b/provider/config.rb @@ -14,14 +14,14 @@ require 'api/object' require 'compile/core' require 'overrides/runner' -require 'provider/azure/config' +require 'provider/azure/config_extension' module Provider # Settings for the provider class Config < Api::Object include Compile::Core + include Provider::Azure::ConfigExtension extend Compile::Core - include Provider::Azure::Config # Overrides for datasources attr_reader :datasources @@ -67,7 +67,7 @@ def self.parse(cfg_file, api = nil, version_name = 'ga') config.resource_override, config.property_override) config.spread_api config, api, [], '' unless api.nil? - azure_parse cfg_file + config.azure_parse cfg_file config.validate api.validate [api, config] diff --git a/provider/terraform.rb b/provider/terraform.rb index d5934705dc2e..1b3f42f0525a 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -21,7 +21,7 @@ require 'overrides/terraform/property_override' require 'provider/terraform/sub_template' require 'google/golang_utils' -require 'provider/azure/terraform' +require 'provider/azure/terraform_extension' module Provider # Code generator for Terraform Resources that manage Google Cloud Platform @@ -30,7 +30,7 @@ class Terraform < Provider::AbstractCore include Provider::Terraform::Import include Provider::Terraform::SubTemplate include Google::GolangUtils - include Provider::Azure::Terraform + include Provider::Azure::TerraformExtension # FileTemplate with Terraform specific fields class TerraformFileTemplate < Provider::FileTemplate @@ -72,7 +72,7 @@ def namespace_property_from_object(property, object) # Converts between the Magic Modules type of an object and its type in the # TF schema def tf_types - azure_tf_types { + azure_tf_types({ Api::Type::Boolean => 'schema.TypeBool', Api::Type::Double => 'schema.TypeFloat', Api::Type::Integer => 'schema.TypeInt', @@ -87,7 +87,7 @@ def tf_types Api::Type::KeyValuePairs => 'schema.TypeMap', Api::Type::Map => 'schema.TypeSet', Api::Type::Fingerprint => 'schema.TypeString' - } + }) end def updatable?(resource, properties) @@ -133,53 +133,62 @@ def titlelize_property(property) # per resource. The resource.erb template forms the basis of a single # GCP Resource on Terraform. def generate_resource(data) - dir = data.version == 'beta' ? 'google-beta' : 'google' - target_folder = File.join(data.output_folder, dir) + # TODO: Azure switch + azure_generate_resource data - name = data.object.name.underscore - product_name = data.product.name.underscore - filepath = File.join(target_folder, "resource_#{product_name}_#{name}.go") + # dir = data.version == 'beta' ? 'google-beta' : 'google' + # target_folder = File.join(data.output_folder, dir) - data.generate('templates/terraform/resource.erb', filepath, self) - generate_documentation(data) + # name = data.object.name.underscore + # product_name = data.product.name.underscore + # filepath = File.join(target_folder, "resource_#{product_name}_#{name}.go") + + # data.generate('templates/terraform/resource.erb', filepath, self) + # generate_documentation(data) end def generate_documentation(data) - target_folder = data.output_folder - target_folder = File.join(target_folder, 'website', 'docs', 'r') - FileUtils.mkpath target_folder - name = data.object.name.underscore - product_name = data.product.name.underscore - - filepath = - File.join(target_folder, "#{product_name}_#{name}.html.markdown") - data.generate('templates/terraform/resource.html.markdown.erb', filepath, self) + # TODO: Azure switch + azure_generate_documentation data + + # target_folder = data.output_folder + # target_folder = File.join(target_folder, 'website', 'docs', 'r') + # FileUtils.mkpath target_folder + # name = data.object.name.underscore + # product_name = data.product.name.underscore + + # filepath = + # File.join(target_folder, "#{product_name}_#{name}.html.markdown") + # data.generate('templates/terraform/resource.html.markdown.erb', filepath, self) end def generate_resource_tests(data) - return if data.object.examples - .reject(&:skip_test) - .reject do |e| - @api.version_obj_or_default(data.version) \ - < @api.version_obj_or_default(e.min_version) - end - .empty? - - dir = data.version == 'beta' ? 'google-beta' : 'google' - target_folder = File.join(data.output_folder, dir) - - name = data.object.name.underscore - product_name = data.product.name.underscore - filepath = - File.join( - target_folder, - "resource_#{product_name}_#{name}_generated_test.go" - ) - - data.product = data.product.name - data.resource_name = data.object.name.camelize(:upper) - data.generate('templates/terraform/examples/base_configs/test_file.go.erb', - filepath, self) + # TODO: Azure switch + azure_generate_resource_tests data + + # return if data.object.examples + # .reject(&:skip_test) + # .reject do |e| + # @api.version_obj_or_default(data.version) \ + # < @api.version_obj_or_default(e.min_version) + # end + # .empty? + + # dir = data.version == 'beta' ? 'google-beta' : 'google' + # target_folder = File.join(data.output_folder, dir) + + # name = data.object.name.underscore + # product_name = data.product.name.underscore + # filepath = + # File.join( + # target_folder, + # "resource_#{product_name}_#{name}_generated_test.go" + # ) + + # data.product = data.product.name + # data.resource_name = data.object.name.camelize(:upper) + # data.generate('templates/terraform/examples/base_configs/test_file.go.erb', + # filepath, self) end def generate_operation(output_folder, _types, version_name) diff --git a/provider/terraform/config.rb b/provider/terraform/config.rb index 5bdbb6f46372..dd05a78b68a4 100644 --- a/provider/terraform/config.rb +++ b/provider/terraform/config.rb @@ -18,8 +18,6 @@ module Provider class Terraform < Provider::AbstractCore # Settings for the provider class Config < Provider::Config - attr_accessor :cfg_file - def provider Provider::Terraform end diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index ea2ea3aa1ab1..150069daf9e0 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -17,12 +17,10 @@ module Provider class Terraform < Provider::AbstractCore # Functions to compile sub-templates. module SubTemplate - def build_schema_property(property, object, indentation = 0) - compile_template schema_property_template(property), - indentation: indentation, - prop_name: property.name.underscore, - property: property, - object: object + def build_schema_property(property, object) + compile_template'templates/terraform/schema_property.erb', + property: property, + object: object end def build_subresource_schema(property, object) @@ -31,20 +29,6 @@ def build_subresource_schema(property, object) object: object end - # Transforms a Cloud API representation of a property into a Terraform - # schema representation. - def build_flatten_method(ef_desc) - compile_template 'templates/terraform/flatten_property_method.erb', - descriptor: ef_desc - end - - # Transforms a Terraform schema representation of a property into a - # representation used by the Cloud API. - def build_expand_method(ef_desc) - compile_template 'templates/terraform/expand_property_method.erb', - descriptor: ef_desc - end - def build_expand_resource_ref(var_name, property) compile_template 'templates/terraform/expand_resource_ref.erb', var_name: var_name, diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index 0cb147cb6b6a..fb654668d644 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -5,13 +5,13 @@ package azurerm <% resource_name = "Arm" + object.name sdk_package = object.azure_sdk_definition.go_client_namespace + sdk_operation = object.azure_sdk_definition.read properties = object.all_user_properties schema_properties = properties.reject{|p| p.name == 'id' || get_property_value(p, 'hide_from_schema', false)} - input_properties = properties.reject(&:output) + input_properties = properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).nil?} flatten_queue = Array.new - sdk_operation = object.azure_sdk_definition.read sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, false sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, schema_properties -%> @@ -21,8 +21,8 @@ func dataSource<%= resource_name -%>() *schema.Resource { Read: dataSource<%= resource_name -%>Read, Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> -<% order_azure_properties(schema_properties).each do |prop| -%> -<%= lines_before(build_schema_property(prop, object, 12)) -%> +<% order_azure_properties(schema_properties, input_properties).each do |prop| -%> +<%= lines_before(build_azure_schema_property(prop, object, 12, input_properties)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> @@ -50,7 +50,7 @@ func dataSource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{ d.SetId(*resp.ID) -<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> +<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.respond_to?(:post_read) && object.custom_code.post_read -%> <%= lines(build_sdk_object_to_property('resp', 'd', sdk_marshal)) -%> diff --git a/templates/azure/terraform/datasource.html.markdown.erb b/templates/azure/terraform/datasource.html.markdown.erb index a064c8bbe6fc..7730046def2e 100644 --- a/templates/azure/terraform/datasource.html.markdown.erb +++ b/templates/azure/terraform/datasource.html.markdown.erb @@ -2,10 +2,10 @@ resource_name = object.name.underscore terraform_name = "azurerm_" + object.name.underscore - properties = object.all_user_properties.reject{|p| get_property_value(p, 'hide_from_schema', false)} - input_properties = properties.reject(&:output) - sdk_operation = object.azure_sdk_definition.read + properties = object.all_user_properties.reject{|p| get_property_value(p, 'hide_from_schema', false)} + input_properties = properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).nil?} + output_properties = properties.select{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).nil?} -%> --- <%= lines(autogen_notice :yaml) -%> @@ -50,29 +50,29 @@ output "<%= outName -%>" { ## Argument Reference The following arguments are supported: -<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_property_documentation(prop, true)) -%> +<% input_properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_property_documentation(prop, input_properties)) -%> <% end -%> -<% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<% input_properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_nested_property_documentation(prop, input_properties)) -%> <% end -%> -<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_property_documentation(prop, true)) -%> +<% input_properties.reject(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_property_documentation(prop, input_properties)) -%> <% end -%> -<% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<% input_properties.reject(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_nested_property_documentation(prop, input_properties)) -%> <% end -%> ## Attributes Reference The following attributes are exported: -<% properties.select(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_property_documentation(prop, true)) -%> +<% output_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_property_documentation(prop, input_properties)) -%> <% end -%> -<% properties.select(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<% output_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> +<%= lines(build_azure_nested_property_documentation(prop, input_properties)) -%> <% end -%> <%- unless object.docs.attributes.nil? -%> <%= "\n" + object.docs.attributes -%> diff --git a/templates/terraform/examples/base_configs/datasource_test.go.erb b/templates/azure/terraform/datasource_test.go.erb similarity index 94% rename from templates/terraform/examples/base_configs/datasource_test.go.erb rename to templates/azure/terraform/datasource_test.go.erb index 3f9b45daab3d..d0ed0d4a12d7 100644 --- a/templates/terraform/examples/base_configs/datasource_test.go.erb +++ b/templates/azure/terraform/datasource_test.go.erb @@ -15,8 +15,9 @@ import ( terraform_name = "azurerm_" + object.name.underscore azure_client_name = object.azure_sdk_definition.go_client + sdk_operation = object.azure_sdk_definition.read properties = object.all_user_properties - input_properties = properties.reject(&:output) + input_properties = properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).nil?} datasource_props = input_properties.map{|p| [p.name.underscore, "${#{terraform_name}.test.#{p.name.underscore}}"]}.to_h test_hcls = Hash.new diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 8f6e1124f762..9efe4345d7b8 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -1,17 +1,3 @@ -<%# The license inside this block applies to this file. - # Copyright 2017 Google Inc. - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. - # You may obtain a copy of the License at - # - # http://www.apache.org/licenses/LICENSE-2.0 - # - # Unless required by applicable law or agreed to in writing, software - # distributed under the License is distributed on an "AS IS" BASIS, - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - # See the License for the specific language governing permissions and - # limitations under the License. --%> <% property = descriptor.property sdk_marshal = descriptor.sdkmarshal @@ -31,7 +17,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in original := raw.(map[string]interface{}) transformed := make(map[string]interface{}) -<% nested_properties(property.value_type).each do |prop| -%> +<% property.value_type.nested_properties.each do |prop| -%> <% next if prop.name == property.key_name -%> transformed<%= titlelize_property(prop) -%>, err := expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) if err != nil { @@ -46,7 +32,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in return m, nil } -<% nested_properties(property.value_type).each do |prop| -%> +<% property.value_type.nested_properties.each do |prop| -%> <% next if prop.name == property.key_name -%> <%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> @@ -64,8 +50,8 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in <% elsif tf_types.include?(property.class) -%> func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% - if !nested_properties(property).empty? - nested_properties = nested_properties(property) + if !property.nested_properties.empty? + nested_properties = property.nested_properties if property.is_set -%> v := input.(*schema.Set).List() diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index cf6ab8f4a78c..2da7734089bb 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -30,7 +30,7 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= result := make(map[string]interface{}) -<%= lines(build_sdk_object_to_property('input', 'result', sdk_marshal.clone(nil, nested_properties(property)))) -%> +<%= lines(build_sdk_object_to_property('input', 'result', sdk_marshal.clone(nil, property.nested_properties))) -%> return []interface{}{result} <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject) -%> @@ -42,7 +42,7 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= for _, item := range input { v := make(map[string]interface{}) -<%= lines(build_sdk_object_to_property('item', 'v', sdk_marshal.clone(nil, nested_properties(property)), 8)) -%> +<%= lines(build_sdk_object_to_property('item', 'v', sdk_marshal.clone(nil, property.nested_properties), 8)) -%> results = append(results, v) } @@ -96,8 +96,8 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= return v <% end # property.is_a?(Api::Type::NestedObject) -%> } -<% if !nested_properties(property).empty? -%> - <% nested_properties(property).each do |prop| -%> +<% if !property.nested_properties.empty? -%> + <% property.nested_properties.each do |prop| -%> <%# lines(build_flatten_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% end -%> diff --git a/templates/azure/terraform/nested_property_documentation.erb b/templates/azure/terraform/nested_property_documentation.erb new file mode 100644 index 000000000000..3f2455884899 --- /dev/null +++ b/templates/azure/terraform/nested_property_documentation.erb @@ -0,0 +1,18 @@ + +<% + if property.nested_properties? && (property.flatten_object.nil? || !property.flatten_object) +-%> +--- + +The `<%= property.name.underscore.singularize -%>` block <%= if property.output || !data_source_input.empty? then "contains" else "supports" end -%> the following: +<%- if property.is_a?(Api::Type::Map) %> +* `<%= property.key_name.underscore -%>` - (Required) The identifier for this object. Format specified above. +<% end -%> +<% property.nested_properties.each do |prop| -%> +<%= lines(build_azure_property_documentation(prop, data_source_input)) -%> +<% end -%> + +<% property.nested_properties.each do |prop| -%> +<%= lines(build_azure_nested_property_documentation(prop, data_source_input)) -%> +<% end -%> +<% end -%> diff --git a/templates/azure/terraform/property_documentation.erb b/templates/azure/terraform/property_documentation.erb index d24e45e91ec3..e6c92ede9c91 100644 --- a/templates/azure/terraform/property_documentation.erb +++ b/templates/azure/terraform/property_documentation.erb @@ -1,14 +1,14 @@ <% prefix = "" - prefix = "(Required) " if property.required && !property.output - prefix = "(Optional) " if !property.required && !property.output + prefix = "(Required) " if property.required && !property.output && data_source_input.empty? || property.required && data_source_input.include?(property) + prefix = "(Optional) " if !property.required && !property.output && data_source_input.empty? || !property.required && data_source_input.include?(property) force_new_postfix = "" - force_new_postfix = " Changing this forces a new resource to be created." if property.input && !property.output && !is_data_source + force_new_postfix = " Changing this forces a new resource to be created." if property.input && !property.output && data_source_input.empty? default_value_postfix = "" - default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil && !property.output + default_value_postfix = " Defaults to `#{property.default_value}`." if property.default_value != nil && !property.output && data_source_input.empty? -%> <% if property.is_a?(Api::Type::NestedObject) || property.is_a?(Api::Type::Map) || (property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::NestedObject)) -%> * `<%= property.name.underscore -%>` - <%= prefix %>One<%= ' or more' unless property.is_a?(Api::Type::NestedObject) -%> `<%= property.name.underscore.singularize -%>` block defined below.<%= force_new_postfix -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 20d519c6cb7b..5d026b8542d1 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -1,17 +1,3 @@ -<%- # the license inside this block applies to this file -# Copyright 2017 Google Inc. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. --%> <%= lines(autogen_notice :go) -%> package azurerm @@ -31,8 +17,6 @@ package azurerm api_name_lower = String.new(product_ns) api_name_lower[0] = api_name_lower[0].downcase api_client_name = api_name_lower.downcase - has_project = object.base_url.include?("{{project}}") - has_self_link = (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> <% resource_name = "Arm" + object.name @@ -83,7 +67,7 @@ func resource<%= resource_name -%>() *schema.Resource { Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> <% order_azure_properties(schema_properties).each do |prop| -%> -<%= lines_before(build_schema_property(prop, object, 12)) -%> +<%= lines_before(build_azure_schema_property(prop, object, 12)) -%> <% end -%> <%= lines(compile(object.custom_code.extra_schema_entry)) if object.custom_code.extra_schema_entry -%> diff --git a/templates/azure/terraform/resource.html.markdown.erb b/templates/azure/terraform/resource.html.markdown.erb index 0eed1f22211e..63574e98a90c 100644 --- a/templates/azure/terraform/resource.html.markdown.erb +++ b/templates/azure/terraform/resource.html.markdown.erb @@ -1,17 +1,3 @@ -<%- # the license inside this block applies to this file -# Copyright 2017 Google Inc. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. --%> <%# NOTE NOTE NOTE The newlines in this file are *load bearing*. This file outputs Markdown, which is extremely sensitive to newlines. You have got @@ -24,7 +10,7 @@ and you must have a newline before and after all - - - hlines. You cannot have more than one blank line between properties. The --- document indicator must be the first line of the file. - As long as you only use `build_property_documentation`, it all works + As long as you only use `build_azure_property_documentation`, it all works fine - but when you need to add custom docs (notes, etc), you need to remember these things. @@ -71,19 +57,6 @@ To get more information about <%= object.name -%>, see: ~> **Warning:** <%= object.docs.warning -%> <%- end -%> -<% unless object.examples.nil? -%> -## Example Usage -<%= "\n" + object.examples -%> - -<% end -%> -<% unless object.example.empty? -%> - <%- object.example.each do |example| -%> -## Example Usage - <%= example.name.camelize(:upper).uncombine %> - - -<%= example.config_documentation -%> - <%- end %> -<%- end -%> <% if object.instance_variable_defined?(:@document_examples) && !object.document_examples.nil? -%> <% object.document_examples.each do |example_ref| -%> ## <%= example_ref.title -%> @@ -99,30 +72,27 @@ To get more information about <%= object.name -%>, see: The following arguments are supported: <% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_property_documentation(prop)) -%> +<%= lines(build_azure_property_documentation(prop)) -%> <% end -%> <% properties.select(&:required).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<%= lines(build_azure_nested_property_documentation(prop)) -%> <% end -%> <% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_property_documentation(prop)) -%> +<%= lines(build_azure_property_documentation(prop)) -%> <% end -%> <% properties.reject(&:required).reject(&:output).sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<%= lines(build_azure_nested_property_documentation(prop)) -%> <% end -%> ## Attributes Reference The following attributes are exported: <% properties.select(&:output).each do |prop| -%> -<%= lines(build_property_documentation(prop)) -%> -<% end -%> -<% if (object.exports || []).any? { |e| e.is_a?(Api::Type::SelfLink)} -%> -* `self_link` - The URI of the created resource. +<%= lines(build_azure_property_documentation(prop)) -%> <% end -%> <% properties.select(&:output).each do |prop| -%> -<%= lines(build_nested_property_documentation(prop)) -%> +<%= lines(build_azure_nested_property_documentation(prop)) -%> <% end -%> <%- unless object.docs.attributes.nil? -%> <%= "\n" + object.docs.attributes -%> diff --git a/templates/terraform/schemas/basic_get.erb b/templates/azure/terraform/schemas/basic_get.erb similarity index 100% rename from templates/terraform/schemas/basic_get.erb rename to templates/azure/terraform/schemas/basic_get.erb diff --git a/templates/terraform/schemas/basic_set.erb b/templates/azure/terraform/schemas/basic_set.erb similarity index 100% rename from templates/terraform/schemas/basic_set.erb rename to templates/azure/terraform/schemas/basic_set.erb diff --git a/templates/terraform/schemas/empty.erb b/templates/azure/terraform/schemas/empty.erb similarity index 100% rename from templates/terraform/schemas/empty.erb rename to templates/azure/terraform/schemas/empty.erb diff --git a/templates/terraform/schemas/flatten_set.erb b/templates/azure/terraform/schemas/flatten_set.erb similarity index 100% rename from templates/terraform/schemas/flatten_set.erb rename to templates/azure/terraform/schemas/flatten_set.erb diff --git a/templates/terraform/schemas/hide_from_schema.erb b/templates/azure/terraform/schemas/hide_from_schema.erb similarity index 100% rename from templates/terraform/schemas/hide_from_schema.erb rename to templates/azure/terraform/schemas/hide_from_schema.erb diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb new file mode 100644 index 000000000000..7a3b249e2c69 --- /dev/null +++ b/templates/azure/terraform/schemas/primitive.erb @@ -0,0 +1,144 @@ +<% + sdk_package = object.azure_sdk_definition.go_client_namespace +-%> +<% if property.flatten_object -%> +<% order_properties(property.properties).each do |prop| -%> +<%= lines(build_azure_schema_property(prop, object, 0, data_source_input)) -%> +<% end -%> +<% elsif tf_types.include?(property.class) -%> +"<%= property.name.underscore -%>": { +<% if property.is_set -%> + Type: schema.TypeSet, +<% else -%> + Type: <%= tf_type(property) %>, +<% end -%> +<% if property.default_from_api && data_source_input.empty? -%> + Computed: true, + Optional: true, +<% if property.schema_config_mode_attr -%> + ConfigMode: schema.SchemaConfigModeAttr, +<% end -%> +<% elsif property.required && (data_source_input.empty? || data_source_input.include?(property)) -%> + Required: true, +<% elsif property.output || (!data_source_input.empty? && !data_source_input.include?(property)) -%> + Computed: true, +<% else -%> + Optional: true, +<% end -%> +<% if property.deprecated? -%> + Deprecated: "<%= property.deprecation_message %>", +<% end -%> +<% if force_new?(property, object) && data_source_input.empty? -%> + ForceNew: true, +<% end -%> +<% unless property.validation.nil? || property.output -%> +<% if !property.validation.regex.nil? && (data_source_input.empty? || data_source_input.include?(property)) -%> + ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), +<% elsif !property.validation.function.nil? && (data_source_input.empty? || data_source_input.include?(property)) -%> + ValidateFunc: <%= property.validation.function -%>, +<% end # property.validation.nil? -%> +<% end # property.validation.nil? -%> +<% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> +<% + enum_values = property.values + sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) +-%> + ValidateFunc: validation.StringInSlice([]string{ +<% enum_values.each do |val| -%> + <%= go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, +<% end -%> + }, false), +<% end -%> +<% if !property.diff_suppress_func.nil? -%> + DiffSuppressFunc: <%= property.diff_suppress_func %>, +<% elsif property.is_a?(Api::Type::ResourceRef) -%> + DiffSuppressFunc: compareSelfLinkOrResourceName, +<% end -%> +<% unless property.state_func.nil? -%> + StateFunc: <%= property.state_func %>, +<% end -%> +<% if property.is_a?(Api::Type::NestedObject) -%> +<%= lines(' MaxItems: 1,') unless property.output || (!data_source_input.empty? && !data_source_input.include?(property)) -%> + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ +<% order_properties(property.properties).each do |prop| -%> +<%= lines(build_azure_schema_property(prop, object, 12, data_source_input)) -%> +<% end -%> + }, + }, +<% elsif property.is_a?(Api::Type::Array) -%> +<% unless property.min_size.nil? && data_source_input.empty? -%> + MinItems: <%= property.min_size %>, +<% end -%> +<% unless property.max_size.nil? && data_source_input.empty? -%> + MaxItems: <%= property.max_size %>, +<% end -%> +<% if property.item_type.is_a?(Api::Type::NestedObject) -%> +<% if property.is_set -%> + Elem: <%= namespace_property_from_object(property, object) -%>Schema(), +<% else -%> + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ +<% order_properties(property.item_type.properties).each do |prop| -%> +<%= lines(build_azure_schema_property(prop, object, 12, data_source_input)) -%> +<% end -%> + }, + }, +<% end -%> +<% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> + Elem: &schema.Schema{ + Type: <%= tf_types[property.item_type] -%>, + }, +<% else # array of basic types -%> + Elem: &schema.Schema{ + Type: <%= tf_types[property.item_type.class] -%>, + }, +<% end -%> +<% if property.is_set -%> +<% if !property.set_hash_func.nil? -%> + Set: <%= property.set_hash_func -%>, +<% elsif property.item_type.is_a?(String) -%> + Set: schema.HashString, +<% else -%> + // Default schema.HashSchema is used. +<% end -%> +<% end -%> +<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> + Elem: &schema.Schema{Type: schema.TypeString}, +<% elsif property.is_a?(Api::Type::Map) -%> + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "<%= property.key_name -%>": { + Type: schema.TypeString, + Required: true, +<% if force_new?(property, object) -%> + ForceNew: true, +<% end -%> + }, +<% order_properties(property.value_type.properties).each do |prop| -%> +<%= lines(build_azure_schema_property(prop, object, 16, data_source_input)) -%> +<% end -%> + }, + }, +<% if !property.set_hash_func.nil? -%> + Set: <%= property.set_hash_func -%>, +<% end -%> +<% end -%> +<% if property.sensitive -%> + Sensitive: true, +<% end -%> +<% unless property.default_value.nil? || !data_source_input.empty? -%> +<% if property.is_a?(Api::Type::Enum) -%> + Default: <%= go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, +<% else -%> + Default: <%= go_literal(property.default_value) -%>, +<% end -%> +<% end -%> +<% unless property.conflicting().empty? -%> +<% conflicting_props = property.conflicting().map(&:name).map(&:underscore) -%> + ConflictsWith: <%= go_literal(conflicting_props) -%>, +<% end -%> +}, +<% else -%> + // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported +<% end # tf_types.include?(property.class) -%> diff --git a/templates/terraform/schemas/unsupport.erb b/templates/azure/terraform/schemas/unsupport.erb similarity index 100% rename from templates/terraform/schemas/unsupport.erb rename to templates/azure/terraform/schemas/unsupport.erb diff --git a/templates/terraform/nested_property_documentation.erb b/templates/terraform/nested_property_documentation.erb index 04af07d7145a..6306eaf23fef 100644 --- a/templates/terraform/nested_property_documentation.erb +++ b/templates/terraform/nested_property_documentation.erb @@ -1,10 +1,7 @@ - <% if property.nested_properties? && (property.flatten_object.nil? || !property.flatten_object) -%> ---- - -The `<%= property.name.underscore.singularize -%>` block <%= if property.output then "contains" else "supports" end -%> the following: +The `<%= property.name.underscore -%>` block <%= if property.output then "contains" else "supports" end -%>: <%- if property.is_a?(Api::Type::Map) %> * `<%= property.key_name.underscore -%>` - (Required) The identifier for this object. Format specified above. <% end -%> @@ -15,4 +12,4 @@ The `<%= property.name.underscore.singularize -%>` block <%= if property.output <% property.nested_properties.each do |prop| -%> <%= lines(build_nested_property_documentation(prop)) -%> <% end -%> -<% end -%> +<% end -%> \ No newline at end of file diff --git a/templates/terraform/schemas/primitive.erb b/templates/terraform/schemas/primitive.erb deleted file mode 100644 index 583cdeead33d..000000000000 --- a/templates/terraform/schemas/primitive.erb +++ /dev/null @@ -1,129 +0,0 @@ -<% - sdk_package = object.azure_sdk_definition.go_client_namespace --%> -<% if tf_types.include?(property.class) -%> -"<%= property.name.underscore -%>": { -<% if property.is_set -%> - Type: schema.TypeSet, -<% else -%> - Type: <%= tf_type(property) %>, -<% end -%> -<% if property.default_from_api -%> - Computed: true, - Optional: true, -<% elsif property.required -%> - Required: true, -<% elsif property.output -%> - Computed: true, -<% else -%> - Optional: true, -<% end -%> -<% if force_new?(property, object) -%> - ForceNew: true, -<% end -%> -<% unless property.validation.nil? || property.output -%> -<% if !property.validation.regex.nil? -%> - ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), -<% elsif !property.validation.function.nil? -%> - ValidateFunc: <%= property.validation.function -%>, -<% end # property.validation.nil? -%> -<% end # property.validation.nil? -%> -<% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output -%> -<% - enum_values = property.values - # enum_values.push "" unless property.required - sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) --%> - ValidateFunc: validation.StringInSlice([]string{ -<% enum_values.each do |val| -%> - <%= go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, -<% end -%> - }, false), -<% end -%> -<% if !property.diff_suppress_func.nil? -%> - DiffSuppressFunc: <%= property.diff_suppress_func %>, -<% elsif property.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, -<% end -%> -<% unless property.state_func.nil? -%> - StateFunc: <%= property.state_func %>, -<% end -%> -<% if property.is_a?(Api::Type::NestedObject) -%> -<%= lines(' MaxItems: 1,') unless property.output -%> - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ -<% order_properties(property.properties).each do |prop| -%> -<%= lines(build_schema_property(prop, object, 12)) -%> -<% end -%> - }, - }, -<% elsif property.is_a?(Api::Type::Array) -%> -<% unless property.min_size.nil? -%> - MinItems: <%= property.min_size %>, -<% end -%> -<% unless property.max_size.nil? -%> - MaxItems: <%= property.max_size %>, -<% end -%> -<% if property.item_type.is_a?(Api::Type::NestedObject) -%> - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ -<% order_properties(property.item_type.properties).each do |prop| -%> -<%= lines(build_schema_property(prop, object, 12)) -%> -<% end -%> - }, - }, -<% elsif property.item_type.is_a?(String) # Basic type like Api::Type::String -%> - Elem: &schema.Schema{ - Type: <%= tf_types[property.item_type] -%>, - }, -<% else # array of basic types -%> - Elem: &schema.Schema{ - Type: <%= tf_types[property.item_type.class] -%>, - <% if property.item_type.is_a?(Api::Type::ResourceRef) -%> - DiffSuppressFunc: compareSelfLinkOrResourceName, - <% end -%> - }, -<% end -%> -<% if property.is_set -%> -<% if !property.set_hash_func.nil? -%> - Set: <%= property.set_hash_func -%>, -<% elsif property.item_type.is_a?(String) -%> - Set: schema.HashString, -<% else -%> - // Default schema.HashSchema is used. -<% end -%> -<% end -%> -<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> - Elem: &schema.Schema{Type: schema.TypeString}, -<% elsif property.is_a?(Api::Type::Map) -%> - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "<%= property.key_name -%>": { - Type: schema.TypeString, - Required: true, - <% if force_new?(property, object) -%> - ForceNew: true, - <% end -%> - }, - <% order_properties(property.value_type.properties).each do |prop| -%> - <%= lines(build_schema_property(prop, object)) -%> - <% end -%> - }, - }, - <% if !property.set_hash_func.nil? -%> - Set: <%= property.set_hash_func -%>, - <% end -%> -<% end -%> -<% if property.sensitive -%> - Sensitive: true, -<% end -%> -<% if !property.default_value.nil? && !property.output -%> - Default: <%= go_literal(property.default_value, sdk_package) -%>, -<% end -%> -<% unless property.conflicts_with.empty? -%> - ConflictsWith: []string{<%= property.conflicts_with.map{ |p| go_literal(p) }.join(', ') -%>}, -<% end -%> -}, -<% else -%> -// TODO: Primitive Property '<%= property.name -%>' of type <%= property.class -%> is not supported -<% end # tf_types.include?(property.class) -%> From 6b3eaee56afbfe9273ab2b2a23212ea0c5303ed5 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 25 Jun 2019 12:42:58 -0700 Subject: [PATCH 109/175] Merge Ansible templates to the latest MM --- api/azure/type_extension.rb | 2 +- azure/python_utils.rb | 2 +- provider/ansible.rb | 106 ++++++++++-------- provider/ansible/config.rb | 1 - provider/ansible/documentation.rb | 12 +- provider/ansible/module.rb | 8 +- provider/azure/ansible/config.rb | 32 ++++++ provider/azure/ansible/documentation.rb | 48 -------- .../azure/ansible/documentation_extension.rb | 71 ++++++++++++ provider/azure/ansible/helpers.rb | 7 ++ provider/azure/ansible/module.rb | 23 ---- provider/azure/ansible/module_extension.rb | 72 ++++++++++++ provider/azure/ansible/resource_override.rb | 8 ++ .../{ansible.rb => ansible_extension.rb} | 49 ++++---- templates/azure/ansible/documentation.erb | 66 +++++++++++ .../azure/ansible/{facts.erb => info.erb} | 67 ++--------- templates/azure/ansible/resource.erb | 68 +---------- .../property_inline_response_format.erb | 2 +- .../sdktypes/property_to_sdkobject.erb | 2 +- 19 files changed, 362 insertions(+), 284 deletions(-) create mode 100644 provider/azure/ansible/config.rb delete mode 100644 provider/azure/ansible/documentation.rb create mode 100644 provider/azure/ansible/documentation_extension.rb delete mode 100644 provider/azure/ansible/module.rb create mode 100644 provider/azure/ansible/module_extension.rb rename provider/azure/{ansible.rb => ansible_extension.rb} (61%) create mode 100644 templates/azure/ansible/documentation.erb rename templates/azure/ansible/{facts.erb => info.erb} (66%) diff --git a/api/azure/type_extension.rb b/api/azure/type_extension.rb index 4bdd076a43e5..05933731dd8e 100644 --- a/api/azure/type_extension.rb +++ b/api/azure/type_extension.rb @@ -12,7 +12,7 @@ module TypeExtension def azure_validate default_order = 10 default_order = 1 if @name == "name" - default_order = 0 if @name == "id" + default_order = -1 if @name == "id" check :order, type: ::Integer, default: default_order check :azure_sdk_references, type: ::Array, item_type: ::String, required: true end diff --git a/azure/python_utils.rb b/azure/python_utils.rb index 0e0d3eedb1c7..44a63d57ecec 100644 --- a/azure/python_utils.rb +++ b/azure/python_utils.rb @@ -7,7 +7,7 @@ module PythonUtils # Azure extended `python_literal` function (see 'google/python_utils.rb') # It will treat Azure SDK enumerations differently def azure_python_literal(value, **opts) - "'#{value.to_s.underscore}'" if value.is_a?(Symbol) + return "'#{value.to_s.underscore}'" if value.is_a?(Symbol) python_literal(value, opts) end diff --git a/provider/ansible.rb b/provider/ansible.rb index def7efd045e8..2d8a52b0b69f 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -23,13 +23,13 @@ require 'provider/ansible/facts_override' require 'overrides/ansible/resource_override' require 'overrides/ansible/property_override' -require 'provider/azure/ansible' +require 'provider/azure/ansible_extension' module Provider # Ansible Provider module containing helper functions and the Ansible Provider # implementation "Core" module Ansible - include Provider::Azure::Ansible + include Provider::Azure::AnsibleExtension # Code generator for Ansible Cookbooks that manage Google Cloud Platform # resources. # TODO(alexstephen): Split up class into multiple modules. @@ -61,7 +61,8 @@ def api_version_setup(version_name) @api.set_properties_based_on_version(version) # Generate version_added_file - @version_added = build_version_added + # TODO: Azure switch + # @version_added = build_version_added version end @@ -234,57 +235,66 @@ def get_example(cfg_file) end def generate_resource(data) - target_folder = data.output_folder - name = module_name(data.object) - path = File.join(target_folder, - "lib/ansible/modules/cloud/google/#{name}.py") - data.generate( - data.object.template || 'templates/ansible/resource.erb', - path, - self - ) + # TODO: Azure switch + azure_generate_resource(data) + + # target_folder = data.output_folder + # name = module_name(data.object) + # path = File.join(target_folder, + # "lib/ansible/modules/cloud/google/#{name}.py") + # data.generate( + # data.object.template || 'templates/ansible/resource.erb', + # path, + # self + # ) end def generate_resource_tests(data) - prod_name = data.object.name.underscore - path = ["products/#{data.product.api_name}", - "examples/ansible/#{prod_name}.yaml"].join('/') - - return unless data.object.has_tests - # Unlike other providers, all resources will not be built at once or - # in close timing to each other (due to external PRs). - # This means that examples might not be built out for every resource - # in a GCP product. - return unless File.file?(path) - - target_folder = data.output_folder - - name = module_name(data.object) - path = File.join(target_folder, - "test/integration/targets/#{name}/tasks/main.yml") - data.generate( - 'templates/ansible/integration_test.erb', - path, - self - ) - - # Generate 'defaults' file that contains variables. - path = File.join(target_folder, - "test/integration/targets/#{name}/defaults/main.yml") - data.generate( - 'templates/ansible/integration_test_variables.erb', - path, - self - ) + # TODO: Azure switch + azure_generate_resource_tests(data) + + # prod_name = data.object.name.underscore + # path = ["products/#{data.product.api_name}", + # "examples/ansible/#{prod_name}.yaml"].join('/') + + # return unless data.object.has_tests + # # Unlike other providers, all resources will not be built at once or + # # in close timing to each other (due to external PRs). + # # This means that examples might not be built out for every resource + # # in a GCP product. + # return unless File.file?(path) + + # target_folder = data.output_folder + + # name = module_name(data.object) + # path = File.join(target_folder, + # "test/integration/targets/#{name}/tasks/main.yml") + # data.generate( + # 'templates/ansible/integration_test.erb', + # path, + # self + # ) + + # # Generate 'defaults' file that contains variables. + # path = File.join(target_folder, + # "test/integration/targets/#{name}/defaults/main.yml") + # data.generate( + # 'templates/ansible/integration_test_variables.erb', + # path, + # self + # ) end def compile_datasource(data) - target_folder = data.output_folder - name = "#{module_name(data.object)}_facts" - data.generate('templates/ansible/facts.erb', - File.join(target_folder, - "lib/ansible/modules/cloud/google/#{name}.py"), - self) + # TODO: Azure switch + azure_compile_datasource(data) + + # target_folder = data.output_folder + # name = "#{module_name(data.object)}_facts" + # data.generate('templates/ansible/facts.erb', + # File.join(target_folder, + # "lib/ansible/modules/cloud/google/#{name}.py"), + # self) end def generate_objects(output_folder, types, version_name) diff --git a/provider/ansible/config.rb b/provider/ansible/config.rb index 7a6ab973e4d4..f453d1f57100 100644 --- a/provider/ansible/config.rb +++ b/provider/ansible/config.rb @@ -18,7 +18,6 @@ module Provider module Ansible # Settings for the Ansible provider class Config < Provider::Config - attr_accessor :cfg_file attr_reader :manifest def provider diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 07e25ffadabb..648bcb30f3c2 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -14,7 +14,7 @@ require 'compile/core' require 'provider/config' require 'provider/core' -require 'provider/azure/ansible/documentation' +require 'provider/azure/ansible/documentation_extension' # Rubocop doesn't like this file because the hashes are complicated. # Humans like this file because the hashes are explicit and easy to read. @@ -22,12 +22,12 @@ module Provider module Ansible # Responsible for building out YAML documentation blocks. module Documentation - include Provider::Azure::Ansible::Documentation + include Provider::Azure::Ansible::DocumentationExtension # Builds out the DOCUMENTATION for a property. # This will eventually be converted to YAML def documentation_for_property(prop) required = prop.required && !prop.default_value ? true : false - azure_documentation_for_property({ + { prop.name.underscore => { 'description' => [ format_description(prop.description), @@ -53,7 +53,7 @@ def documentation_for_property(prop) end ) }.reject { |_, v| v.nil? } - }) + } end # Builds out the RETURNS for a property. @@ -68,7 +68,7 @@ def returns_for_property(prop) type = 'complex' if prop.is_a?(Api::Type::NestedObject) \ || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) - azure_returns_for_property({ + { prop.name => { 'description' => format_description(prop.description), 'returned' => 'success', @@ -80,7 +80,7 @@ def returns_for_property(prop) end ) }.reject { |_, v| v.nil? } - }) + } end def autogen_notice_contrib diff --git a/provider/ansible/module.rb b/provider/ansible/module.rb index 2c85c7e77e43..cf0a5ab28f23 100644 --- a/provider/ansible/module.rb +++ b/provider/ansible/module.rb @@ -12,7 +12,7 @@ # limitations under the License. require 'google/python_utils' -require 'provider/azure/ansible/module' +require 'provider/azure/ansible/module_extension' module Provider module Ansible @@ -20,7 +20,7 @@ module Ansible # AnsibleModule is responsible for input validation. module Module include Google::PythonUtils - include Provider::Azure::Ansible::Module + include Provider::Azure::Ansible::ModuleExtension # Returns an array of all base options for a given property. def ansible_module(properties) properties.reject(&:output) @@ -29,7 +29,7 @@ def ansible_module(properties) end def python_dict_for_property(prop) - azure_python_dict_for_property({ + { prop.name.underscore => { 'required' => (true if prop.required && !prop.default_value), 'default' => prop.default_value, @@ -44,7 +44,7 @@ def python_dict_for_property(prop) end ) }.reject { |_, v| v.nil? } - }) + } end # GcpModule is acting as a dictionary and doesn't need the dict() notation on diff --git a/provider/azure/ansible/config.rb b/provider/azure/ansible/config.rb new file mode 100644 index 000000000000..696735544b93 --- /dev/null +++ b/provider/azure/ansible/config.rb @@ -0,0 +1,32 @@ +require 'provider/ansible/config' + +module Provider + module Azure + module Ansible + + class Config < Provider::Ansible::Config + attr_reader :author + attr_reader :version_added + + def provider + Provider::Ansible::Core + end + + def resource_override + Provider::Azure::Ansible::ResourceOverride + end + + def property_override + Provider::Azure::Ansible::PropertyOverride + end + + def validate + super + check :author, type: ::String, required: true + check :version_added, type: ::String, required: true + end + end + + end + end +end diff --git a/provider/azure/ansible/documentation.rb b/provider/azure/ansible/documentation.rb deleted file mode 100644 index 0d590aee859d..000000000000 --- a/provider/azure/ansible/documentation.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Provider - module Azure - module Ansible - module Documentation - - def azure_documentation_for_property(prop, dict, object) - orig_name = prop.name.underscore - new_name = python_variable_name(prop, object.azure_sdk_definition.create) - dict[new_name] = dict.delete(orig_name) - dict[new_name]['required'] = false if is_location?(prop) - dict[new_name]['type'] = python_type(prop) - dict[new_name]['choices'] = prop.values.map{|v| v.to_s.underscore} if prop.is_a? Api::Type::Enum - dict[new_name]['description'] << azure_resource_ref_description(prop) if prop.is_a?(Api::Azure::Type::ResourceReference) - dict - end - - def azure_returns_for_property(prop, dict, object) - orig_name = prop.name - new_name = python_variable_name(prop, object.azure_sdk_definition.create) - dict[new_name] = dict.delete(orig_name) - - dict[new_name]['type'] = 'str' if prop.is_a? Api::Azure::Type::ResourceReference - dict[new_name]['returned'] = 'always' - sample = prop.document_sample_value || prop.sample_value - dict[new_name]['sample'] = sample unless sample.nil? - - dict - end - - def azure_autogen_notic_contrib(lines) - lines[1] = 'https://github.com/Azure/magic-module-specs' - lines - end - - private - - def azure_resource_ref_description(prop) - [ - "It can be the #{prop.resource_type_name} name which is in the same resource group.", - "It can be the #{prop.resource_type_name} ID. e.g., #{prop.document_sample_value || prop.sample_value}.", - "It can be a dict which contains C(name) and C(resource_group) of the #{prop.resource_type_name}." - ] - end - - end - end - end -end diff --git a/provider/azure/ansible/documentation_extension.rb b/provider/azure/ansible/documentation_extension.rb new file mode 100644 index 000000000000..bf30e9325821 --- /dev/null +++ b/provider/azure/ansible/documentation_extension.rb @@ -0,0 +1,71 @@ +module Provider + module Azure + module Ansible + module DocumentationExtension + + def azure_documentation_for_property(prop, object, is_data_source = false) + required = prop.required && !prop.default_value && !is_location?(prop) ? true : nil + { + azure_python_variable_name(prop, object.azure_sdk_definition.create) => { + 'description' => [ + (is_data_source && is_tags?(prop) ? "Limit results by providing a list of tags. Format tags as 'key' or 'key:value'." : format_description(prop.description)), + (resourceref_description(prop) if prop.is_a?(Api::Type::ResourceRef) && !prop.resource_ref.readonly), + (azure_resource_ref_description(prop) if prop.is_a?(Api::Azure::Type::ResourceReference)) + ].flatten.compact, + 'required' => required, + 'default' => (prop.default_value.to_s.underscore if prop.default_value), + 'type' => azure_python_type(prop), + 'choices' => (prop.values.map{|v| v.to_s.underscore} if prop.is_a?(Api::Type::Enum)), + 'aliases' => prop.aliases, + 'suboptions' => ( + if (prop.is_a?(Api::Type::NestedObject) || prop.is_a?(Api::Type::Array) && prop.item_type.is_a?(Api::Type::NestedObject)) && prop.nested_properties? + prop.nested_properties.reject(&:output).map { |p| azure_documentation_for_property(p, object) } + .reduce({}, :merge) + end + ) + }.reject { |_, v| v.nil? } + } + end + + def azure_returns_for_property(prop, object) + type = azure_python_type(prop) || 'str' + type = 'str' if type == 'path' || prop.is_a?(Api::Azure::Type::ResourceReference) + type = 'complex' if prop.is_a?(Api::Type::NestedObject) \ + || (prop.is_a?(Api::Type::Array) \ + && prop.item_type.is_a?(Api::Type::NestedObject)) + sample = prop.document_sample_value || prop.sample_value + { + azure_python_variable_name(prop, object.azure_sdk_definition.create) => { + 'description' => format_description(prop.description), + 'returned' => 'always', + 'type' => type, + 'sample' => sample, + 'contains' => ( + if prop.nested_properties? + prop.nested_properties.map { |p| azure_returns_for_property(p, object) } + .reduce({}, :merge) + end + ) + }.reject { |_, v| v.nil? } + } + end + + def azure_autogen_notic_contrib(lines) + lines[1] = 'https://github.com/Azure/magic-module-specs' + lines + end + + private + + def azure_resource_ref_description(prop) + [ + "It can be the #{prop.resource_type_name} name which is in the same resource group.", + "It can be the #{prop.resource_type_name} ID. e.g., #{prop.document_sample_value || prop.sample_value}.", + "It can be a dict which contains C(name) and C(resource_group) of the #{prop.resource_type_name}." + ] + end + + end + end + end +end diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index 53c244590b41..96bf61851c87 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -36,6 +36,13 @@ def always_has_value?(property) property.required || !property.default_value.nil? end + def order_azure_properties(properties, data_source_input = []) + special_props = properties.select{|p| p.name == 'id' || p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} + other_props = properties.reject{|p| p.name == 'id' || p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} + sorted_special = special_props.sort_by{|p| p.name == 'resourceGroup' || p.name == 'resourceGroupName' ? 0 : p.order } + sorted_special + other_props.sort_by(&:name) + end + def word_wrap_for_yaml(lines, width = 160) wrapped = Array.new lines.each do |line| diff --git a/provider/azure/ansible/module.rb b/provider/azure/ansible/module.rb deleted file mode 100644 index e997ba3a21b5..000000000000 --- a/provider/azure/ansible/module.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'azure/python_utils' - -module Provider - module Azure - module Ansible - module Module - - include ::Azure::PythonUtils - - def azure_python_dict_for_property(prop, dict, object) - orig_name = prop.name.underscore - new_name = python_variable_name(prop, object.azure_sdk_definition.create) - dict[new_name] = dict.delete(orig_name) - dict[new_name]['required'] = false if is_location?(prop) - dict[new_name]['updatable'] = false if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop) - dict[new_name]['disposition'] = '/' if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop) - dict - end - - end - end - end -end diff --git a/provider/azure/ansible/module_extension.rb b/provider/azure/ansible/module_extension.rb new file mode 100644 index 000000000000..944a0b06065b --- /dev/null +++ b/provider/azure/ansible/module_extension.rb @@ -0,0 +1,72 @@ +require 'google/python_utils' +require 'azure/python_utils' + +module Provider + module Azure + module Ansible + module ModuleExtension + + include Google::PythonUtils + include ::Azure::PythonUtils + + def azure_python_dict_for_property(prop, object, spaces = 0) + if prop.is_a?(Api::Type::Array) && \ + prop.item_type.is_a?(Api::Type::NestedObject) + azure_nested_obj_dict(prop, object, prop.item_type.properties, spaces) + elsif prop.is_a? Api::Type::NestedObject + azure_nested_obj_dict(prop, object, prop.properties, spaces) + else + name = azure_python_variable_name(prop, object.azure_sdk_definition.create) + options = azure_prop_options(prop, object, spaces).join("\n") + "#{name}=dict(\n#{indent_list(options, 4)}\n)" + end + end + + private + + # Creates a Python dictionary representing a nested object property + # for validation. + def azure_nested_obj_dict(prop, object, properties, spaces) + name = python_variable_name(prop, object.azure_sdk_definition.create) + options = azure_prop_options(prop, object, spaces).join("\n") + [ + "#{name}=dict(\n#{indent_list(options, 4, true)}\n options=dict(", + indent_list(properties.map do |p| + python_dict_for_property(p, object, spaces + 4) + end, 8), + " )\n)" + ] + end + + # Returns an array of all base options for a given property. + def azure_prop_options(prop, _object, spaces) + [ + ('required=True' if prop.required && !prop.default_value && !is_location?(prop)), + ("default=#{azure_python_literal(prop.default_value)}" \ + if prop.default_value), + "type=#{quote_string(azure_python_type(prop))}", + (azure_choices_enum(prop, spaces) if prop.is_a? Api::Type::Enum), + ("elements=#{quote_string(azure_python_type(prop.item_type))}" \ + if prop.is_a? Api::Type::Array), + ("aliases=[#{prop.aliases.map { |x| quote_string(x) }.join(', ')}]" \ + if prop.aliases), + ('updatable=False' if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop)), + ("disposition='/'" if prop.input && !is_resource_group?(prop) && !is_resource_name?(prop)) + ].compact + end + + # Returns a formatted string represented the choices of an enum + def azure_choices_enum(prop, spaces) + name = prop.out_name.underscore + type = "type=#{quote_string(azure_python_type(prop))}" + # + 6 for =dict( + choices_indent = spaces + name.length + type.length + 6 + "choices=[#{prop.values.map do |x| + quote_string(x.to_s.underscore) + end.join(', ')}]" + end + + end + end + end +end diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index 17c051cfacb1..b9f19e9e4c0b 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -30,6 +30,7 @@ def validate class ResourceOverride < Overrides::Ansible::ResourceOverride def self.attributes super.concat(%i[ + azure_sdk_definition inttests examples ]) @@ -42,6 +43,13 @@ def validate check :examples, type: ::Array, default: [], item_type: DocumentExampleReference check :inttests, type: ::Array, default: [], item_type: IntegrationTestDefinition end + + def apply(_resource) + filter_azure_sdk_language _resource, "python" + merge_azure_sdk_definition _resource, @azure_sdk_definition + @azure_sdk_definition = nil + super + end end end diff --git a/provider/azure/ansible.rb b/provider/azure/ansible_extension.rb similarity index 61% rename from provider/azure/ansible.rb rename to provider/azure/ansible_extension.rb index 26a64ea567e7..54162d4f56a6 100644 --- a/provider/azure/ansible.rb +++ b/provider/azure/ansible_extension.rb @@ -1,3 +1,4 @@ +require 'provider/azure/ansible/config' require 'provider/azure/ansible/helpers' require 'provider/azure/ansible/sub_template' require 'provider/azure/ansible/sdk/sdk_marshal_descriptor' @@ -13,7 +14,7 @@ module Provider module Azure - module Ansible + module AnsibleExtension include Provider::Azure::Ansible::Helpers include Provider::Azure::Ansible::SDK::Helpers include Provider::Azure::Ansible::SubTemplate @@ -22,14 +23,15 @@ module Ansible include Provider::Azure::Ansible::Example::Helpers include Provider::Azure::Ansible::Example::SubTemplate - def initialize + def initialize(config, api, start_time) + super @provider = 'ansible' end def azure_python_type(prop) return 'raw' if prop.is_a? Api::Azure::Type::ResourceReference return 'list' if prop.is_a? Api::Azure::Type::Tags - nil + python_type prop end def azure_module_name(object) @@ -37,42 +39,33 @@ def azure_module_name(object) end def azure_generate_resource(data) + target_folder = data.output_folder path = File.join(target_folder, "lib/ansible/modules/cloud/azure/#{azure_module_name(data.object)}.py") - # TODO: Implement this + data.generate( + data.object.template || 'templates/azure/ansible/resource.erb', + path, + self + ) end def azure_generate_resource_tests(data) - prod_name = data[:object].name.underscore - path = ["products/#{data[:product_name]}", - "examples/ansible/#{prod_name}.yaml"].join('/') - - return unless data[:object].has_tests - return if data[:object].inttests.empty? - - target_folder = data[:output_folder] - FileUtils.mkpath target_folder + return unless data.object.has_tests + return if data.object.inttests.empty? - name = module_name(data[:object]) + name = azure_module_name(data.object) + target_folder = data.output_folder target_folder = File.join(target_folder, "test/integration/targets/#{name}") - generate_resource_file data.clone.merge( - default_template: 'templates/ansible/integration_test.erb', - out_file: File.join(target_folder, 'tasks/main.yml') - ) - generate_resource_file data.clone.merge( - default_template: 'templates/azure/ansible/test/meta.erb', - out_file: File.join(target_folder, 'meta/main.yml') - ) - generate_resource_file data.clone.merge( - default_template: 'templates/azure/ansible/test/aliases.erb', - out_file: File.join(target_folder, 'aliases') - ) + data.generate('templates/azure/ansible/integration_test.erb', File.join(target_folder, 'tasks/main.yml'), self) + data.generate('templates/azure/ansible/test/meta.erb', File.join(target_folder, 'meta/main.yml'), self) + data.generate('templates/azure/ansible/test/aliases.erb', File.join(target_folder, 'aliases'), self) end def azure_compile_datasource(data) - name = "#{module_name(data.object)}_info" + target_folder = data.output_folder + name = "#{azure_module_name(data.object)}_info" path = File.join(target_folder, "lib/ansible/modules/cloud/azure/#{name}.py") - # TODO: Implement this + data.generate('templates/azure/ansible/info.erb', path, self) end end diff --git a/templates/azure/ansible/documentation.erb b/templates/azure/ansible/documentation.erb new file mode 100644 index 000000000000..3e426c9a4c74 --- /dev/null +++ b/templates/azure/ansible/documentation.erb @@ -0,0 +1,66 @@ +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + + +DOCUMENTATION = ''' +--- +module: <%= azure_module_name(object) -%><%= is_data_source ? lines('_info') : "\n" -%> +version_added: "<%= @config.version_added.to_f -%>" +short_description: <%= lines(object.description) -%> +description: + - <%= lines(is_data_source ? object.description + '.' : "Create, update and delete instance of Azure #{object.name.titlecase}.") -%> + +<%= lines(word_wrap_for_yaml(to_yaml({ + 'options' => [ + input_properties.reject{|p| is_tags?(p) && !is_data_source}.map{|p| azure_documentation_for_property(p, object, is_data_source)}, + ({ + 'state' => { + 'description' => [ + "Assert the state of the #{object.name.titlecase}.", + "Use 'present' to create or update a #{object.name.titlecase} and 'absent' to delete it." + ], + 'default' => 'present', + 'choices' => ['present', 'absent'], + }, + } if !is_data_source) + ].flatten.compact.reduce({}, :merge), + 'notes' => ( + [ + ("API Reference: U(#{object.references.api})" if object.references.api), + object.references.guides.map { |guide, link| "#{guide}: U(#{link})" } + ].flatten.compact if object.references + ) +}, { :line_width => -1, :indentation => 4 }).split("\n"))) -%> + +extends_documentation_fragment: + - azure + <%= lines('- azure_tags') if is_tags_defined?(object) && !is_data_source -%> + +author: + - "<%= @config.author -%>" +''' + +<% unless object.examples.empty? -%> +<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(exref))} -%> +EXAMPLES = ''' +<%= lines(indent(code.join("\n"), 2)) -%> +''' +<% end -%> + +<% + output_hash = output_properties.map{|p| azure_returns_for_property(p, object)}.reduce({}, :merge) + output_hash = { + 'items' => { + 'description' => 'List of items', + 'returned' => 'always', + 'type' => 'complex', + 'contains' => output_hash + } + } if is_data_source +-%> +RETURN = ''' +<%= lines(word_wrap_for_yaml(to_yaml( + output_hash, + { :line_width => -1, :indentation => 4 }).split("\n"))) -%> +''' \ No newline at end of file diff --git a/templates/azure/ansible/facts.erb b/templates/azure/ansible/info.erb similarity index 66% rename from templates/azure/ansible/facts.erb rename to templates/azure/ansible/info.erb index 304d91feb2d1..bdbd2d8748b7 100644 --- a/templates/azure/ansible/facts.erb +++ b/templates/azure/ansible/info.erb @@ -1,6 +1,6 @@ #!/usr/bin/python # -# Copyright (C) 2019 <%= lines(@config.manifest.get('author', object)) -%> +# Copyright (C) 2019 <%= lines(@config.author) -%> # # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) @@ -9,69 +9,17 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -<% - metadata_version = quote_string(@config.manifest.get('metadata_version', - object)) - supported_by = quote_string(@config.manifest.get('supported_by', object)) - - uri_props = object.uri_properties.reject { |para| para.nil? || para.name == 'name' } --%> <% python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] - input_properties = object.all_user_properties.reject{|p| p.output || get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.read.request).nil?}.sort_by{|p| [p.order, p.name]} - output_properties = object.all_user_properties.sort_by{|p| [p.order, p.name]} --%> -ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, - 'status': <%= @config.manifest.get('status', object) -%>, - 'supported_by': <%= supported_by -%>} - -DOCUMENTATION = ''' ---- -module: <%= module_name(object) -%>_info -version_added: "<%= @config.manifest.get('version_added', object).to_f -%>" -short_description: Gather info for Azure <%= lines(object.name.titlecase) -%> -description: - - Gather info for Azure <%= object.name.titlecase -%>. + is_data_source = true -<% - if is_tags_defined?(object) - tags_prop = get_tags_property(object).clone - tags_prop.instance_variable_set(:@description, "Limit results by providing a list of tags. Format tags as 'key' or 'key:value'.") - end + sdk_operation = object.azure_sdk_definition.read.request + input_properties = order_azure_properties(object.all_user_properties.reject{|p| !is_tags?(p) && (p.output || get_applicable_reference(p.azure_sdk_references, sdk_operation).nil?)}) + output_properties = order_azure_properties(object.all_user_properties) -%> -<%= to_yaml({ - 'options' => [ - input_properties.map{|p| documentation_for_property(p, object)}, - (documentation_for_property(tags_prop, object) if is_tags_defined?(object)) - ].flatten.compact.reduce({}, :merge) -}) -%> - -extends_documentation_fragment: - - azure - -author: - - "<%= @config.manifest.get('author', object) -%>" -''' - -<% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(exref))} -%> -EXAMPLES = ''' -<%= lines(indent(code.join("\n"), 2)) -%> -''' -<% end -%> - -RETURN = ''' -<%= lines(word_wrap_for_yaml(to_yaml({ - 'items' => { - 'description' => 'List of items', - 'returned' => 'always', - 'type' => 'complex', - 'contains' => output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge) - } -}).split("\n"))) -%> -''' +<%= lines(compile('templates/azure/ansible/documentation.erb')) -%> from ansible.module_utils.azure_rm_common import AzureRMModuleBase @@ -88,8 +36,7 @@ class AzureRM<%= object.name -%>Info(AzureRMModuleBase): def __init__(self): # define user inputs into argument self.module_arg_spec = dict( -<%= indent_list(input_properties.map{|p| python_dict_for_property(p, object)}, 12, false) -%> -<%= ",\n" + indent(python_dict_for_property(get_tags_property(object), object), 12) if is_tags_defined?(object) -%> +<%= indent_list(input_properties.map{|p| azure_python_dict_for_property(p, object)}, 12, false) -%> <%= "\n" -%> ) # store the results of the module operation self.results = dict( diff --git a/templates/azure/ansible/resource.erb b/templates/azure/ansible/resource.erb index c640beabaa2c..c1a115ef1503 100644 --- a/templates/azure/ansible/resource.erb +++ b/templates/azure/ansible/resource.erb @@ -1,6 +1,6 @@ #!/usr/bin/python # -# Copyright (C) 2019 <%= lines(@config.manifest.get('author', object)) -%> +# Copyright (C) 2019 <%= lines(@config.author) -%> # # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) @@ -9,74 +9,18 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -<% - metadata_version = quote_string(@config.manifest.get('metadata_version', - object)) - supported_by = quote_string(@config.manifest.get('supported_by', object)) - update_props = properties_by_custom_update(object.all_user_properties) --%> <% combine_create_update = object.azure_sdk_definition.update.nil? || (object.azure_sdk_definition.create.python_func_name == object.azure_sdk_definition.update.python_func_name) python_sdk_client = object.azure_sdk_definition.python_client.split(".")[0] python_sdk_sub_client = object.azure_sdk_definition.python_client.split(".")[1] - input_properties = object.all_user_properties.reject(&:output).sort_by{|p| [p.order, p.name]} + is_data_source = false + + input_properties = order_azure_properties(object.all_user_properties.reject(&:output)) output_properties = object.all_user_properties.select(&:output) root_object_field = object.azure_sdk_definition.create.request["/"].python_variable_name -%> -ANSIBLE_METADATA = {'metadata_version': <%= metadata_version -%>, - 'status': [<%= @config.manifest.get('status', object).map{|item| "'#{item}'"}.join(', ') -%>], - 'supported_by': <%= supported_by -%>} - - -DOCUMENTATION = ''' ---- -module: <%= lines(module_name(object)) -%> -version_added: "<%= @config.manifest.get('version_added', object).to_f -%>" -short_description: <%= lines(object.description) -%> -description: - - Create, update and delete instance of Azure <%= object.name.titlecase -%>. - -<%= lines(word_wrap_for_yaml(to_yaml({ - 'options' => [ - input_properties.reject{|p| is_tags?(p)}.map{|p| documentation_for_property(p, object)}, - { - 'state' => { - 'description' => [ - "Assert the state of the #{object.name.titlecase}.", - "Use 'present' to create or update a #{object.name.titlecase} and 'absent' to delete it." - ], - 'default' => 'present', - 'choices' => ['present', 'absent'], - }, - } - ].flatten.compact.reduce({}, :merge), - 'notes' => ( - [ - ("API Reference: U(#{object.references.api})" if object.references.api), - object.references.guides.map { |guide, link| "#{guide}: U(#{link})" } - ].flatten.compact if object.references - ) -}).split("\n"))) -%> - -extends_documentation_fragment: - - azure - <%= lines('- azure_tags') if is_tags_defined?(object) -%> - -author: - - "<%= @config.manifest.get('author', object) -%>" -''' - -<% unless object.examples.empty? -%> -<% code = object.examples.map{|exref| lines(build_documentation_yaml_from_example(exref))} -%> -EXAMPLES = ''' -<%= lines(indent(code.join("\n"), 2)) -%> -''' -<% end -%> - -RETURN = ''' -<%= lines(word_wrap_for_yaml(to_yaml(output_properties.map{|p| returns_for_property(p, object)}.reduce({}, :merge)).split("\n"))) -%> -''' +<%= lines(compile('templates/azure/ansible/documentation.erb')) -%> import time <%= lines('from ansible.module_utils.azure_rm_common import normalize_location_name') if is_location_defined?(object) -%> @@ -104,7 +48,7 @@ class AzureRM<%= object.name -%>(AzureRMModuleBaseExt): def __init__(self): self.module_arg_spec = dict( -<%= lines(indent_list(input_properties.reject{|p| is_tags?(p)}.map{|p| python_dict_for_property(p, object)}, 12, true)) -%> +<%= lines(indent_list(input_properties.reject{|p| is_tags?(p)}.map{|p| azure_python_dict_for_property(p, object)}, 12, true)) -%> state=dict( type='str', default='present', diff --git a/templates/azure/ansible/sdktypes/property_inline_response_format.erb b/templates/azure/ansible/sdktypes/property_inline_response_format.erb index 25aa186fec1e..fc2511b1ed85 100644 --- a/templates/azure/ansible/sdktypes/property_inline_response_format.erb +++ b/templates/azure/ansible/sdktypes/property_inline_response_format.erb @@ -1,5 +1,5 @@ <% - py_var = python_variable_name(property, sdk_operation) + py_var = azure_python_variable_name(property, sdk_operation) py_fields = [] sdk_ref = get_applicable_reference(property.azure_sdk_references, sdk_operation.response) unless sdk_ref.nil? diff --git a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb index ed476f052114..3f912824d855 100644 --- a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb @@ -5,7 +5,7 @@ relative_refs = ref[sdk_marshal.parent_reference.length..-1].split('/') next if relative_refs.length == 0 - var = python_variable_name(prop, sdk_marshal.operation) + var = azure_python_variable_name(prop, sdk_marshal.operation) sdk_type = sdk_marshal.operation.request[ref] need_normalize = (relative_refs.length > 1) if relative_refs.length == 1 From e58115adeb7db556d0f32325b0312484b2300576 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 25 Jun 2019 14:23:45 -0700 Subject: [PATCH 110/175] Remove unused Azure generated code. --- azure/golang_utils.rb | 12 + .../cloud/azure/azure_rm_batchaccount.py | 336 ---------------- .../cloud/azure/azure_rm_batchaccount_info.py | 221 ----------- .../targets/azure_rm_batchaccount/aliases | 3 - .../azure_rm_batchaccount/meta/main.yml | 2 - .../azure_rm_batchaccount/tasks/main.yml | 52 --- .../tasks/main.yml | 107 ----- .../data_source_automation_string_variable.go | 90 ----- ..._source_automation_string_variable_test.go | 55 --- .../azurerm/data_source_batch_account.go | 106 ----- .../azurerm/data_source_batch_account_test.go | 55 --- .../resource_arm_api_management_diagnostic.go | 371 ------------------ ...urce_arm_api_management_diagnostic_test.go | 76 ---- .../resource_arm_api_management_policy.go | 164 -------- ...resource_arm_api_management_policy_test.go | 217 ---------- .../resource_arm_automation_null_variable.go | 155 -------- ...ource_arm_automation_null_variable_test.go | 211 ---------- ...resource_arm_automation_string_variable.go | 178 --------- ...rce_arm_automation_string_variable_test.go | 212 ---------- .../azurerm/resource_arm_batch_account.go | 299 -------------- .../resource_arm_batch_account_test.go | 126 ------ .../resource_arm_container_registry.go | 237 ----------- .../resource_arm_container_registry_test.go | 74 ---- .../azurerm/resource_arm_front_door.go | 198 ---------- .../resource_arm_front_door_backend_pool.go | 294 -------------- ...source_arm_front_door_backend_pool_test.go | 76 ---- ...source_arm_front_door_frontend_endpoint.go | 200 ---------- ...e_arm_front_door_frontend_endpoint_test.go | 76 ---- .../azurerm/resource_arm_front_door_test.go | 74 ---- .../azurerm/resource_arm_resource_group.go | 142 ------- .../resource_arm_resource_group_test.go | 72 ---- ...rm_service_bus_disaster_recovery_config.go | 160 -------- ...rvice_bus_disaster_recovery_config_test.go | 76 ---- .../automation_string_variable.html.markdown | 63 --- .../docs/d/batch_account.html.markdown | 75 ---- .../r/api_management_diagnostic.html.markdown | 105 ----- .../r/api_management_policy.html.markdown | 80 ---- .../r/automation_null_variable.html.markdown | 77 ---- .../automation_string_variable.html.markdown | 79 ---- .../docs/r/batch_account.html.markdown | 93 ----- .../docs/r/container_registry.html.markdown | 78 ---- .../website/docs/r/front_door.html.markdown | 73 ---- .../r/front_door_backend_pool.html.markdown | 105 ----- ...front_door_frontend_endpoint.html.markdown | 49 --- .../docs/r/resource_group.html.markdown | 55 --- ...bus_disaster_recovery_config.html.markdown | 59 --- compiler.rb | 6 +- google/golang_utils.rb | 6 +- overrides/validator.rb | 2 - products/azfrontdoor/api.yaml | 195 --------- .../azfrontdoor/examples/terraform/basic.yaml | 10 - products/azfrontdoor/terraform.yaml | 16 - products/azfrontdoorbackendpool/api.yaml | 232 ----------- .../examples/terraform/basic.yaml | 18 - .../azfrontdoorbackendpool/terraform.yaml | 17 - products/azfrontdoorfrontendpoint/api.yaml | 174 -------- .../azfrontdoorfrontendpoint/terraform.yaml | 8 - .../examples/ansible/basic.yaml | 8 - .../examples/terraform/basic.yaml | 12 - provider/azure/terraform/sub_template.rb | 8 +- provider/terraform.rb | 2 + provider/terraform/sub_template.rb | 25 +- .../terraform/expand_property_method.erb | 4 +- .../terraform/flatten_property_method.erb | 2 +- templates/azure/terraform/resource.erb | 4 +- .../azure/terraform/schemas/primitive.erb | 8 +- .../examples/container_registry.tf.erb | 21 - .../terraform/examples/resource_group.tf.erb | 8 - .../nested_property_documentation.erb | 1 + 69 files changed, 56 insertions(+), 6449 deletions(-) create mode 100644 azure/golang_utils.rb delete mode 100644 build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py delete mode 100644 build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py delete mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/aliases delete mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml delete mode 100644 build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml delete mode 100644 build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml delete mode 100644 build/azterraform/azurerm/data_source_automation_string_variable.go delete mode 100644 build/azterraform/azurerm/data_source_automation_string_variable_test.go delete mode 100644 build/azterraform/azurerm/data_source_batch_account.go delete mode 100644 build/azterraform/azurerm/data_source_batch_account_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_api_management_diagnostic.go delete mode 100644 build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_api_management_policy.go delete mode 100644 build/azterraform/azurerm/resource_arm_api_management_policy_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_automation_null_variable.go delete mode 100644 build/azterraform/azurerm/resource_arm_automation_null_variable_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_automation_string_variable.go delete mode 100644 build/azterraform/azurerm/resource_arm_automation_string_variable_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_batch_account.go delete mode 100644 build/azterraform/azurerm/resource_arm_batch_account_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_container_registry.go delete mode 100644 build/azterraform/azurerm/resource_arm_container_registry_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door_backend_pool.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_front_door_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_resource_group.go delete mode 100644 build/azterraform/azurerm/resource_arm_resource_group_test.go delete mode 100644 build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go delete mode 100644 build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go delete mode 100644 build/azterraform/website/docs/d/automation_string_variable.html.markdown delete mode 100644 build/azterraform/website/docs/d/batch_account.html.markdown delete mode 100644 build/azterraform/website/docs/r/api_management_diagnostic.html.markdown delete mode 100644 build/azterraform/website/docs/r/api_management_policy.html.markdown delete mode 100644 build/azterraform/website/docs/r/automation_null_variable.html.markdown delete mode 100644 build/azterraform/website/docs/r/automation_string_variable.html.markdown delete mode 100644 build/azterraform/website/docs/r/batch_account.html.markdown delete mode 100644 build/azterraform/website/docs/r/container_registry.html.markdown delete mode 100644 build/azterraform/website/docs/r/front_door.html.markdown delete mode 100644 build/azterraform/website/docs/r/front_door_backend_pool.html.markdown delete mode 100644 build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown delete mode 100644 build/azterraform/website/docs/r/resource_group.html.markdown delete mode 100644 build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown delete mode 100644 products/azfrontdoor/api.yaml delete mode 100644 products/azfrontdoor/examples/terraform/basic.yaml delete mode 100644 products/azfrontdoor/terraform.yaml delete mode 100644 products/azfrontdoorbackendpool/api.yaml delete mode 100644 products/azfrontdoorbackendpool/examples/terraform/basic.yaml delete mode 100644 products/azfrontdoorbackendpool/terraform.yaml delete mode 100644 products/azfrontdoorfrontendpoint/api.yaml delete mode 100644 products/azfrontdoorfrontendpoint/terraform.yaml delete mode 100644 products/azstorageaccount/examples/ansible/basic.yaml delete mode 100644 products/azstorageaccount/examples/terraform/basic.yaml delete mode 100644 templates/terraform/examples/container_registry.tf.erb delete mode 100644 templates/terraform/examples/resource_group.tf.erb diff --git a/azure/golang_utils.rb b/azure/golang_utils.rb new file mode 100644 index 000000000000..9707a6f96a2d --- /dev/null +++ b/azure/golang_utils.rb @@ -0,0 +1,12 @@ +require 'google/golang_utils' + +module Azure + module GolangUtils + + def azure_go_literal(value, go_package = nil) + return "string(#{go_package}#{'.' unless go_package.nil?}#{value})" if value.is_a?(Symbol) + go_literal value + end + + end +end diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py deleted file mode 100644 index 73cc47ec60cd..000000000000 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount.py +++ /dev/null @@ -1,336 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2019 Junyi Yi (@JunyiYi) -# -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - - -DOCUMENTATION = ''' ---- -module: azure_rm_batchaccount -version_added: "2.9" -short_description: Manages a Batch Account on Azure. -description: - - Create, update and delete instance of Azure Batch Account. - -options: - resource_group: - description: - - The name of the resource group in which to create the Batch Account. - required: true - name: - description: - - The name of the Batch Account. - required: true - location: - description: - - Specifies the supported Azure location where the resource exists. - auto_storage_account: - description: - - Existing storage account with which to associate the Batch Account. - - It can be the storage account name which is in the same resource group. - - "It can be the storage account ID. e.g., - /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}." - - It can be a dict which contains C(name) and C(resource_group) of the storage account. - key_vault: - description: - - Existing key vault with which to associate the Batch Account. - - It can be the key vault name which is in the same resource group. - - "It can be the key vault ID. e.g., - /subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}." - - It can be a dict which contains C(name) and C(resource_group) of the key vault. - pool_allocation_mode: - description: - - The pool acclocation mode of the Batch Account. - default: batch_service - choices: - - batch_service - - user_subscription - state: - description: - - Assert the state of the Batch Account. - - Use 'present' to create or update a Batch Account and 'absent' to delete it. - default: present - choices: - - present - - absent - -extends_documentation_fragment: - - azure - - azure_tags - -author: - - "Junyi Yi (@JunyiYi)" -''' - -EXAMPLES = ''' - - name: Create Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: mybatchaccount - location: eastus - auto_storage_account: - name: mystorageaccountname - pool_allocation_mode: batch_service -''' - -RETURN = ''' -id: - description: - - The ID of the Batch account. - returned: always - type: str - sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct" -account_endpoint: - description: - - The account endpoint used to interact with the Batch service. - returned: always - type: str - sample: sampleacct.westus.batch.azure.com -''' - -import time -from ansible.module_utils.azure_rm_common import normalize_location_name -from ansible.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt -from ansible.module_utils.common.dict_transformations import _snake_to_camel - -try: - from msrestazure.azure_exceptions import CloudError - from msrest.polling import LROPoller - from msrestazure.azure_operation import AzureOperationPoller - from msrest.serialization import Model - from azure.mgmt.batch import BatchManagementClient -except ImportError: - # This is handled in azure_rm_common - pass - - -class Actions: - NoAction, Create, Update, Delete = range(4) - - -class AzureRMBatchAccount(AzureRMModuleBaseExt): - """Configuration class for an Azure RM Batch Account resource""" - - def __init__(self): - self.module_arg_spec = dict( - resource_group=dict( - required=True, - type='str' - ), - name=dict( - required=True, - type='str' - ), - location=dict( - type='str', - updatable=False, - disposition='/' - ), - auto_storage_account=dict( - type='raw' - ), - key_vault=dict( - type='raw', - updatable=False, - disposition='/' - ), - pool_allocation_mode=dict( - default='batch_service', - type='str', - choices=['batch_service', 'user_subscription'], - updatable=False, - disposition='/' - ), - state=dict( - type='str', - default='present', - choices=['present', 'absent'] - ) - ) - - self.resource_group = None - self.name = None - self.batch_account = dict() - self.tags = None - - self.results = dict(changed=False) - self.mgmt_client = None - self.state = None - self.to_do = Actions.NoAction - - super(AzureRMBatchAccount, self).__init__(derived_arg_spec=self.module_arg_spec, - supports_check_mode=True, - supports_tags=True) - - def exec_module(self, **kwargs): - """Main module execution method""" - - for key in list(self.module_arg_spec.keys()) + ['tags']: - if hasattr(self, key): - setattr(self, key, kwargs[key]) - elif kwargs[key] is not None: - self.batch_account[key] = kwargs[key] - - resource_group = self.get_resource_group(self.resource_group) - if self.batch_account.get('location') is None: - self.batch_account['location'] = resource_group.location - if self.batch_account.get('auto_storage_account') is not None: - self.batch_account['auto_storage'] = { - 'storage_account_id': self.normalize_resource_id( - self.batch_account.pop('auto_storage_account'), - '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}') - } - if self.batch_account.get('key_vault') is not None: - id = self.normalize_resource_id( - self.batch_account.pop('key_vault'), - '/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}') - url = 'https://' + id.split('/').pop() + '.vault.azure.net/' - self.batch_account['key_vault_reference'] = { - 'id': id, - 'url': url - } - self.batch_account['pool_allocation_mode'] = _snake_to_camel(self.batch_account['pool_allocation_mode'], True) - - response = None - - self.mgmt_client = self.get_mgmt_svc_client(BatchManagementClient, - base_url=self._cloud_environment.endpoints.resource_manager) - - old_response = self.get_batchaccount() - - if not old_response: - self.log("Batch Account instance doesn't exist") - if self.state == 'absent': - self.log("Old instance didn't exist") - else: - self.to_do = Actions.Create - else: - self.log("Batch Account instance already exists") - if self.state == 'absent': - self.to_do = Actions.Delete - elif self.state == 'present': - self.results['old'] = old_response - self.results['new'] = self.batch_account - if not self.idempotency_check(old_response, self.batch_account): - self.to_do = Actions.Update - - if (self.to_do == Actions.Create) or (self.to_do == Actions.Update): - self.log("Need to Create / Update the Batch Account instance") - - self.results['changed'] = True - if self.check_mode: - return self.results - - response = self.create_update_batchaccount() - - self.log("Creation / Update done") - elif self.to_do == Actions.Delete: - self.log("Batch Account instance deleted") - self.results['changed'] = True - - if self.check_mode: - return self.results - - self.delete_batchaccount() - else: - self.log("Batch Account instance unchanged") - self.results['changed'] = False - response = old_response - - if self.state == 'present': - self.results.update({ - 'id': response.get('id', None), - 'account_endpoint': response.get('account_endpoint', None) - }) - return self.results - - def create_update_batchaccount(self): - ''' - Creates or updates Batch Account with the specified configuration. - - :return: deserialized Batch Account instance state dictionary - ''' - self.log("Creating / Updating the Batch Account instance {0}".format(self.name)) - - try: - if self.to_do == Actions.Create: - response = self.mgmt_client.batch_account.create(resource_group_name=self.resource_group, - account_name=self.name, - parameters=self.batch_account) - else: - response = self.mgmt_client.batch_account.update(resource_group_name=self.resource_group, - account_name=self.name, - tags=self.tags, - auto_storage=self.batch_account.get('auto_storage')) - if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): - response = self.get_poller_result(response) - except CloudError as exc: - self.log('Error attempting to create the Batch Account instance.') - self.fail("Error creating the Batch Account instance: {0}".format(str(exc))) - return response.as_dict() - - def delete_batchaccount(self): - ''' - Deletes specified Batch Account instance in the specified subscription and resource group. - - :return: True - ''' - self.log("Deleting the Batch Account instance {0}".format(self.name)) - try: - response = self.mgmt_client.batch_account.delete(resource_group_name=self.resource_group, - account_name=self.name) - except CloudError as e: - self.log('Error attempting to delete the Batch Account instance.') - self.fail("Error deleting the Batch Account instance: {0}".format(str(e))) - - if isinstance(response, LROPoller) or isinstance(response, AzureOperationPoller): - response = self.get_poller_result(response) - return True - - def get_batchaccount(self): - ''' - Gets the properties of the specified Batch Account - :return: deserialized Batch Account instance state dictionary - ''' - self.log("Checking if the Batch Account instance {0} is present".format(self.name)) - found = False - try: - response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, - account_name=self.name) - found = True - self.log("Response : {0}".format(response)) - self.log("Batch Account instance : {0} found".format(response.name)) - except CloudError as e: - self.log('Did not find the Batch Account instance.') - if found is True: - return response.as_dict() - return False - - -def main(): - """Main execution""" - AzureRMBatchAccount() - - -if __name__ == '__main__': - main() diff --git a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py b/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py deleted file mode 100644 index 9e3598b18b9e..000000000000 --- a/build/azansible/lib/ansible/modules/cloud/azure/azure_rm_batchaccount_info.py +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2019 Junyi Yi (@JunyiYi) -# -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ["preview"], - 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: azure_rm_batchaccount_info -version_added: "2.9" -short_description: Gather info for Azure Batch Account -description: - - Gather info for Azure Batch Account. - -options: - resource_group: - description: - - The name of the resource group in which to create the Batch Account. - required: true - name: - description: - - The name of the Batch Account. - tags: - description: - - A mapping of tags to assign to the batch account. - -extends_documentation_fragment: - - azure - -author: - - "Junyi Yi (@JunyiYi)" -''' - -EXAMPLES = ''' - - name: Get instance of Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup - name: test_object - - - name: List instances of Batch Account - azure_rm_batchaccount: - resource_group: MyResGroup -''' - -RETURN = ''' -items: - description: List of items - returned: always - type: complex - contains: - id: - description: - - The ID of the Batch account. - returned: always - type: str - sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Batch/batchAccounts/sampleacct" - resource_group: - description: - - The name of the resource group in which to create the Batch Account. - returned: always - type: str - name: - description: - - The name of the Batch Account. - returned: always - type: str - location: - description: - - Specifies the supported Azure location where the resource exists. - returned: always - type: str - account_endpoint: - description: - - The account endpoint used to interact with the Batch service. - returned: always - type: str - sample: sampleacct.westus.batch.azure.com - auto_storage_account: - description: - - Existing storage account with which to associate the Batch Account. - returned: always - type: str - sample: "/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{name}" - key_vault: - description: - - Existing key vault with which to associate the Batch Account. - returned: always - type: str - sample: "/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.KeyVault/vaults/{name}" - pool_allocation_mode: - description: - - The pool acclocation mode of the Batch Account. - returned: always - type: str - tags: - description: - - A mapping of tags to assign to the batch account. - returned: always - type: list -''' - -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - -try: - from msrestazure.azure_exceptions import CloudError - from azure.mgmt.batch import BatchManagementClient from msrest.serialization import Model -except ImportError: - # This is handled in azure_rm_common - pass - - -class AzureRMBatchAccountInfo(AzureRMModuleBase): - def __init__(self): - # define user inputs into argument - self.module_arg_spec = dict( - resource_group=dict( - required=True, - type='str' - ), - name=dict( - type='str' - ), - tags=dict( - type='list' - ) - ) - # store the results of the module operation - self.results = dict( - changed=False - ) - self.mgmt_client = None - self.resource_group = None - self.name = None - self.tags = None - self.tags = None - super(AzureRMBatchAccountInfo, self).__init__(self.module_arg_spec, supports_tags=False) - - def exec_module(self, **kwargs): - for key in self.module_arg_spec: - setattr(self, key, kwargs[key]) - self.mgmt_client = self.get_mgmt_svc_client(BatchManagementClient, - base_url=self._cloud_environment.endpoints.resource_manager) - - if (self.name): - self.results['items'] = self.get() - else: - self.results['items'] = self.list() - return self.results - - def get(self): - response = None - results = [] - try: - response = self.mgmt_client.batch_account.get(resource_group_name=self.resource_group, - account_name=self.name) - self.log("Response : {0}".format(response)) - except CloudError as e: - self.log('Could not get info for Batch Account.') - - if response and self.has_tags(response.tags, self.tags): - results.append(self.format_response(response)) - - return results - - def list(self): - response = None - results = [] - try: - response = self.mgmt_client.batch_account.list_by_resource_group(resource_group_name=self.resource_group) - self.log("Response : {0}".format(response)) - except CloudError as e: - self.log('Could not get info for Batch Account.') - - if response is not None: - for item in response: - if self.has_tags(item.tags, self.tags): - results.append(self.format_response(item)) - - return results - - def format_response(self, item): - d = item.as_dict() - d = { - 'id': d['id'], - 'resource_group': self.resource_group, - 'name': d['name'], - 'location': d['location'], - 'account_endpoint': d['account_endpoint'], - 'auto_storage_account': d['auto_storage']['storage_account_id'], - 'key_vault': d['key_vault_reference'], - 'pool_allocation_mode': d['pool_allocation_mode'], - 'tags': d['tags'], - } - return d - - -def main(): - AzureRMBatchAccountInfo() - - -if __name__ == "__main__": - main() diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases b/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases deleted file mode 100644 index 49acfee76c90..000000000000 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/aliases +++ /dev/null @@ -1,3 +0,0 @@ -cloud/azure -destructive -shippable/azure/group2 diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml deleted file mode 100644 index 95e1952f9890..000000000000 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/meta/main.yml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - setup_azure diff --git a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml deleted file mode 100644 index 6fcb153802ca..000000000000 --- a/build/azansible/test/integration/targets/azure_rm_batchaccount/tasks/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# -# ---------------------------------------------------------------------------- -- name: Prepare random number - set_fact: - storage_account_name: "st{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}" - batch_account_name: "ba{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}" - run_once: yes - -- name: Create Storage Account - azure_rm_storageaccount: - resource_group: "{{ resource_group }}" - name: "{{ storage_account_name }}" - location: eastus - account_type: Standard_LRS - -- name: Create Batch Account - azure_rm_batchaccount: - resource_group: "{{ resource_group }}" - name: "{{ batch_account_name }}" - location: eastus - auto_storage_account: - name: "{{ storage_account_name }}" - pool_allocation_mode: batch_service register: output - -- name: Assert the resource was created - assert: - that: - - output.changed - -- name: Create Batch Account -- idempotent - azure_rm_batchaccount: - resource_group: "{{ resource_group }}" - name: "{{ batch_account_name }}" - location: eastus - auto_storage_account: - name: "{{ storage_account_name }}" - pool_allocation_mode: batch_service register: output - -- name: Assert the resource was created - assert: - that: - - not output.changed diff --git a/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml b/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml deleted file mode 100644 index 7459250b6b01..000000000000 --- a/build/azansible/test/integration/targets/azure_rm_servicebusdisasterrecoveryconfig/tasks/main.yml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- -# Pre-test setup - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "{{ resource_name }}" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: absent -#---------------------------------------------------------- - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "{{ resource_name }}" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: present - register: result -- name: assert changed is true - assert: - that: - - result.changed == true -- name: verify that service_bus_disaster_recovery_config was created - gcp_zservicebusrecovery_service_bus_disaster_recovery_config_facts: - filters: - - name = {{ resource_name }} - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file }}" - scopes: - - NotUsedInAzure - register: results -- name: verify that command succeeded - assert: - that: - - results['items'] | length == 1 -# ---------------------------------------------------------------------------- - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "{{ resource_name }}" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: present - register: result -- name: assert changed is false - assert: - that: - - result.changed == false -#---------------------------------------------------------- - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "{{ resource_name }}" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: absent - register: result -- name: assert changed is true - assert: - that: - - result.changed == true -- name: verify that service_bus_disaster_recovery_config was deleted - gcp_zservicebusrecovery_service_bus_disaster_recovery_config_facts: - filters: - - name = {{ resource_name }} - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file }}" - scopes: - - NotUsedInAzure - register: results -- name: verify that command succeeded - assert: - that: - - results['items'] | length == 0 -# ---------------------------------------------------------------------------- - - name: Create (or update) Service Bus Disaster Recovery Config - azure_rm_servicebusdisasterrecoveryconfig: - resource_group: myResourceGroup - name: "{{ resource_name }}" - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy - state: absent - register: result -- name: assert changed is false - assert: - that: - - result.changed == false diff --git a/build/azterraform/azurerm/data_source_automation_string_variable.go b/build/azterraform/azurerm/data_source_automation_string_variable.go deleted file mode 100644 index cba12b9cd3c8..000000000000 --- a/build/azterraform/azurerm/data_source_automation_string_variable.go +++ /dev/null @@ -1,90 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - -func dataSourceArmAutomationStringVariable() *schema.Resource { - return &schema.Resource{ - Read: dataSourceArmAutomationStringVariableRead, - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameForDataSourceSchema(), - - "automation_account_name": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "description": { - Type: schema.TypeString, - Computed: true, - }, - - "encrypted": { - Type: schema.TypeBool, - Computed: true, - }, - - "value": { - Type: schema.TypeString, - Computed: true, - }, - }, - } -} - -func dataSourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - accountName := d.Get("automation_account_name").(string) - - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error: Automation String Variable %q (Automation Account Name %q / Resource Group %q) was not found", name, accountName, resourceGroup) - } - return fmt.Errorf("Error reading Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - d.SetId(*resp.ID) - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("automation_account_name", accountName) - if properties := resp.VariableProperties; properties != nil { - d.Set("description", properties.Description) - d.Set("encrypted", properties.IsEncrypted) - if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/data_source_automation_string_variable_test.go b/build/azterraform/azurerm/data_source_automation_string_variable_test.go deleted file mode 100644 index 36b67c149b26..000000000000 --- a/build/azterraform/azurerm/data_source_automation_string_variable_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" -) - -func TestAccDataSourceAzureRMAutomationStringVariable_basic(t *testing.T) { - dataSourceName := "data.azurerm_automation_string_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - Steps: []resource.TestStep{ - { - Config: testAccDataSourceAutomationStringVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(dataSourceName, "value", "Hello, Terraform Basic Test."), - ), - }, - }, - }) -} - -func testAccDataSourceAutomationStringVariable_basic(rInt int, location string) string { - config := testAccAzureRMAutomationStringVariable_basic(rInt, location) - return fmt.Sprintf(` -%s - -data "azurerm_automation_string_variable" "test" { - name = "${azurerm_automation_string_variable.test.name}" - resource_group_name = "${azurerm_automation_string_variable.test.resource_group_name}" - automation_account_name = "${azurerm_automation_string_variable.test.automation_account_name}" -} -`, config) -} diff --git a/build/azterraform/azurerm/data_source_batch_account.go b/build/azterraform/azurerm/data_source_batch_account.go deleted file mode 100644 index c6734bcd0474..000000000000 --- a/build/azterraform/azurerm/data_source_batch_account.go +++ /dev/null @@ -1,106 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - -func dataSourceArmBatchAccount() *schema.Resource { - return &schema.Resource{ - Read: dataSourceArmBatchAccountRead, - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validateAzureRMBatchAccountName, - }, - - "location": locationForDataSourceSchema(), - - "resource_group_name": resourceGroupNameForDataSourceSchema(), - - "account_endpoint": { - Type: schema.TypeString, - Computed: true, - }, - - "key_vault_reference": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "id": { - Type: schema.TypeString, - Computed: true, - }, - "url": { - Type: schema.TypeString, - Computed: true, - }, - }, - }, - }, - - "pool_allocation_mode": { - Type: schema.TypeString, - Computed: true, - }, - - "storage_account_id": { - Type: schema.TypeString, - Computed: true, - }, - - "tags": tagsForDataSourceSchema(), - }, - } -} - -func dataSourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).batchAccountClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error: Batch Account %q (Resource Group %q) was not found", name, resourceGroup) - } - return fmt.Errorf("Error reading Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - d.SetId(*resp.ID) - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - if properties := resp.AccountProperties; properties != nil { - d.Set("account_endpoint", properties.AccountEndpoint) - if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { - return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) - } - d.Set("pool_allocation_mode", string(properties.PoolAllocationMode)) - if autoStorage := properties.AutoStorage; autoStorage != nil { - d.Set("storage_account_id", autoStorage.StorageAccountID) - } - } - flattenAndSetTags(d, resp.Tags) - - return nil -} diff --git a/build/azterraform/azurerm/data_source_batch_account_test.go b/build/azterraform/azurerm/data_source_batch_account_test.go deleted file mode 100644 index 9e354533561f..000000000000 --- a/build/azterraform/azurerm/data_source_batch_account_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" -) - -func TestAccDataSourceAzureRMBatchAccount_basic(t *testing.T) { - dataSourceName := "data.azurerm_batch_account.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - Steps: []resource.TestStep{ - { - Config: testAccDataSourceBatchAccount_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(dataSourceName, "poolAllocationMode", "BatchService"), - resource.TestCheckResourceAttrSet(dataSourceName, "storageAccountId"), - ), - }, - }, - }) -} - -func testAccDataSourceBatchAccount_basic(rInt int, location string) string { - config := testAccAzureRMBatchAccount_basic(rInt, location) - return fmt.Sprintf(` -%s - -data "azurerm_batch_account" "test" { - name = "${azurerm_batch_account.test.name}" - resource_group_name = "${azurerm_batch_account.test.resource_group_name}" -} -`, config) -} diff --git a/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go b/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go deleted file mode 100644 index 5ca40aa7dae5..000000000000 --- a/build/azterraform/azurerm/resource_arm_api_management_diagnostic.go +++ /dev/null @@ -1,371 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmApiManagementDiagnostic() *schema.Resource { - return &schema.Resource{ - Create: resourceArmApiManagementDiagnosticCreateUpdate, - Read: resourceArmApiManagementDiagnosticRead, - Update: resourceArmApiManagementDiagnosticCreateUpdate, - Delete: resourceArmApiManagementDiagnosticDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "api_management_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "logger_id": { - Type: schema.TypeString, - Required: true, - }, - - "always_log": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(apimanagement.AllErrors), - }, false), - }, - - "backend": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "request": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "body_bytes": { - Type: schema.TypeInt, - Optional: true, - }, - "headers": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - }, - }, - "response": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "body_bytes": { - Type: schema.TypeInt, - Optional: true, - }, - "headers": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - }, - }, - }, - }, - }, - - "enable_http_correlation_headers": { - Type: schema.TypeBool, - Optional: true, - Default: true, - }, - - "frontend": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "request": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "body_bytes": { - Type: schema.TypeInt, - Optional: true, - }, - "headers": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - }, - }, - "response": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "body_bytes": { - Type: schema.TypeInt, - Optional: true, - }, - "headers": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - }, - }, - }, - }, - }, - - "sampling_percentage": { - Type: schema.TypeFloat, - Optional: true, - }, - - "sampling_type": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(apimanagement.Fixed), - }, false), - }, - }, - } -} - -func resourceArmApiManagementDiagnosticCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementDiagnosticClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - serviceName := d.Get("api_management_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, serviceName, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_api_management_diagnostic", *resp.ID) - } - } - - alwaysLog := d.Get("always_log").(string) - backend := d.Get("backend").([]interface{}) - enableHttpCorrelationHeaders := d.Get("enable_http_correlation_headers").(bool) - frontend := d.Get("frontend").([]interface{}) - loggerId := d.Get("logger_id").(string) - samplingPercentage := d.Get("sampling_percentage").(float64) - samplingType := d.Get("sampling_type").(string) - - parameters := apimanagement.DiagnosticContract{ - DiagnosticContractProperties: &apimanagement.DiagnosticContractProperties{ - AlwaysLog: apimanagement.AlwaysLog(alwaysLog), - Backend: expandArmApiManagementDiagnosticPipelineDiagnosticSettings(backend), - EnableHTTPCorrelationHeaders: utils.Bool(enableHttpCorrelationHeaders), - Frontend: expandArmApiManagementDiagnosticPipelineDiagnosticSettings(frontend), - LoggerID: utils.String(loggerId), - Sampling: &apimanagement.SamplingSettings{ - Percentage: utils.Float(samplingPercentage), - SamplingType: apimanagement.SamplingType(samplingType), - }, - }, - } - - - if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, parameters, ""); err != nil { - return fmt.Errorf("Error creating Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) - } - - - resp, err := client.Get(ctx, resourceGroup, serviceName, name) - if err != nil { - return fmt.Errorf("Error retrieving Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Api Management Diagnostic %q (Resource Group %q / Api Management Name %q) ID", name, resourceGroup, serviceName) - } - d.SetId(*resp.ID) - - return resourceArmApiManagementDiagnosticRead(d, meta) -} - -func resourceArmApiManagementDiagnosticRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementDiagnosticClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - serviceName := id.Path["service"] - name := id.Path["diagnostics"] - - resp, err := client.Get(ctx, resourceGroup, serviceName, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Api Management Diagnostic %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("api_management_name", serviceName) - if properties := resp.DiagnosticContractProperties; properties != nil { - d.Set("always_log", string(properties.AlwaysLog)) - if err := d.Set("backend", flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(properties.Backend)); err != nil { - return fmt.Errorf("Error setting `backend`: %+v", err) - } - d.Set("enable_http_correlation_headers", properties.EnableHTTPCorrelationHeaders) - if err := d.Set("frontend", flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(properties.Frontend)); err != nil { - return fmt.Errorf("Error setting `frontend`: %+v", err) - } - d.Set("logger_id", properties.LoggerID) - if sampling := properties.Sampling; sampling != nil { - d.Set("sampling_percentage", sampling.Percentage) - d.Set("sampling_type", string(sampling.SamplingType)) - } - } - - return nil -} - - -func resourceArmApiManagementDiagnosticDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementDiagnosticClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - serviceName := id.Path["service"] - name := id.Path["diagnostics"] - - if _, err := client.Delete(ctx, resourceGroup, serviceName, name, ""); err != nil { - return fmt.Errorf("Error deleting Api Management Diagnostic %q (Resource Group %q / Api Management Name %q): %+v", name, resourceGroup, serviceName, err) - } - - return nil -} - -func expandArmApiManagementDiagnosticPipelineDiagnosticSettings(input []interface{}) *apimanagement.PipelineDiagnosticSettings { - if len(input) == 0 { - return nil - } - v := input[0].(map[string]interface{}) - - request := v["request"].([]interface{}) - response := v["response"].([]interface{}) - - result := apimanagement.PipelineDiagnosticSettings{ - Request: expandArmApiManagementDiagnosticHTTPMessageDiagnostic(request), - Response: expandArmApiManagementDiagnosticHTTPMessageDiagnostic(response), - } - return &result -} - -func expandArmApiManagementDiagnosticHTTPMessageDiagnostic(input []interface{}) *apimanagement.HTTPMessageDiagnostic { - if len(input) == 0 { - return nil - } - v := input[0].(map[string]interface{}) - - headers := v["headers"].([]interface{}) - bodyBytes := v["body_bytes"].(int) - - result := apimanagement.HTTPMessageDiagnostic{ - Body: &apimanagement.BodyDiagnosticSettings{ - Bytes: utils.Int32(int32(bodyBytes)), - }, - Headers: utils.ExpandStringArray(headers), - } - return &result -} - - -func flattenArmApiManagementDiagnosticPipelineDiagnosticSettings(input *apimanagement.PipelineDiagnosticSettings) []interface{} { - if input == nil { - return make([]interface{}, 0) - } - - result := make(map[string]interface{}) - - result["request"] = flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input.Request) - result["response"] = flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input.Response) - - return []interface{}{result} -} - -func flattenArmApiManagementDiagnosticHTTPMessageDiagnostic(input *apimanagement.HTTPMessageDiagnostic) []interface{} { - if input == nil { - return make([]interface{}, 0) - } - - result := make(map[string]interface{}) - - if body := input.Body; body != nil { - if bodyBytes := body.Bytes; bodyBytes != nil { - result["body_bytes"] = int(*bodyBytes) - } - } - result["headers"] = utils.FlattenStringArray(input.Headers) - - return []interface{}{result} -} diff --git a/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go b/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go deleted file mode 100644 index 5748feba2f49..000000000000 --- a/build/azterraform/azurerm/resource_arm_api_management_diagnostic_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMApiManagementDiagnosticExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Api Management Diagnostic not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - serviceName := rs.Primary.Attributes["api_management_name"] - - client := testAccProvider.Meta().(*ArmClient).apiManagementDiagnosticClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Api Management Diagnostic %q (Resource Group %q / Api Management Name %q) does not exist", name, resourceGroup, serviceName) - } - return fmt.Errorf("Bad: Get on apiManagementDiagnosticClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMApiManagementDiagnosticDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).apiManagementDiagnosticClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_api_management_diagnostic" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - serviceName := rs.Primary.Attributes["api_management_name"] - - if resp, err := client.Get(ctx, resourceGroup, serviceName, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on apiManagementDiagnosticClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy.go b/build/azterraform/azurerm/resource_arm_api_management_policy.go deleted file mode 100644 index 0728e2aa2c6a..000000000000 --- a/build/azterraform/azurerm/resource_arm_api_management_policy.go +++ /dev/null @@ -1,164 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmApiManagementPolicy() *schema.Resource { - return &schema.Resource{ - Create: resourceArmApiManagementPolicyCreateUpdate, - Read: resourceArmApiManagementPolicyRead, - Update: resourceArmApiManagementPolicyCreateUpdate, - Delete: resourceArmApiManagementPolicyDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "resource_group_name": resourceGroupNameSchema(), - - "api_management_name": azure.SchemaApiManagementName(), - - "xml_content": { - Type: schema.TypeString, - Optional: true, - DiffSuppressFunc: suppress.SuppressXmlDiff, - ConflictsWith: []string{"xml_link"}, - }, - - "xml_link": { - Type: schema.TypeString, - Optional: true, - ConflictsWith: []string{"xml_content"}, - }, - }, - } -} - -func resourceArmApiManagementPolicyCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementPolicyClient - ctx := meta.(*ArmClient).StopContext - - resourceGroup := d.Get("resource_group_name").(string) - serviceName := d.Get("api_management_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, serviceName) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_api_management_policy", *resp.ID) - } - } - - xmlContent := d.Get("xml_content").(string) - xmlLink := d.Get("xml_link").(string) - if xmlContent == "" && xmlLink == "" { - return fmt.Errorf("Either `xml_content` or `xml_link` is required") - } - - content := xmlContent - format := apimanagement.XML - if xmlLink != "" { - content = xmlLink - format = apimanagement.XMLLink - } - - parameters := apimanagement.PolicyContract{ - PolicyContractProperties: &apimanagement.PolicyContractProperties{ - ContentFormat: format, - PolicyContent: utils.String(content), - }, - } - - - if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, parameters); err != nil { - return fmt.Errorf("Error creating Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, serviceName) - if err != nil { - return fmt.Errorf("Error retrieving Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Global Policy (API Management Service %q / Resource Group %q) ID", serviceName, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmApiManagementPolicyRead(d, meta) -} - -func resourceArmApiManagementPolicyRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementPolicyClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - serviceName := id.Path["service"] - - resp, err := client.Get(ctx, resourceGroup, serviceName) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Api Management Policy %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) - } - - - d.Set("resource_group_name", resourceGroup) - d.Set("api_management_name", serviceName) - if properties := resp.PolicyContractProperties; properties != nil { - d.Set("xml_content", "") - d.Set("xml_link", "") - if properties.ContentFormat == apimanagement.XML { - d.Set("xml_content", properties.PolicyContent) - } else if properties.ContentFormat == apimanagement.XMLLink { - d.Set("xml_link", properties.PolicyContent) - } - } - - return nil -} - - -func resourceArmApiManagementPolicyDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).apiManagementPolicyClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - serviceName := id.Path["service"] - - if _, err := client.Delete(ctx, resourceGroup, serviceName, ""); err != nil { - return fmt.Errorf("Error deleting Global Policy (API Management Service %q / Resource Group %q): %+v", serviceName, resourceGroup, err) - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go b/build/azterraform/azurerm/resource_arm_api_management_policy_test.go deleted file mode 100644 index ab17ffae8e59..000000000000 --- a/build/azterraform/azurerm/resource_arm_api_management_policy_test.go +++ /dev/null @@ -1,217 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - -func TestAccAzureRMApiManagementPolicy_basic(t *testing.T) { - resourceName := "azurerm_api_management_policy.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMApiManagementPolicy_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMApiManagementPolicyExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "xml_content", ""), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMApiManagementPolicy_findReplace(t *testing.T) { - resourceName := "azurerm_api_management_policy.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMApiManagementPolicy_findReplace(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMApiManagementPolicyExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "xml_content", ""), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMApiManagementPolicy_update(t *testing.T) { - resourceName := "azurerm_api_management_policy.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMApiManagementPolicyDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMApiManagementPolicy_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMApiManagementPolicyExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "xml_content", ""), - ), - }, - { - Config: testAccAzureRMApiManagementPolicy_findReplace(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMApiManagementPolicyExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "xml_content", ""), - ), - }, - { - Config: testAccAzureRMApiManagementPolicy_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMApiManagementPolicyExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "xml_content", ""), - ), - }, - }, - }) -} - - -func testCheckAzureRMApiManagementPolicyExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Api Management Policy not found: %s", resourceName) - } - - resourceGroup := rs.Primary.Attributes["resource_group_name"] - serviceName := rs.Primary.Attributes["api_management_name"] - - client := testAccProvider.Meta().(*ArmClient).apiManagementPolicyClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, serviceName); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Global Policy (API Management Service %q / Resource Group %q) does not exist", serviceName, resourceGroup) - } - return fmt.Errorf("Bad: Get on apiManagementPolicyClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMApiManagementPolicyDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).apiManagementPolicyClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_api_management_policy" { - continue - } - - resourceGroup := rs.Primary.Attributes["resource_group_name"] - serviceName := rs.Primary.Attributes["api_management_name"] - - if resp, err := client.Get(ctx, resourceGroup, serviceName); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on apiManagementPolicyClient: %+v", err) - } - } - - return nil - } - - return nil -} - -func testAccAzureRMApiManagementPolicy_basic(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_api_management" "test" { - name = "acctestAM-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "${azurerm_resource_group.test.location}" - publisher_name = "pub1" - publisher_email = "pub1@email.com" - - sku = { - name = "Developer" - capacity = 1 - } -} - -resource "azurerm_api_management_policy" "test" { - resource_group_name = "${azurerm_resource_group.test.name}" - api_management_name = "${azurerm_api_management.test.name}" - xml_content = "" -} -`, rInt, location, rInt) -} - -func testAccAzureRMApiManagementPolicy_findReplace(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_api_management" "test" { - name = "acctestAM-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "${azurerm_resource_group.test.location}" - publisher_name = "pub1" - publisher_email = "pub1@email.com" - - sku = { - name = "Developer" - capacity = 1 - } -} - -resource "azurerm_api_management_policy" "test" { - resource_group_name = "${azurerm_resource_group.test.name}" - api_management_name = "${azurerm_api_management.test.name}" - xml_content = "" -} -`, rInt, location, rInt) -} diff --git a/build/azterraform/azurerm/resource_arm_automation_null_variable.go b/build/azterraform/azurerm/resource_arm_automation_null_variable.go deleted file mode 100644 index a47c9b4ed13c..000000000000 --- a/build/azterraform/azurerm/resource_arm_automation_null_variable.go +++ /dev/null @@ -1,155 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmAutomationNullVariable() *schema.Resource { - return &schema.Resource{ - Create: resourceArmAutomationNullVariableCreateUpdate, - Read: resourceArmAutomationNullVariableRead, - Update: resourceArmAutomationNullVariableCreateUpdate, - Delete: resourceArmAutomationNullVariableDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "automation_account_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "description": { - Type: schema.TypeString, - Optional: true, - }, - }, - } -} - -func resourceArmAutomationNullVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - accountName := d.Get("automation_account_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_automation_null_variable", *resp.ID) - } - } - - description := d.Get("description").(string) - - parameters := automation.VariableCreateOrUpdateParameters{ - Name: utils.String(name), - VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ - Description: utils.String(description), - }, - } - - - if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { - return fmt.Errorf("Error creating Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - return fmt.Errorf("Error retrieving Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Automation Null Variable %q (Automation Account Name %q / Resource Group %q) ID", name, accountName, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmAutomationNullVariableRead(d, meta) -} - -func resourceArmAutomationNullVariableRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - accountName := id.Path["automationAccounts"] - name := id.Path["variables"] - - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Automation Null Variable %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("automation_account_name", accountName) - if properties := resp.VariableProperties; properties != nil { - d.Set("description", properties.Description) - } - - return nil -} - - -func resourceArmAutomationNullVariableDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - accountName := id.Path["automationAccounts"] - name := id.Path["variables"] - - if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { - return fmt.Errorf("Error deleting Automation Null Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go deleted file mode 100644 index 7ad71e85ceb7..000000000000 --- a/build/azterraform/azurerm/resource_arm_automation_null_variable_test.go +++ /dev/null @@ -1,211 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - -func TestAccAzureRMAutomationNullVariable_basic(t *testing.T) { - resourceName := "azurerm_automation_null_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationNullVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationNullVariableExists(resourceName), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMAutomationNullVariable_complete(t *testing.T) { - resourceName := "azurerm_automation_null_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationNullVariable_complete(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationNullVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMAutomationNullVariable_basicCompleteUpdate(t *testing.T) { - resourceName := "azurerm_automation_null_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationNullVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationNullVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationNullVariableExists(resourceName), - ), - }, - { - Config: testAccAzureRMAutomationNullVariable_complete(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationNullVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), - ), - }, - { - Config: testAccAzureRMAutomationNullVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationNullVariableExists(resourceName), - ), - }, - }, - }) -} - - -func testCheckAzureRMAutomationNullVariableExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Automation Null Variable not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - accountName := rs.Primary.Attributes["automation_account_name"] - - client := testAccProvider.Meta().(*ArmClient).automationVariableClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Automation Null Variable %q (Automation Account Name %q / Resource Group %q) does not exist", name, accountName, resourceGroup) - } - return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMAutomationNullVariableDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).automationVariableClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_automation_null_variable" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - accountName := rs.Primary.Attributes["automation_account_name"] - - if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) - } - } - - return nil - } - - return nil -} - -func testAccAzureRMAutomationNullVariable_basic(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_automation_account" "test" { - name = "acctestAutoAcct-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - - sku = { - name = "Basic" - } -} - -resource "azurerm_automation_null_variable" "test" { - name = "acctestAutoVar-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - automation_account_name = "${azurerm_automation_account.test.name}" -} -`, rInt, location, rInt, rInt) -} - -func testAccAzureRMAutomationNullVariable_complete(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_automation_account" "test" { - name = "acctestAutoAcct-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - - sku = { - name = "Basic" - } -} - -resource "azurerm_automation_null_variable" "test" { - name = "acctestAutoVar-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - automation_account_name = "${azurerm_automation_account.test.name}" - description = "This variable is created by Terraform acceptance test." -} -`, rInt, location, rInt, rInt) -} diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable.go b/build/azterraform/azurerm/resource_arm_automation_string_variable.go deleted file mode 100644 index ebeec516de05..000000000000 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable.go +++ /dev/null @@ -1,178 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmAutomationStringVariable() *schema.Resource { - return &schema.Resource{ - Create: resourceArmAutomationStringVariableCreateUpdate, - Read: resourceArmAutomationStringVariableRead, - Update: resourceArmAutomationStringVariableCreateUpdate, - Delete: resourceArmAutomationStringVariableDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "automation_account_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "description": { - Type: schema.TypeString, - Optional: true, - }, - - "encrypted": { - Type: schema.TypeBool, - Optional: true, - Default: false, - }, - - "value": { - Type: schema.TypeString, - Optional: true, - }, - }, - } -} - -func resourceArmAutomationStringVariableCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - accountName := d.Get("automation_account_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_automation_string_variable", *resp.ID) - } - } - - description := d.Get("description").(string) - encrypted := d.Get("encrypted").(bool) - value := strconv.Quote(d.Get("value").(string)) - - parameters := automation.VariableCreateOrUpdateParameters{ - Name: utils.String(name), - VariableCreateOrUpdateProperties: &automation.VariableCreateOrUpdateProperties{ - Description: utils.String(description), - IsEncrypted: utils.Bool(encrypted), - Value: utils.String(value), - }, - } - - - if _, err := client.CreateOrUpdate(ctx, resourceGroup, accountName, name, parameters); err != nil { - return fmt.Errorf("Error creating Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - return fmt.Errorf("Error retrieving Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Automation String Variable %q (Automation Account Name %q / Resource Group %q) ID", name, accountName, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmAutomationStringVariableRead(d, meta) -} - -func resourceArmAutomationStringVariableRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - accountName := id.Path["automationAccounts"] - name := id.Path["variables"] - - resp, err := client.Get(ctx, resourceGroup, accountName, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Automation String Variable %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("automation_account_name", accountName) - if properties := resp.VariableProperties; properties != nil { - d.Set("description", properties.Description) - d.Set("encrypted", properties.IsEncrypted) - if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) - } - } - - return nil -} - - -func resourceArmAutomationStringVariableDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).automationVariableClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - accountName := id.Path["automationAccounts"] - name := id.Path["variables"] - - if _, err := client.Delete(ctx, resourceGroup, accountName, name); err != nil { - return fmt.Errorf("Error deleting Automation String Variable %q (Automation Account Name %q / Resource Group %q): %+v", name, accountName, resourceGroup, err) - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go b/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go deleted file mode 100644 index d9b388576caf..000000000000 --- a/build/azterraform/azurerm/resource_arm_automation_string_variable_test.go +++ /dev/null @@ -1,212 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - -func TestAccAzureRMAutomationStringVariable_basic(t *testing.T) { - resourceName := "azurerm_automation_string_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationStringVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMAutomationStringVariable_complete(t *testing.T) { - resourceName := "azurerm_automation_string_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationStringVariable_complete(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), - resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - -func TestAccAzureRMAutomationStringVariable_basicCompleteUpdate(t *testing.T) { - resourceName := "azurerm_automation_string_variable.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMAutomationStringVariableDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMAutomationStringVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), - ), - }, - { - Config: testAccAzureRMAutomationStringVariable_complete(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "description", "This variable is created by Terraform acceptance test."), - resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Complete Test."), - ), - }, - { - Config: testAccAzureRMAutomationStringVariable_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAutomationStringVariableExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "value", "Hello, Terraform Basic Test."), - ), - }, - }, - }) -} - - -func testCheckAzureRMAutomationStringVariableExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Automation String Variable not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - accountName := rs.Primary.Attributes["automation_account_name"] - - client := testAccProvider.Meta().(*ArmClient).automationVariableClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Automation String Variable %q (Automation Account Name %q / Resource Group %q) does not exist", name, accountName, resourceGroup) - } - return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMAutomationStringVariableDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).automationVariableClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_automation_string_variable" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - accountName := rs.Primary.Attributes["automation_account_name"] - - if resp, err := client.Get(ctx, resourceGroup, accountName, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on automationVariableClient: %+v", err) - } - } - - return nil - } - - return nil -} - -func testAccAzureRMAutomationStringVariable_basic(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_automation_account" "test" { - name = "acctestAutoAcct-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - sku_name = "Basic" -} - -resource "azurerm_automation_string_variable" "test" { - name = "acctestAutoVar-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - automation_account_name = "${azurerm_automation_account.test.name}" - value = "Hello, Terraform Basic Test." -} -`, rInt, location, rInt, rInt) -} - -func testAccAzureRMAutomationStringVariable_complete(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_automation_account" "test" { - name = "acctestAutoAcct-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - sku_name = "Basic" -} - -resource "azurerm_automation_string_variable" "test" { - name = "acctestAutoVar-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - automation_account_name = "${azurerm_automation_account.test.name}" - description = "This variable is created by Terraform acceptance test." - value = "Hello, Terraform Complete Test." -} -`, rInt, location, rInt, rInt) -} diff --git a/build/azterraform/azurerm/resource_arm_batch_account.go b/build/azterraform/azurerm/resource_arm_batch_account.go deleted file mode 100644 index 5c89271672bf..000000000000 --- a/build/azterraform/azurerm/resource_arm_batch_account.go +++ /dev/null @@ -1,299 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmBatchAccount() *schema.Resource { - return &schema.Resource{ - Create: resourceArmBatchAccountCreate, - Read: resourceArmBatchAccountRead, - Update: resourceArmBatchAccountUpdate, - Delete: resourceArmBatchAccountDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validateAzureRMBatchAccountName, - }, - - "location": locationSchema(), - - "resource_group_name": resourceGroupNameSchema(), - - "key_vault_reference": { - Type: schema.TypeList, - Optional: true, - ForceNew: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "id": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "url": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - }, - }, - }, - - "pool_allocation_mode": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - ValidateFunc: validation.StringInSlice([]string{ - string(batch.BatchService), - string(batch.UserSubscription), - }, false), - Default: string(batch.BatchService), - }, - - "storage_account_id": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: azure.ValidateResourceIDOrEmpty, - }, - - "tags": tagsSchema(), - - "account_endpoint": { - Type: schema.TypeString, - Computed: true, - }, - }, - } -} - -func resourceArmBatchAccountCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).batchAccountClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_batch_account", *resp.ID) - } - } - - location := azureRMNormalizeLocation(d.Get("location").(string)) - keyVaultReference := d.Get("key_vault_reference").([]interface{}) - poolAllocationMode := d.Get("pool_allocation_mode").(string) - storageAccountId := d.Get("storage_account_id").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := batch.AccountCreateParameters{ - Location: utils.String(location), - AccountCreateProperties: &batch.AccountCreateProperties{ - KeyVaultReference: expandArmBatchAccountKeyVaultReference(keyVaultReference), - PoolAllocationMode: batch.PoolAllocationMode(poolAllocationMode), - }, - Tags: expandTags(tags), - } - - if storageAccountId != "" { - parameters.AccountCreateProperties.AutoStorage = &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(storageAccountId), - } - } - - future, err := client.Create(ctx, resourceGroup, name, parameters) - if err != nil { - return fmt.Errorf("Error creating Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - return fmt.Errorf("Error retrieving Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Batch Account %q (Resource Group %q) ID", name, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmBatchAccountRead(d, meta) -} - -func resourceArmBatchAccountRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).batchAccountClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["batchAccounts"] - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Batch Account %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - if properties := resp.AccountProperties; properties != nil { - d.Set("account_endpoint", properties.AccountEndpoint) - if err := d.Set("key_vault_reference", flattenArmBatchAccountKeyVaultReference(properties.KeyVaultReference)); err != nil { - return fmt.Errorf("Error setting `key_vault_reference`: %+v", err) - } - d.Set("pool_allocation_mode", string(properties.PoolAllocationMode)) - if autoStorage := properties.AutoStorage; autoStorage != nil { - d.Set("storage_account_id", autoStorage.StorageAccountID) - } - } - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmBatchAccountUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).batchAccountClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - storageAccountId := d.Get("storage_account_id").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := batch.AccountUpdateParameters{ - AccountUpdateProperties: &batch.AccountUpdateProperties{ - AutoStorage: &batch.AutoStorageBaseProperties{ - StorageAccountID: utils.String(storageAccountId), - }, - }, - Tags: expandTags(tags), - } - - - if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { - return fmt.Errorf("Error updating Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - return resourceArmBatchAccountRead(d, meta) -} - -func resourceArmBatchAccountDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).batchAccountClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["batchAccounts"] - - future, err := client.Delete(ctx, resourceGroup, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Batch Account %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - - return nil -} - -func expandArmBatchAccountKeyVaultReference(input []interface{}) *batch.KeyVaultReference { - if len(input) == 0 { - return nil - } - v := input[0].(map[string]interface{}) - - id := v["id"].(string) - url := v["url"].(string) - - result := batch.KeyVaultReference{ - ID: utils.String(id), - URL: utils.String(url), - } - return &result -} - - -func flattenArmBatchAccountKeyVaultReference(input *batch.KeyVaultReference) []interface{} { - if input == nil { - return make([]interface{}, 0) - } - - result := make(map[string]interface{}) - - if id := input.ID; id != nil { - result["id"] = *id - } - if url := input.URL; url != nil { - result["url"] = *url - } - - return []interface{}{result} -} - - -func validateAzureRMBatchAccountName(v interface{}, k string) (warnings []string, errors []error) { - value := v.(string) - if !regexp.MustCompile(`^[a-z0-9]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf("lowercase letters and numbers only are allowed in %q: %q", k, value)) - } - - if 3 > len(value) { - errors = append(errors, fmt.Errorf("%q cannot be less than 3 characters: %q", k, value)) - } - - if len(value) > 24 { - errors = append(errors, fmt.Errorf("%q cannot be longer than 24 characters: %q %d", k, value, len(value))) - } - - return warnings, errors -} diff --git a/build/azterraform/azurerm/resource_arm_batch_account_test.go b/build/azterraform/azurerm/resource_arm_batch_account_test.go deleted file mode 100644 index 75548f2636f4..000000000000 --- a/build/azterraform/azurerm/resource_arm_batch_account_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - -func TestAccAzureRMBatchAccount_basic(t *testing.T) { - resourceName := "azurerm_batch_account.test" - ri := tf.AccRandTimeInt() - location := testLocation() - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMBatchAccountDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMBatchAccount_basic(ri, location), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMBatchAccountExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "poolAllocationMode", "BatchService"), - resource.TestCheckResourceAttrSet(resourceName, "storageAccountId"), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - - -func testCheckAzureRMBatchAccountExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Batch Account not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - client := testAccProvider.Meta().(*ArmClient).batchAccountClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Batch Account %q (Resource Group %q) does not exist", name, resourceGroup) - } - return fmt.Errorf("Bad: Get on batchAccountClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMBatchAccountDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).batchAccountClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_batch_account" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on batchAccountClient: %+v", err) - } - } - - return nil - } - - return nil -} - -func testAccAzureRMBatchAccount_basic(rInt int, location string) string { - return fmt.Sprintf(` -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} - -resource "azurerm_storage_account" "test" { - name = "acctestsa-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "${azurerm_resource_group.test.location}" - accountTier = "Standard" - accountReplicationType = "LRS" -} - -resource "azurerm_batch_account" "test" { - name = "acctestbatch-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "${azurerm_resource_group.test.location}" - poolAllocationMode = "BatchService" - storageAccountId = "${azurerm_storage_account.test.id}" -} -`, rInt, location, rInt, rInt) -} diff --git a/build/azterraform/azurerm/resource_arm_container_registry.go b/build/azterraform/azurerm/resource_arm_container_registry.go deleted file mode 100644 index fc739974076c..000000000000 --- a/build/azterraform/azurerm/resource_arm_container_registry.go +++ /dev/null @@ -1,237 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmContainerRegistry() *schema.Resource { - return &schema.Resource{ - Create: resourceArmContainerRegistryCreate, - Read: resourceArmContainerRegistryRead, - Update: resourceArmContainerRegistryUpdate, - Delete: resourceArmContainerRegistryDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "location": locationSchema(), - - "admin_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - }, - - "sku": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(containerregistry.Classic), - string(containerregistry.Basic), - string(containerregistry.Standard), - string(containerregistry.Premium), - }, false), - Default: string(containerregistry.Classic), - }, - - "storage_account_id": { - Type: schema.TypeString, - Optional: true, - }, - - "tags": tagsSchema(), - - "login_server": { - Type: schema.TypeString, - Computed: true, - }, - }, - } -} - -func resourceArmContainerRegistryCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).containerRegistryClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_container_registry", *resp.ID) - } - } - - location := azureRMNormalizeLocation(d.Get("location").(string)) - adminEnabled := d.Get("admin_enabled").(bool) - storageAccountId := d.Get("storage_account_id").(string) - sku := d.Get("sku").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := containerregistry.Registry{ - Location: utils.String(location), - RegistryProperties: &containerregistry.RegistryProperties{ - AdminUserEnabled: utils.Bool(adminEnabled), - StorageAccount: &containerregistry.StorageAccountProperties{ - ID: utils.String(storageAccountId), - }, - }, - Sku: &containerregistry.Sku{ - Name: containerregistry.SkuName(sku), - }, - Tags: expandTags(tags), - } - - - future, err := client.Create(ctx, resourceGroup, name, parameters) - if err != nil { - return fmt.Errorf("Error creating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - return fmt.Errorf("Error retrieving Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Container Registry %q (Resource Group %q) ID", name, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmContainerRegistryRead(d, meta) -} - -func resourceArmContainerRegistryRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).containerRegistryClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["registries"] - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Container Registry %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - if registryProperties := resp.RegistryProperties; registryProperties != nil { - d.Set("admin_enabled", registryProperties.AdminUserEnabled) - if storageAccount := registryProperties.StorageAccount; storageAccount != nil { - d.Set("storage_account_id", storageAccount.ID) - } - } - d.Set("login_server", resp.LoginServer) - if sku := resp.Sku; sku != nil { - d.Set("sku", string(sku.Name)) - } - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmContainerRegistryUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).containerRegistryClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - adminEnabled := d.Get("admin_enabled").(bool) - storageAccountId := d.Get("storage_account_id").(string) - sku := d.Get("sku").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := containerregistry.RegistryUpdateParameters{ - RegistryPropertiesUpdateParameters: &containerregistry.RegistryPropertiesUpdateParameters{ - AdminUserEnabled: utils.Bool(adminEnabled), - StorageAccount: &containerregistry.StorageAccountProperties{ - ID: utils.String(storageAccountId), - }, - }, - Sku: &containerregistry.Sku{ - Name: containerregistry.SkuName(sku), - }, - Tags: expandTags(tags), - } - - - if _, err := client.Update(ctx, resourceGroup, name, parameters); err != nil { - return fmt.Errorf("Error updating Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - return resourceArmContainerRegistryRead(d, meta) -} - -func resourceArmContainerRegistryDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).containerRegistryClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["registries"] - - future, err := client.Delete(ctx, resourceGroup, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Container Registry %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_container_registry_test.go b/build/azterraform/azurerm/resource_arm_container_registry_test.go deleted file mode 100644 index 7b9be6724116..000000000000 --- a/build/azterraform/azurerm/resource_arm_container_registry_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMContainerRegistryExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Container Registry not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - client := testAccProvider.Meta().(*ArmClient).containerRegistryClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Container Registry %q (Resource Group %q) does not exist", name, resourceGroup) - } - return fmt.Errorf("Bad: Get on containerRegistryClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMContainerRegistryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).containerRegistryClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_container_registry" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on containerRegistryClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_front_door.go b/build/azterraform/azurerm/resource_arm_front_door.go deleted file mode 100644 index dd7a0cbe4ab0..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door.go +++ /dev/null @@ -1,198 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmFrontDoor() *schema.Resource { - return &schema.Resource{ - Create: resourceArmFrontDoorCreateUpdate, - Read: resourceArmFrontDoorRead, - Update: resourceArmFrontDoorCreateUpdate, - Delete: resourceArmFrontDoorDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "location": locationSchema(), - - "resource_group_name": resourceGroupNameSchema(), - - "enabled_state": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(frontdoor.EnabledStateEnabled), - string(frontdoor.EnabledStateDisabled), - }, false), - Default: string(frontdoor.Enabled), - }, - - "enforce_certificate_name_check": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(frontdoor.EnforceCertificateNameCheckEnabledStateEnabled), - string(frontdoor.EnforceCertificateNameCheckEnabledStateDisabled), - }, false), - }, - - "friendly_name": { - Type: schema.TypeString, - Optional: true, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmFrontDoorCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_front_door", *resp.ID) - } - } - - location := azureRMNormalizeLocation(d.Get("location").(string)) - enabledState := d.Get("enabled_state").(string) - enforceCertificateNameCheck := d.Get("enforce_certificate_name_check").(string) - friendlyName := d.Get("friendly_name").(string) - tags := d.Get("tags").(map[string]interface{}) - - parameters := frontdoor.FrontDoor{ - Location: utils.String(location), - Properties: &frontdoor.Properties{ - BackendPoolsSettings: &frontdoor.BackendPoolsSettings{ - EnforceCertificateNameCheck: frontdoor.EnforceCertificateNameCheckEnabledState(enforceCertificateNameCheck), - }, - EnabledState: frontdoor.EnabledState(enabledState), - FriendlyName: utils.String(friendlyName), - }, - Tags: expandTags(tags), - } - - - future, err := client.CreateOrUpdate(ctx, resourceGroup, name, parameters) - if err != nil { - return fmt.Errorf("Error creating Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - return fmt.Errorf("Error retrieving Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Front Door %q (Resource Group %q) ID", name, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmFrontDoorRead(d, meta) -} - -func resourceArmFrontDoorRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["frontDoors"] - - resp, err := client.Get(ctx, resourceGroup, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Front Door %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - if properties := resp.Properties; properties != nil { - d.Set("enabled_state", string(properties.EnabledState)) - if backendPoolsSettings := properties.BackendPoolsSettings; backendPoolsSettings != nil { - d.Set("enforce_certificate_name_check", string(backendPoolsSettings.EnforceCertificateNameCheck)) - } - d.Set("friendly_name", properties.FriendlyName) - } - flattenAndSetTags(d, resp.Tags) - - return nil -} - - -func resourceArmFrontDoorDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - name := id.Path["frontDoors"] - - future, err := client.Delete(ctx, resourceGroup, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Front Door %q (Resource Group %q): %+v", name, resourceGroup, err) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go b/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go deleted file mode 100644 index 2d48bcff8406..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door_backend_pool.go +++ /dev/null @@ -1,294 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmFrontDoorBackendPool() *schema.Resource { - return &schema.Resource{ - Create: resourceArmFrontDoorBackendPoolCreateUpdate, - Read: resourceArmFrontDoorBackendPoolRead, - Update: resourceArmFrontDoorBackendPoolCreateUpdate, - Delete: resourceArmFrontDoorBackendPoolDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "frontdoor_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "backends": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "address": { - Type: schema.TypeString, - Optional: true, - }, - "enabled_state": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(frontdoor.Enabled), - string(frontdoor.Disabled), - }, false), - Default: string(frontdoor.Enabled), - }, - "host_header": { - Type: schema.TypeString, - Optional: true, - }, - "http_port": { - Type: schema.TypeInt, - Optional: true, - }, - "https_port": { - Type: schema.TypeInt, - Optional: true, - }, - "priority": { - Type: schema.TypeInt, - Optional: true, - }, - "weight": { - Type: schema.TypeInt, - Optional: true, - }, - }, - }, - }, - - "health_probe_settings_id": { - Type: schema.TypeString, - Optional: true, - }, - - "load_balancing_settings_id": { - Type: schema.TypeString, - Optional: true, - }, - }, - } -} - -func resourceArmFrontDoorBackendPoolCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorBackendPoolsClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - frontDoor := d.Get("frontdoor_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_front_door_backend_pool", *resp.ID) - } - } - - backends := d.Get("backends").([]interface{}) - healthProbeSettingsId := d.Get("health_probe_settings_id").(string) - loadBalancingSettingsId := d.Get("load_balancing_settings_id").(string) - - parameters := frontdoor.BackendPool{ - BackendPoolProperties: &frontdoor.BackendPoolProperties{ - Backends: expandArmFrontDoorBackendPoolBackend(backends), - HealthProbeSettings: &frontdoor.SubResource{ - ID: utils.String(healthProbeSettingsId), - }, - LoadBalancingSettings: &frontdoor.SubResource{ - ID: utils.String(loadBalancingSettingsId), - }, - }, - } - - - future, err := client.CreateOrUpdate(ctx, resourceGroup, frontDoor, name, parameters) - if err != nil { - return fmt.Errorf("Error creating Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - return fmt.Errorf("Error retrieving Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q) ID", name, frontDoor, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmFrontDoorBackendPoolRead(d, meta) -} - -func resourceArmFrontDoorBackendPoolRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorBackendPoolsClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - frontDoor := id.Path["frontDoors"] - name := id.Path["backendPools"] - - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Front Door Backend Pool %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("frontdoor_name", frontDoor) - if properties := resp.BackendPoolProperties; properties != nil { - if err := d.Set("backends", flattenArmFrontDoorBackendPoolBackend(properties.Backends)); err != nil { - return fmt.Errorf("Error setting `backends`: %+v", err) - } - if healthProbeSettings := properties.HealthProbeSettings; healthProbeSettings != nil { - d.Set("health_probe_settings_id", healthProbeSettings.ID) - } - if loadBalancingSettings := properties.LoadBalancingSettings; loadBalancingSettings != nil { - d.Set("load_balancing_settings_id", loadBalancingSettings.ID) - } - } - - return nil -} - - -func resourceArmFrontDoorBackendPoolDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorBackendPoolsClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - frontDoor := id.Path["frontDoors"] - name := id.Path["backendPools"] - - future, err := client.Delete(ctx, resourceGroup, frontDoor, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - } - - return nil -} - -func expandArmFrontDoorBackendPoolBackend(input []interface{}) *[]frontdoor.Backend { - results := make([]frontdoor.Backend, 0) - for _, v := range input { - address := v["address"].(string) - httpPort := v["http_port"].(int) - httpsPort := v["https_port"].(int) - hostHeader := v["host_header"].(string) - enabledState := v["enabled_state"].(string) - priority := v["priority"].(int) - weight := v["weight"].(int) - - item := frontdoor.Backend{ - Address: utils.String(address), - BackendHostHeader: utils.String(hostHeader), - EnabledState: frontdoor.BackendEnabledState(enabledState), - HTTPPort: utils.Int32(int32(httpPort)), - HTTPSPort: utils.Int32(int32(httpsPort)), - Priority: utils.Int32(int32(priority)), - Weight: utils.Int32(int32(weight)), - } - - results = append(results, item) - } - return &results -} - - -func flattenArmFrontDoorBackendPoolBackend(input *[]frontdoor.Backend) []interface{} { - results := make([]interface{}, 0) - if input == nil { - return results - } - - for _, item := range input { - v := make(map[string]interface{}) - - if address := item.Address; address != nil { - v["address"] = *address - } - if enabledState := string(item.EnabledState); enabledState != nil { - v["enabled_state"] = *enabledState - } - if hostHeader := item.BackendHostHeader; hostHeader != nil { - v["host_header"] = *hostHeader - } - if httpPort := item.HTTPPort; httpPort != nil { - v["http_port"] = int(*httpPort) - } - if httpsPort := item.HTTPSPort; httpsPort != nil { - v["https_port"] = int(*httpsPort) - } - if priority := item.Priority; priority != nil { - v["priority"] = int(*priority) - } - if weight := item.Weight; weight != nil { - v["weight"] = int(*weight) - } - - results = append(results, v) - } - - return results -} diff --git a/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go b/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go deleted file mode 100644 index aa5d2a07a32b..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door_backend_pool_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMFrontDoorBackendPoolExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Front Door Backend Pool not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - frontDoor := rs.Primary.Attributes["frontdoor_name"] - - client := testAccProvider.Meta().(*ArmClient).frontdoorBackendPoolsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Front Door Backend Pool %q (Frontdoor Name %q / Resource Group %q) does not exist", name, frontDoor, resourceGroup) - } - return fmt.Errorf("Bad: Get on frontdoorBackendPoolsClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMFrontDoorBackendPoolDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).frontdoorBackendPoolsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_front_door_backend_pool" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - frontDoor := rs.Primary.Attributes["frontdoor_name"] - - if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on frontdoorBackendPoolsClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go deleted file mode 100644 index a02e9d55923f..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint.go +++ /dev/null @@ -1,200 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmFrontDoorFrontendEndpoint() *schema.Resource { - return &schema.Resource{ - Create: resourceArmFrontDoorFrontendEndpointCreateUpdate, - Read: resourceArmFrontDoorFrontendEndpointRead, - Update: resourceArmFrontDoorFrontendEndpointCreateUpdate, - Delete: resourceArmFrontDoorFrontendEndpointDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validate.NoEmptyStrings, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "frontdoor_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "host_name": { - Type: schema.TypeString, - Optional: true, - }, - - "session_affinity_enabled_state": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{ - string(frontdoor.SessionAffinityEnabledStateEnabled), - string(frontdoor.SessionAffinityEnabledStateDisabled), - }, false), - Default: string(frontdoor.Enabled), - }, - - "session_affinity_ttl_seconds": { - Type: schema.TypeInt, - Optional: true, - }, - - "web_application_firewall_policy_id": { - Type: schema.TypeString, - Optional: true, - }, - }, - } -} - -func resourceArmFrontDoorFrontendEndpointCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorFrontendEndpointsClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - frontDoor := d.Get("frontdoor_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_front_door_frontend_endpoint", *resp.ID) - } - } - - hostName := d.Get("host_name").(string) - sessionAffinityEnabledState := d.Get("session_affinity_enabled_state").(string) - sessionAffinityTtlSeconds := d.Get("session_affinity_ttl_seconds").(int) - webApplicationFirewallPolicyId := d.Get("web_application_firewall_policy_id").(string) - - parameters := frontdoor.FrontendEndpoint{ - FrontendEndpointProperties: &frontdoor.FrontendEndpointProperties{ - HostName: utils.String(hostName), - SessionAffinityEnabledState: frontdoor.SessionAffinityEnabledState(sessionAffinityEnabledState), - SessionAffinityTTLSeconds: utils.Int32(int32(sessionAffinityTtlSeconds)), - WebApplicationFirewallPolicyLink: &frontdoor.FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink{ - ID: utils.String(webApplicationFirewallPolicyId), - }, - }, - } - - - future, err := client.CreateOrUpdate(ctx, resourceGroup, frontDoor, name, parameters) - if err != nil { - return fmt.Errorf("Error creating Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - return fmt.Errorf("Error waiting for creation of Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - return fmt.Errorf("Error retrieving Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q) ID", name, frontDoor, resourceGroup) - } - d.SetId(*resp.ID) - - return resourceArmFrontDoorFrontendEndpointRead(d, meta) -} - -func resourceArmFrontDoorFrontendEndpointRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorFrontendEndpointsClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - frontDoor := id.Path["frontDoors"] - name := id.Path["frontendEndpoints"] - - resp, err := client.Get(ctx, resourceGroup, frontDoor, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Front Door Frontend Endpoint %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("frontdoor_name", frontDoor) - if properties := resp.FrontendEndpointProperties; properties != nil { - d.Set("host_name", properties.HostName) - d.Set("session_affinity_enabled_state", string(properties.SessionAffinityEnabledState)) - d.Set("session_affinity_ttl_seconds", int(properties.SessionAffinityTTLSeconds)) - if webApplicationFirewallPolicyLink := properties.WebApplicationFirewallPolicyLink; webApplicationFirewallPolicyLink != nil { - d.Set("web_application_firewall_policy_id", webApplicationFirewallPolicyLink.ID) - } - } - - return nil -} - - -func resourceArmFrontDoorFrontendEndpointDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).frontdoorFrontendEndpointsClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - frontDoor := id.Path["frontDoors"] - name := id.Path["frontendEndpoints"] - - future, err := client.Delete(ctx, resourceGroup, frontDoor, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q): %+v", name, frontDoor, resourceGroup, err) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go b/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go deleted file mode 100644 index d450ee93a6c7..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door_frontend_endpoint_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMFrontDoorFrontendEndpointExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Front Door Frontend Endpoint not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - frontDoor := rs.Primary.Attributes["frontdoor_name"] - - client := testAccProvider.Meta().(*ArmClient).frontdoorFrontendEndpointsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Front Door Frontend Endpoint %q (Frontdoor Name %q / Resource Group %q) does not exist", name, frontDoor, resourceGroup) - } - return fmt.Errorf("Bad: Get on frontdoorFrontendEndpointsClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMFrontDoorFrontendEndpointDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).frontdoorFrontendEndpointsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_front_door_frontend_endpoint" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - frontDoor := rs.Primary.Attributes["frontdoor_name"] - - if resp, err := client.Get(ctx, resourceGroup, frontDoor, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on frontdoorFrontendEndpointsClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_front_door_test.go b/build/azterraform/azurerm/resource_arm_front_door_test.go deleted file mode 100644 index 186c62e10380..000000000000 --- a/build/azterraform/azurerm/resource_arm_front_door_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMFrontDoorExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Front Door not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - client := testAccProvider.Meta().(*ArmClient).frontdoorClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Front Door %q (Resource Group %q) does not exist", name, resourceGroup) - } - return fmt.Errorf("Bad: Get on frontdoorClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMFrontDoorDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).frontdoorClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_front_door" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - if resp, err := client.Get(ctx, resourceGroup, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on frontdoorClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_resource_group.go b/build/azterraform/azurerm/resource_arm_resource_group.go deleted file mode 100644 index d5868a00e66d..000000000000 --- a/build/azterraform/azurerm/resource_arm_resource_group.go +++ /dev/null @@ -1,142 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmResourceGroup() *schema.Resource { - return &schema.Resource{ - Create: resourceArmResourceGroupCreateUpdate, - Read: resourceArmResourceGroupRead, - Update: resourceArmResourceGroupCreateUpdate, - Delete: resourceArmResourceGroupDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": resourceGroupNameSchema(), - - "location": locationSchema(), - - "tags": tagsSchema(), - }, - } -} - -func resourceArmResourceGroupCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Resource Group %q: %+v", name, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_resource_group", *resp.ID) - } - } - - location := azureRMNormalizeLocation(d.Get("location").(string)) - tags := d.Get("tags").(map[string]interface{}) - - parameters := resources.Group{ - Location: utils.String(location), - Tags: expandTags(tags), - } - - - if _, err := client.CreateOrUpdate(ctx, name, parameters); err != nil { - return fmt.Errorf("Error creating Resource Group %q: %+v", name, err) - } - - - resp, err := client.Get(ctx, name) - if err != nil { - return fmt.Errorf("Error retrieving Resource Group %q: %+v", name, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Resource Group %q ID", name) - } - d.SetId(*resp.ID) - - return resourceArmResourceGroupRead(d, meta) -} - -func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.ResourceGroup - - resp, err := client.Get(ctx, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Resource Group %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Resource Group %q: %+v", name, err) - } - - - d.Set("name", resp.Name) - if location := resp.Location; location != nil { - d.Set("location", azureRMNormalizeLocation(*location)) - } - flattenAndSetTags(d, resp.Tags) - - return nil -} - - -func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).resourceGroupsClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.ResourceGroup - - future, err := client.Delete(ctx, name) - if err != nil { - if response.WasNotFound(future.Response()) { - return nil - } - return fmt.Errorf("Error deleting Resource Group %q: %+v", name, err) - } - - if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { - if !response.WasNotFound(future.Response()) { - return fmt.Errorf("Error waiting for deleting Resource Group %q: %+v", name, err) - } - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_resource_group_test.go b/build/azterraform/azurerm/resource_arm_resource_group_test.go deleted file mode 100644 index e6a7d9b084f3..000000000000 --- a/build/azterraform/azurerm/resource_arm_resource_group_test.go +++ /dev/null @@ -1,72 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMResourceGroupExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Resource Group not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - - client := testAccProvider.Meta().(*ArmClient).resourceGroupsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Resource Group %q does not exist", name) - } - return fmt.Errorf("Bad: Get on resourceGroupsClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMResourceGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).resourceGroupsClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_resource_group" { - continue - } - - name := rs.Primary.Attributes["name"] - - if resp, err := client.Get(ctx, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on resourceGroupsClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go deleted file mode 100644 index 88f8706c93e9..000000000000 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config.go +++ /dev/null @@ -1,160 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - - - -func resourceArmServiceBusDisasterRecoveryConfig() *schema.Resource { - return &schema.Resource{ - Create: resourceArmServiceBusDisasterRecoveryConfigCreateUpdate, - Read: resourceArmServiceBusDisasterRecoveryConfigRead, - Update: resourceArmServiceBusDisasterRecoveryConfigCreateUpdate, - Delete: resourceArmServiceBusDisasterRecoveryConfigDelete, - - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, - - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": resourceGroupNameSchema(), - - "namespace_name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "alternate_name": { - Type: schema.TypeString, - Optional: true, - }, - - "partner_namespace": { - Type: schema.TypeString, - Optional: true, - }, - }, - } -} - -func resourceArmServiceBusDisasterRecoveryConfigCreateUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).serviceBusRecoveryClient - ctx := meta.(*ArmClient).StopContext - - name := d.Get("name").(string) - resourceGroup := d.Get("resource_group_name").(string) - servicebusName := d.Get("namespace_name").(string) - - if requireResourcesToBeImported { - resp, err := client.Get(ctx, resourceGroup, servicebusName, name) - if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Error checking for present of existing Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) - } - } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("azurerm_service_bus_disaster_recovery_config", *resp.ID) - } - } - - alternateName := d.Get("alternate_name").(string) - partnerNamespace := d.Get("partner_namespace").(string) - - parameters := servicebus.ArmDisasterRecovery{ - ArmDisasterRecoveryProperties: &servicebus.ArmDisasterRecoveryProperties{ - AlternateName: utils.String(alternateName), - PartnerNamespace: utils.String(partnerNamespace), - }, - } - - - if _, err := client.CreateOrUpdate(ctx, resourceGroup, servicebusName, name, parameters); err != nil { - return fmt.Errorf("Error creating Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) - } - - - resp, err := client.Get(ctx, resourceGroup, servicebusName, name) - if err != nil { - return fmt.Errorf("Error retrieving Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) - } - if resp.ID == nil { - return fmt.Errorf("Cannot read Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q) ID", name, resourceGroup, servicebusName) - } - d.SetId(*resp.ID) - - return resourceArmServiceBusDisasterRecoveryConfigRead(d, meta) -} - -func resourceArmServiceBusDisasterRecoveryConfigRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).serviceBusRecoveryClient - ctx := meta.(*ArmClient).StopContext - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - servicebusName := id.Path["namespaces"] - name := id.Path["disasterRecoveryConfigs"] - - resp, err := client.Get(ctx, resourceGroup, servicebusName, name) - if err != nil { - if utils.ResponseWasNotFound(resp.Response) { - log.Printf("[INFO] Service Bus Disaster Recovery Config %q does not exist - removing from state", d.Id()) - d.SetId("") - return nil - } - return fmt.Errorf("Error reading Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) - } - - - d.Set("name", resp.Name) - d.Set("resource_group_name", resourceGroup) - d.Set("namespace_name", servicebusName) - if armDisasterRecoveryProperties := resp.ArmDisasterRecoveryProperties; armDisasterRecoveryProperties != nil { - d.Set("alternate_name", armDisasterRecoveryProperties.AlternateName) - d.Set("partner_namespace", armDisasterRecoveryProperties.PartnerNamespace) - } - - return nil -} - - -func resourceArmServiceBusDisasterRecoveryConfigDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).serviceBusRecoveryClient - ctx := meta.(*ArmClient).StopContext - - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resourceGroup := id.ResourceGroup - servicebusName := id.Path["namespaces"] - name := id.Path["disasterRecoveryConfigs"] - - if _, err := client.Delete(ctx, resourceGroup, servicebusName, name); err != nil { - return fmt.Errorf("Error deleting Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q): %+v", name, resourceGroup, servicebusName, err) - } - - return nil -} diff --git a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go b/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go deleted file mode 100644 index 0a2800c3b24d..000000000000 --- a/build/azterraform/azurerm/resource_arm_service_bus_disaster_recovery_config_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// ---------------------------------------------------------------------------- -// -// *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -// -// ---------------------------------------------------------------------------- -// -// This file is automatically generated by Magic Modules and manual -// changes will be clobbered when the file is regenerated. -// -// Please read more about how to change this file in -// .github/CONTRIBUTING.md. -// -// ---------------------------------------------------------------------------- - -package azurerm - -import ( - "fmt" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" -) - - -func testCheckAzureRMServiceBusDisasterRecoveryConfigExists(resourceName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return fmt.Errorf("Service Bus Disaster Recovery Config not found: %s", resourceName) - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - servicebusName := rs.Primary.Attributes["namespace_name"] - - client := testAccProvider.Meta().(*ArmClient).serviceBusRecoveryClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { - if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Service Bus Disaster Recovery Config %q (Resource Group %q / Namespace Name %q) does not exist", name, resourceGroup, servicebusName) - } - return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) - } - - return nil - } -} - -func testCheckAzureRMServiceBusDisasterRecoveryConfigDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).serviceBusRecoveryClient - ctx := testAccProvider.Meta().(*ArmClient).StopContext - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_service_bus_disaster_recovery_config" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - servicebusName := rs.Primary.Attributes["namespace_name"] - - if resp, err := client.Get(ctx, resourceGroup, servicebusName, name); err != nil { - if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on serviceBusRecoveryClient: %+v", err) - } - } - - return nil - } - - return nil -} diff --git a/build/azterraform/website/docs/d/automation_string_variable.html.markdown b/build/azterraform/website/docs/d/automation_string_variable.html.markdown deleted file mode 100644 index f07a59964e74..000000000000 --- a/build/azterraform/website/docs/d/automation_string_variable.html.markdown +++ /dev/null @@ -1,63 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_automation_string_variable" -sidebar_current: "docs-azurerm-datasource-automation-string-variable" -description: |- - Gets information about an existing Automation String Variable ---- - -# Data Source: azurerm_automation_string_variable - -Use this data source to access information about an existing Automation String Variable. - - -## Example Usage - -```hcl -data "azurerm_automation_string_variable" "example" { - name = "tfex-example-var" - resource_group_name = "tfex-example-rg" - automation_account_name = "tfex-example-account" -} - -output "variable_id" { - value = "${data.azurerm_automation_string_variable.example.id}" -} -``` - - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the Automation Variable. - -* `resource_group_name` - (Required) The Name of the Resource Group where the App Service exists. - -* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. - - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the Automation Variable. - -* `description` - The description of the Automation Variable. - -* `encrypted` - Specifies if the Automation Variable is encrypted. - -* `value` - The value of the Automation Variable. diff --git a/build/azterraform/website/docs/d/batch_account.html.markdown b/build/azterraform/website/docs/d/batch_account.html.markdown deleted file mode 100644 index 49f87ed673af..000000000000 --- a/build/azterraform/website/docs/d/batch_account.html.markdown +++ /dev/null @@ -1,75 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_batch_account" -sidebar_current: "docs-azurerm-datasource-batch-account" -description: |- - Gets information about an existing Batch Account ---- - -# Data Source: azurerm_batch_account - -Use this data source to access information about an existing Batch Account. - - -## Example Usage - -```hcl -data "azurerm_batch_account" "example" { - name = "example-batch-account" - resource_group_name = "example-rg" -} - -output "batch_id" { - value = "${data.azurerm_batch_account.example.id}" -} -``` - - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the Batch Account. - -* `resource_group_name` - (Required) The Name of the Resource Group where the App Service exists. - - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the Batch account. - -* `location` - Specifies the supported Azure location where the resource exists. - -* `account_endpoint` - The account endpoint used to interact with the Batch service. - -* `key_vault_reference` - One `key_vault_reference` block defined below. - -* `pool_allocation_mode` - The pool acclocation mode of the Batch Account. - -* `storage_account_id` - The ID of the Batch Account auto storage account. - -* `tags` - A mapping of tags to assign to the batch account. - - ---- - -The `key_vault_reference` block contains the following: - -* `id` - The resource ID of the Azure key vault associated with the Batch account. - -* `url` - The URL of the Azure key vault associated with the Batch account. diff --git a/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown b/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown deleted file mode 100644 index 12ae81fbd35f..000000000000 --- a/build/azterraform/website/docs/r/api_management_diagnostic.html.markdown +++ /dev/null @@ -1,105 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_api_management_diagnostic" -sidebar_current: "docs-azurerm-resource-api-management-diagnostic" -description: |- - Manages an API Management Diagnostic on Azure. ---- - -# azurerm_api_management_diagnostic - -Manages an API Management Diagnostic on Azure. - - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Diagnostic identifier. Must be unique in the current API Management service instance. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group. Changing this forces a new resource to be created. - -* `api_management_name` - (Required) The name of the API Management service. Changing this forces a new resource to be created. - -* `logger_id` - (Required) Resource Id of a target logger. - -* `always_log` - (Optional) Specifies for what type of messages sampling settings should not apply. - -* `backend` - (Optional) One `backend` block defined below. - -* `enable_http_correlation_headers` - (Optional) Whether to process Correlation Headers coming to Api Management Service. Only applicable to Application Insights diagnostics. Defaults to `true`. - -* `frontend` - (Optional) One `frontend` block defined below. - -* `sampling_percentage` - (Optional) Rate of sampling for fixed-rate sampling. - -* `sampling_type` - (Optional) Sampling type. - ---- - -The `backend` block supports the following: - -* `request` - (Optional) One `request` block defined below. - -* `response` - (Optional) One `response` block defined below. - - ---- - -The `request` block supports the following: - -* `headers` - (Optional) Array of HTTP Headers to log. - -* `body_bytes` - (Optional) Number of request body bytes to log. - ---- - -The `response` block supports the following: - -* `headers` - (Optional) Array of HTTP Headers to log. - -* `body_bytes` - (Optional) Number of request body bytes to log. - ---- - -The `frontend` block supports the following: - -* `request` - (Optional) One `request` block defined below. - -* `response` - (Optional) One `response` block defined below. - - ---- - -The `request` block supports the following: - -* `headers` - (Optional) Array of HTTP Headers to log. - -* `body_bytes` - (Optional) Number of request body bytes to log. - ---- - -The `response` block supports the following: - -* `headers` - (Optional) Array of HTTP Headers to log. - -* `body_bytes` - (Optional) Number of request body bytes to log. - -## Attributes Reference - -The following attributes are exported: - -* `id` - Resource ID. diff --git a/build/azterraform/website/docs/r/api_management_policy.html.markdown b/build/azterraform/website/docs/r/api_management_policy.html.markdown deleted file mode 100644 index eebeb499ee88..000000000000 --- a/build/azterraform/website/docs/r/api_management_policy.html.markdown +++ /dev/null @@ -1,80 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_api_management_policy" -sidebar_current: "docs-azurerm-resource-api-management-policy" -description: |- - Manages a global Policy within an API Management Service. ---- - -# azurerm_api_management_policy - -Manages a global Policy within an API Management Service. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "example-rg" - location = "West US" -} - -resource "azurerm_api_management" "example" { - name = "example-apim" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - publisher_name = "pub1" - publisher_email = "pub1@email.com" - - sku = { - name = "Developer" - capacity = 1 - } -} - -resource "azurerm_api_management_policy" "example" { - resource_group_name = "${azurerm_resource_group.example.name}" - api_management_name = "${azurerm_api_management.example.name}" - xml_content = "" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `resource_group_name` - (Required) The name of the Resource Group in which the API Management Service exists. Changing this forces a new resource to be created. - -* `api_management_name` - (Required) The name of the API Management Service where this Policy should be created. Changing this forces a new resource to be created. - -* `xml_content` - (Optional) The XML configuration of this Policy. - -* `xml_link` - (Optional) The HTTP endpoint of the XML configuration accessible from the API Management Service. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the API Management Policy. - - -## Import - -Api Management Policy can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_api_management_policy.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.ApiManagement/service/example-apim -``` diff --git a/build/azterraform/website/docs/r/automation_null_variable.html.markdown b/build/azterraform/website/docs/r/automation_null_variable.html.markdown deleted file mode 100644 index acb4be8e659d..000000000000 --- a/build/azterraform/website/docs/r/automation_null_variable.html.markdown +++ /dev/null @@ -1,77 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_automation_null_variable" -sidebar_current: "docs-azurerm-resource-automation-null-variable" -description: |- - Manages an automation variable on Azure. ---- - -# azurerm_automation_null_variable - -Manages an automation variable on Azure. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "tfex-example-rg" - location = "West US" -} - -resource "azurerm_automation_account" "example" { - name = "tfex-example-account" - location = "${azurerm_resource_group.example.location}" - resource_group_name = "${azurerm_resource_group.example.name}" - - sku = { - name = "Basic" - } -} - -resource "azurerm_automation_null_variable" "example" { - name = "tfex-example-var" - resource_group_name = "${azurerm_resource_group.example.name}" - automation_account_name = "${azurerm_automation_account.example.name}" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the Automation Variable. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the Automation Variable. Changing this forces a new resource to be created. - -* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. Changing this forces a new resource to be created. - -* `description` - (Optional) The description of the Automation Variable. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the Automation Variable. - - -## Import - -Automation Null Variable can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_automation_null_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/tfex-example-rg/providers/Microsoft.Automation/automationAccounts/tfex-example-account/variables/tfex-example-var -``` diff --git a/build/azterraform/website/docs/r/automation_string_variable.html.markdown b/build/azterraform/website/docs/r/automation_string_variable.html.markdown deleted file mode 100644 index 5d685207c199..000000000000 --- a/build/azterraform/website/docs/r/automation_string_variable.html.markdown +++ /dev/null @@ -1,79 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_automation_string_variable" -sidebar_current: "docs-azurerm-resource-automation-string-variable" -description: |- - Manages an automation variable on Azure. ---- - -# azurerm_automation_string_variable - -Manages an automation variable on Azure. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "tfex-example-rg" - location = "West US" -} - -resource "azurerm_automation_account" "example" { - name = "tfex-example-account" - location = "${azurerm_resource_group.example.location}" - resource_group_name = "${azurerm_resource_group.example.name}" - sku_name = "Basic" -} - -resource "azurerm_automation_string_variable" "example" { - name = "tfex-example-var" - resource_group_name = "${azurerm_resource_group.example.name}" - automation_account_name = "${azurerm_automation_account.example.name}" - value = "Hello, Terraform Basic Test." -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the Automation Variable. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the Automation Variable. Changing this forces a new resource to be created. - -* `automation_account_name` - (Required) The name of the automation account in which the Variable is created. Changing this forces a new resource to be created. - -* `description` - (Optional) The description of the Automation Variable. - -* `encrypted` - (Optional) Specifies if the Automation Variable is encrypted. Defaults to `false`. - -* `value` - (Optional) The value of the Automation Variable. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the Automation Variable. - - -## Import - -Automation String Variable can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_automation_string_variable.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/tfex-example-rg/providers/Microsoft.Automation/automationAccounts/tfex-example-account/variables/tfex-example-var -``` diff --git a/build/azterraform/website/docs/r/batch_account.html.markdown b/build/azterraform/website/docs/r/batch_account.html.markdown deleted file mode 100644 index 04d728c9fda3..000000000000 --- a/build/azterraform/website/docs/r/batch_account.html.markdown +++ /dev/null @@ -1,93 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_batch_account" -sidebar_current: "docs-azurerm-resource-batch-account" -description: |- - Manages a Batch Account on Azure. ---- - -# azurerm_batch_account - -Manages a Batch Account on Azure. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "example-rg" - location = "West US" -} - -resource "azurerm_storage_account" "example" { - name = "examplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - accountTier = "Standard" - accountReplicationType = "LRS" -} - -resource "azurerm_batch_account" "example" { - name = "example-batch-account" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - poolAllocationMode = "BatchService" - storageAccountId = "${azurerm_storage_account.example.id}" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the Batch Account. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the Batch Account. Changing this forces a new resource to be created. - -* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. - -* `key_vault_reference` - (Optional) One `key_vault_reference` block defined below. Changing this forces a new resource to be created. - -* `pool_allocation_mode` - (Optional) The pool acclocation mode of the Batch Account. Defaults to `BatchService`. Changing this forces a new resource to be created. - -* `storage_account_id` - (Optional) The ID of the Batch Account auto storage account. - -* `tags` - (Optional) A mapping of tags to assign to the batch account. - ---- - -The `key_vault_reference` block supports the following: - -* `id` - (Required) The resource ID of the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. - -* `url` - (Required) The URL of the Azure key vault associated with the Batch account. Changing this forces a new resource to be created. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the Batch account. - -* `account_endpoint` - The account endpoint used to interact with the Batch service. - - -## Import - -Batch Account can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_batch_account.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Batch/batchAccounts/example-batch-account -``` diff --git a/build/azterraform/website/docs/r/container_registry.html.markdown b/build/azterraform/website/docs/r/container_registry.html.markdown deleted file mode 100644 index 3ccbc710c170..000000000000 --- a/build/azterraform/website/docs/r/container_registry.html.markdown +++ /dev/null @@ -1,78 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_container_registry" -sidebar_current: "docs-azurerm-resource-container-registry" -description: |- - Manages a container registry on Azure. ---- - -# azurerm_container_registry - -Manages a container registry on Azure. - - -## Example Usage - Container Registry - - -```hcl -resource "azurerm_resource_group" "example" { - name = "example-rg" - location = "West US" -} - -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" -} - -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Specifies the name of the Container Registry. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the Container Registry. Changing this forces a new resource to be created. - -* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. - -* `admin_enabled` - (Optional) Specifies whether the admin user is enabled. Defaults to `false`. - -* `storage_account_id` - (Optional) The ID of a Storage Account which must be located in the same Azure Region as the Container Registry. - -* `sku` - (Optional) The SKU name of the the container registry. Defaults to `Classic`. - -* `tags` - (Optional) A mapping of tags to assign to the container registry. - -## Attributes Reference - -The following attributes are exported: - -* `login_server` - The URL that can be used to log into the container registry. - -* `id` - The ID of the container registry. diff --git a/build/azterraform/website/docs/r/front_door.html.markdown b/build/azterraform/website/docs/r/front_door.html.markdown deleted file mode 100644 index 298e570361f5..000000000000 --- a/build/azterraform/website/docs/r/front_door.html.markdown +++ /dev/null @@ -1,73 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_front_door" -sidebar_current: "docs-azurerm-resource-front-door" -description: |- - Managed a Front Door on Azure. ---- - -# azurerm_front_door - -Managed a Front Door on Azure. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "example-rg" - location = "West US" -} - -resource "azurerm_frontdoor" "example" { - name = "example-frontdoor" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the Batch Account. Changing this forces a new resource to be created. - -* `location` - (Required) Resource location. Changing this forces a new resource to be created. - -* `enabled_state` - (Optional) Operational status of the Front Door load balancer. Defaults to `Enabled`. - -* `enforce_certificate_name_check` - (Optional) Whether to enforce certificate name check on HTTPS requests to all backend pools. No effect on non-HTTPS requests. - -* `friendly_name` - (Optional) A friendly name for the frontDoor. - -* `tags` - (Optional) Resource tags. - -## Attributes Reference - -The following attributes are exported: - -* `id` - Resource ID. - - -## Import - -Front Door can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_front_door.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors/example-frontdoor -``` diff --git a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown b/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown deleted file mode 100644 index 80a87ef92027..000000000000 --- a/build/azterraform/website/docs/r/front_door_backend_pool.html.markdown +++ /dev/null @@ -1,105 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_front_door_backend_pool" -sidebar_current: "docs-azurerm-resource-front-door-backend-pool" -description: |- - Managed a Front Door on Azure. ---- - -# azurerm_front_door_backend_pool - -Managed a Front Door on Azure. - - -## Example Usage - -```hcl -resource "azurerm_resource_group" "example" { - name = "example-rg" - location = "West US" -} - -resource "azurerm_frontdoor" "example" { - name = "example-frontdoor" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" -} - -resource "azurerm_frontdoor_backendpool" "example" { - name = "example-backend-pool" - resource_group_name = "${azurerm_resource_group.example.name}" - frontdoor_name = "${azurerm_frontdoor.example.name}" - - backend = { - http_port = 88 - https_port = 44 - } - - backend = { - http_port = 33 - https_port = 22 - } -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Name of the Backend Pool which is unique within the Front Door. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) Name of the Resource group within the Azure subscription. Changing this forces a new resource to be created. - -* `frontdoor_name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. - -* `backends` - (Optional) One or more `backend` block defined below. - -* `health_probe_settings_id` - (Optional) L7 health probe settings for a backend pool. - -* `load_balancing_settings_id` - (Optional) Load balancing settings for a backend pool. - ---- - -The `backend` block supports the following: - -* `address` - (Optional) Location of the backend (IP address or FQDN) - -* `http_port` - (Optional) The HTTP TCP port number. Must be between 1 and 65535. - -* `https_port` - (Optional) The HTTPS TCP port number. Must be between 1 and 65535. - -* `host_header` - (Optional) The value to use as the host header sent to the backend. If blank or unspecified, this defaults to the incoming host. - -* `enabled_state` - (Optional) Whether to enable use of this backend. Permitted values are 'Enabled' or 'Disabled'. Defaults to `Enabled`. - -* `priority` - (Optional) Priority to use for load balancing. Higher priorities will not be used for load balancing if any lower priority backend is healthy. - -* `weight` - (Optional) Weight of this endpoint for load balancing purposes. - -## Attributes Reference - -The following attributes are exported: - -* `id` - Resource ID. - - -## Import - -Front Door Backend Pool can be imported using the `resource id`, e.g. - -```shell -$ terraform import azurerm_front_door_backend_pool.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/frontDoors/example-frontdoor/backendPools/example-backend-pool -``` diff --git a/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown b/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown deleted file mode 100644 index 5a467b0c63b3..000000000000 --- a/build/azterraform/website/docs/r/front_door_frontend_endpoint.html.markdown +++ /dev/null @@ -1,49 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_front_door_frontend_endpoint" -sidebar_current: "docs-azurerm-resource-front-door-frontend-endpoint" -description: |- - Managed a Front Door on Azure. ---- - -# azurerm_front_door_frontend_endpoint - -Managed a Front Door on Azure. - - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Name of the Frontend endpoint which is unique within the Front Door. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) Name of the Resource group within the Azure subscription. Changing this forces a new resource to be created. - -* `frontdoor_name` - (Required) Name of the Front Door which is globally unique. Changing this forces a new resource to be created. - -* `host_name` - (Optional) The host name of the frontendEndpoint. Must be a domain name. - -* `session_affinity_enabled_state` - (Optional) Whether to allow session affinity on this host. Valid options are 'Enabled' or 'Disabled' Defaults to `Enabled`. - -* `session_affinity_ttl_seconds` - (Optional) UNUSED. This field will be ignored. The TTL to use in seconds for session affinity, if applicable. - -* `web_application_firewall_policy_id` - (Optional) Defines the Web Application Firewall policy for each host (if applicable). - -## Attributes Reference - -The following attributes are exported: - -* `id` - Resource ID. diff --git a/build/azterraform/website/docs/r/resource_group.html.markdown b/build/azterraform/website/docs/r/resource_group.html.markdown deleted file mode 100644 index 6608cb290d55..000000000000 --- a/build/azterraform/website/docs/r/resource_group.html.markdown +++ /dev/null @@ -1,55 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_resource_group" -sidebar_current: "docs-azurerm-resource-resource-group" -description: |- - Manages a resource group on Azure. ---- - -# azurerm_resource_group - -Manages a resource group on Azure. - - -## Example Usage - Resource Group - - -```hcl -resource "azurerm_resource_group" "example" { - name = "ExampleRG" - location = "West US" - - tags { - environment = "Production" - } -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the resource group. Changing this forces a new resource to be created. - -* `location` - (Required) The location where the resource group should be created. Changing this forces a new resource to be created. - -* `tags` - (Optional) A mapping of tags to assign to the resource group. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the resource group. diff --git a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown b/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown deleted file mode 100644 index dcb154d16a54..000000000000 --- a/build/azterraform/website/docs/r/service_bus_disaster_recovery_config.html.markdown +++ /dev/null @@ -1,59 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file in -# .github/CONTRIBUTING.md. -# -# ---------------------------------------------------------------------------- -layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_service_bus_disaster_recovery_config" -sidebar_current: "docs-azurerm-resource-service-bus-disaster-recovery-config" -description: |- - Manages a service bus disaster recovery config on Azure. ---- - -# azurerm_service_bus_disaster_recovery_config - -Manages a service bus disaster recovery config on Azure. - - -## Example Usage - Resource Group - - -```hcl -resource "azurerm_resource_group" "example" { - name = "ExampleRG" - location = "West US" - - tags { - environment = "Production" - } -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) The name of the service bus disaster recovery. Changing this forces a new resource to be created. - -* `resource_group_name` - (Required) The name of the resource group in which to create the service bus disaster recovery. Changing this forces a new resource to be created. - -* `namespace_name` - (Required) The name of the service bus namespace in which the config is created. Changing this forces a new resource to be created. - -* `alternate_name` - (Optional) The alternative name of the service bus disaster recovery. - -* `partner_namespace` - (Optional) The parter namespace of the service bus disaster recovery. - -## Attributes Reference - -The following attributes are exported: - -* `id` - The ID of the service bus disaster recovery. diff --git a/compiler.rb b/compiler.rb index 80656d9dc758..1fc6bb4795f1 100755 --- a/compiler.rb +++ b/compiler.rb @@ -153,7 +153,9 @@ # In order to only copy/compile files once per provider this must be called outside # of the products loop. This will get called with the provider from the final iteration # of the loop -# provider&.copy_common_files(output_path, version) -# provider&.compile_common_files(output_path, version) + +# TODO: Azure Swith +#provider&.copy_common_files(output_path, version) +#provider&.compile_common_files(output_path, version) # rubocop:enable Metrics/BlockLength diff --git a/google/golang_utils.rb b/google/golang_utils.rb index 219c9d570210..830a7f06d242 100644 --- a/google/golang_utils.rb +++ b/google/golang_utils.rb @@ -24,11 +24,9 @@ module GolangUtils # quotes becomes a ruby string without quotes unless you explicitly set # quotes in the string like "\"foo\"" which is not a pattern we want to # see in our yaml config files. - def go_literal(value, go_package = nil) - if value.is_a?(String) + def go_literal(value) + if value.is_a?(String) || value.is_a?(Symbol) "\"#{value}\"" - elsif value.is_a?(Symbol) - "string(#{go_package}#{'.' unless go_package.nil?}#{value})" elsif value.is_a?(Numeric) value.to_s elsif value.is_a?(Array) && value.all? { |v| v.is_a?(String) || v.is_a?(Symbol) } diff --git a/overrides/validator.rb b/overrides/validator.rb index 40f494cd8ef0..58b3de4a4412 100644 --- a/overrides/validator.rb +++ b/overrides/validator.rb @@ -50,8 +50,6 @@ def verify_resource(res, overrides) field_symbol = field_name[1..-1].to_sym next if check_if_exists(res, field_symbol, overrides.class.attributes) - print overrides.class.attributes - print "\n" raise "#{field_name} does not exist on #{res.name}" end # Use instance_variable_get to get excluded properties diff --git a/products/azfrontdoor/api.yaml b/products/azfrontdoor/api.yaml deleted file mode 100644 index cdb1466227a9..000000000000 --- a/products/azfrontdoor/api.yaml +++ /dev/null @@ -1,195 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Front Door -prefix: azfrontdoor -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: FrontDoor - api_name: NotUsedInAzure - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Network - go_client_namespace: frontdoor - go_client: frontdoorClient - python_client_namespace: azure.mgmt.frontdoor - python_client: FrontDoorManagementClient.frontdoors - create: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: name - python_parameter_name: front_door_name - python_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: FrontDoor - python_parameter_name: front_door_parameters - python_variable_name: batch_account - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - python_field_name: location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: Properties - go_type_name: Properties - '/properties/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: FriendlyName - '/properties/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: EnabledState - go_enum_type_name: EnabledState - go_enum_const_prefix: EnabledState - '/properties/backendPoolsSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: BackendPoolsSettings - go_type_name: BackendPoolsSettings - '/properties/backendPoolsSettings/enforceCertificateNameCheck': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: EnforceCertificateNameCheck - go_enum_type_name: EnforceCertificateNameCheckEnabledState - go_enum_const_prefix: EnforceCertificateNameCheckEnabledState - '/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: friendly_name - '/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: enabled_state - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject - go_field_name: Tags - python_field_name: tags - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: name - python_parameter_name: front_door_name - python_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: FrontDoor - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - python_field_name: id - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - python_field_name: name - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - python_field_name: location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: Properties - go_type_name: Properties - '/properties/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [go] - go_field_name: FriendlyName - '/properties/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: EnabledState - go_enum_type_name: EnabledState - go_enum_const_prefix: EnabledState - '/properties/backendPoolsSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - applicable_to: [go] - go_field_name: BackendPoolsSettings - go_type_name: BackendPoolsSettings - '/properties/backendPoolsSettings/enforceCertificateNameCheck': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - applicable_to: [go] - go_field_name: EnforceCertificateNameCheck - go_enum_type_name: EnforceCertificateNameCheckEnabledState - go_enum_const_prefix: EnforceCertificateNameCheckEnabledState - '/friendlyName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: friendly_name - '/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - applicable_to: [python] - python_field_name: enabled_state - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringMapObject - go_field_name: Tags - python_field_name: tags - delete: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: name - python_parameter_name: front_door_name - python_variable_name: name - - description: Managed a Front Door on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: The name of the resource group in which to create the Batch Account. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - properties: - - !ruby/object:Api::Type::String - name: name - description: Name of the Front Door which is globally unique. - required: true - input: true - azure_sdk_references: ['frontDoorName', '/name'] - - !ruby/object:Api::Azure::Type::Location - name: location - description: Resource location. - required: true - input: true - azure_sdk_references: ['/location'] - - !ruby/object:Api::Azure::Type::Tags - name: tags - description: Resource tags. - azure_sdk_references: ['/tags'] - - !ruby/object:Api::Type::String - name: friendlyName - description: A friendly name for the frontDoor. - azure_sdk_references: ['/friendlyName', '/properties/friendlyName'] - - !ruby/object:Api::Type::Enum - name: enabledState - description: Operational status of the Front Door load balancer. - values: - - :Enabled - - :Disabled - default_value: :Enabled - azure_sdk_references: ['/enabledState', '/properties/enabledState'] - - !ruby/object:Api::Type::Enum - name: enforceCertificateNameCheck - description: Whether to enforce certificate name check on HTTPS requests to all backend pools. No effect on non-HTTPS requests. - values: - - :Enabled - - :Disabled - azure_sdk_references: ['/properties/backendPoolsSettings/enforceCertificateNameCheck'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: Resource ID. - output: true - azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoor/examples/terraform/basic.yaml b/products/azfrontdoor/examples/terraform/basic.yaml deleted file mode 100644 index 478160b90243..000000000000 --- a/products/azfrontdoor/examples/terraform/basic.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_frontdoor -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic -properties: - name: "<%= get_resource_name('frontDoors', 'frontdoor') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} \ No newline at end of file diff --git a/products/azfrontdoor/terraform.yaml b/products/azfrontdoor/terraform.yaml deleted file mode 100644 index 2e6183d62d14..000000000000 --- a/products/azfrontdoor/terraform.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azfrontdoor -overrides: !ruby/object:Provider::ResourceOverrides - FrontDoor: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: example-rg - frontDoors: example-frontdoor - location: West US \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/api.yaml b/products/azfrontdoorbackendpool/api.yaml deleted file mode 100644 index e8e287c83f1d..000000000000 --- a/products/azfrontdoorbackendpool/api.yaml +++ /dev/null @@ -1,232 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Front Door Backend Pool -prefix: azfrontdoorbackendpool -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: FrontDoorBackendPool - api_name: NotUsedInAzure - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Network - go_client_namespace: frontdoor - go_client: frontdoorBackendPoolsClient - python_client_namespace: azure.mgmt.frontdoor - python_client: FrontDoorManagementClient.backend_pools - create: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: backendPools - go_variable_name: name - python_parameter_name: backend_pool_name - python_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: BackendPool - python_parameter_name: backend_pool_parameters - python_variable_name: backend_pool - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: BackendPoolProperties - go_type_name: BackendPoolProperties - go_variable_name: properties - '/properties/backends': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArrayObject - go_field_name: Backends - go_type_name: Backend - '/properties/backends/address': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Address - '/properties/backends/backendHostHeader': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: BackendHostHeader - '/properties/backends/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: EnabledState - go_enum_type_name: BackendEnabledState - '/properties/backends/httpPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: HTTPPort - '/properties/backends/httpsPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: HTTPSPort - '/properties/backends/priority': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Priority - '/properties/backends/weight': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Weight - '/properties/healthProbeSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: HealthProbeSettings - go_type_name: SubResource - '/properties/healthProbeSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/properties/loadBalancingSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: LoadBalancingSettings - go_type_name: SubResource - '/properties/loadBalancingSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: backendPools - go_variable_name: name - python_parameter_name: backend_pool_name - python_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: BackendPool - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - python_field_name: id - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - python_field_name: name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: BackendPoolProperties - go_type_name: BackendPoolProperties - go_variable_name: properties - '/properties/backends': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexArrayObject - go_field_name: Backends - go_type_name: Backend - '/properties/backends/address': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Address - '/properties/backends/backendHostHeader': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: BackendHostHeader - '/properties/backends/enabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: EnabledState - go_enum_type_name: BackendEnabledState - '/properties/backends/httpPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: HTTPPort - '/properties/backends/httpsPort': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: HTTPSPort - '/properties/backends/priority': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Priority - '/properties/backends/weight': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Weight - '/properties/healthProbeSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: HealthProbeSettings - go_type_name: SubResource - '/properties/healthProbeSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/properties/loadBalancingSettings': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: LoadBalancingSettings - go_type_name: SubResource - '/properties/loadBalancingSettings/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - delete: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'backendPoolName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: backendPools - go_variable_name: name - python_parameter_name: backend_pool_name - python_variable_name: name - - description: Managed a Front Door Backend Pool on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: Name of the Resource group within the Azure subscription. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: frontdoorName - description: Name of the Front Door which is globally unique. - required: true - input: true - order: 700 - azure_sdk_references: ['frontDoorName'] - properties: - - !ruby/object:Api::Type::String - name: name - description: Name of the Backend Pool which is unique within the Front Door. - required: true - input: true - azure_sdk_references: ['backendPoolName', '/name'] - - !ruby/object:Api::Type::String - name: healthProbeSettingsId - description: L7 health probe settings for a backend pool. - azure_sdk_references: ['/properties/healthProbeSettings/id'] - - !ruby/object:Api::Type::String - name: loadBalancingSettingsId - description: Load balancing settings for a backend pool. - azure_sdk_references: ['/properties/loadBalancingSettings/id'] - - !ruby/object:Api::Type::Array - name: backends - description: The set of backends for this pool. - azure_sdk_references: ['/properties/backends'] - item_type: !ruby/object:Api::Type::NestedObject - properties: - - !ruby/object:Api::Type::String - name: address - description: Location of the backend (IP address or FQDN) - azure_sdk_references: ['/properties/backends/address'] - - !ruby/object:Api::Type::Integer - name: httpPort - description: The HTTP TCP port number. Must be between 1 and 65535. - azure_sdk_references: ['/properties/backends/httpPort'] - - !ruby/object:Api::Type::Integer - name: httpsPort - description: The HTTPS TCP port number. Must be between 1 and 65535. - azure_sdk_references: ['/properties/backends/httpsPort'] - - !ruby/object:Api::Type::String - name: hostHeader - description: The value to use as the host header sent to the backend. If blank or unspecified, this defaults to the incoming host. - azure_sdk_references: ['/properties/backends/backendHostHeader'] - - !ruby/object:Api::Type::Enum - name: enabledState - description: Whether to enable use of this backend. Permitted values are 'Enabled' or 'Disabled'. - values: - - :Enabled - - :Disabled - default_value: :Enabled - azure_sdk_references: ['/properties/backends/enabledState'] - - !ruby/object:Api::Type::Integer - name: priority - description: Priority to use for load balancing. Higher priorities will not be used for load balancing if any lower priority backend is healthy. - azure_sdk_references: ['/properties/backends/priority'] - - !ruby/object:Api::Type::Integer - name: weight - description: Weight of this endpoint for load balancing purposes. - azure_sdk_references: ['/properties/backends/weight'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: Resource ID. - output: true - azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/examples/terraform/basic.yaml b/products/azfrontdoorbackendpool/examples/terraform/basic.yaml deleted file mode 100644 index 654782370d08..000000000000 --- a/products/azfrontdoorbackendpool/examples/terraform/basic.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_frontdoor_backendpool -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azfrontdoor - example: basic -properties: - name: "<%= get_resource_name('backendPools', 'backendpool') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - frontdoor_name: ${azurerm_frontdoor.<%= resource_id_hint -%>.name} - backend: - - http_port: 88 - https_port: 44 - - http_port: 33 - https_port: 22 \ No newline at end of file diff --git a/products/azfrontdoorbackendpool/terraform.yaml b/products/azfrontdoorbackendpool/terraform.yaml deleted file mode 100644 index ae09d7c20d31..000000000000 --- a/products/azfrontdoorbackendpool/terraform.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azfrontdoorbackendpool -overrides: !ruby/object:Provider::ResourceOverrides - FrontDoorBackendPool: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: example-rg - frontDoors: example-frontdoor - backendPools: example-backend-pool - location: West US \ No newline at end of file diff --git a/products/azfrontdoorfrontendpoint/api.yaml b/products/azfrontdoorfrontendpoint/api.yaml deleted file mode 100644 index 4874ea71940b..000000000000 --- a/products/azfrontdoorfrontendpoint/api.yaml +++ /dev/null @@ -1,174 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Front Door Frontend Endpoint -prefix: azfrontdoorfrontendpoint -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: FrontDoorFrontendEndpoint - api_name: NotUsedInAzure - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Network - go_client_namespace: frontdoor - go_client: frontdoorFrontendEndpointsClient - python_client_namespace: azure.mgmt.frontdoor - python_client: FrontDoorManagementClient.frontend_endpoints - create: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontendEndpoints - go_variable_name: name - python_parameter_name: frontend_endpoint_name - python_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: FrontendEndpoint - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: FrontendEndpointProperties - go_type_name: FrontendEndpointProperties - go_variable_name: properties - '/properties/hostName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: HostName - '/properties/sessionAffinityEnabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: SessionAffinityEnabledState - go_enum_type_name: SessionAffinityEnabledState - go_enum_const_prefix: SessionAffinityEnabledState - '/properties/sessionAffinityTtlSeconds': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: SessionAffinityTTLSeconds - '/properties/webApplicationFirewallPolicyLink': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: WebApplicationFirewallPolicyLink - go_type_name: FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink - '/properties/webApplicationFirewallPolicyLink/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontendEndpoints - go_variable_name: name - python_parameter_name: frontend_endpoint_name - python_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: FrontendEndpoint - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - python_field_name: id - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - python_field_name: name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: FrontendEndpointProperties - go_type_name: FrontendEndpointProperties - go_variable_name: properties - '/properties/hostName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: HostName - '/properties/sessionAffinityEnabledState': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: SessionAffinityEnabledState - go_enum_type_name: SessionAffinityEnabledState - go_enum_const_prefix: SessionAffinityEnabledState - '/properties/sessionAffinityTtlSeconds': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: SessionAffinityTTLSeconds - '/properties/webApplicationFirewallPolicyLink': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: WebApplicationFirewallPolicyLink - go_type_name: FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink - '/properties/webApplicationFirewallPolicyLink/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - delete: !ruby/object:Api::Azure::SDKOperationDefinition - async: true - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'frontDoorName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontDoors - go_variable_name: frontDoor - python_parameter_name: front_door_name - python_variable_name: front_door_name - 'frontendEndpointName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: frontendEndpoints - go_variable_name: name - python_parameter_name: frontend_endpoint_name - python_variable_name: name - - description: Managed a Front Door Frontend Endpoint on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: Name of the Resource group within the Azure subscription. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: frontdoorName - description: Name of the Front Door which is globally unique. - required: true - input: true - order: 700 - azure_sdk_references: ['frontDoorName'] - properties: - - !ruby/object:Api::Type::String - name: name - description: Name of the Frontend endpoint which is unique within the Front Door. - required: true - input: true - azure_sdk_references: ['frontendEndpointName', '/name'] - - !ruby/object:Api::Type::String - name: hostName - description: The host name of the frontendEndpoint. Must be a domain name. - azure_sdk_references: ['/properties/hostName'] - - !ruby/object:Api::Type::Enum - name: sessionAffinityEnabledState - description: Whether to allow session affinity on this host. Valid options are 'Enabled' or 'Disabled' - values: - - :Enabled - - :Disabled - default_value: :Enabled - azure_sdk_references: ['/properties/sessionAffinityEnabledState'] - - !ruby/object:Api::Type::Integer - name: sessionAffinityTtlSeconds - description: UNUSED. This field will be ignored. The TTL to use in seconds for session affinity, if applicable. - azure_sdk_references: ['/properties/sessionAffinityTtlSeconds'] - - !ruby/object:Api::Type::String - name: webApplicationFirewallPolicyId - description: Defines the Web Application Firewall policy for each host (if applicable). - azure_sdk_references: ['/properties/webApplicationFirewallPolicyLink/id'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: Resource ID. - output: true - azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azfrontdoorfrontendpoint/terraform.yaml b/products/azfrontdoorfrontendpoint/terraform.yaml deleted file mode 100644 index da527bef6bd6..000000000000 --- a/products/azfrontdoorfrontendpoint/terraform.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azfrontdoorfrontendpoint -overrides: !ruby/object:Provider::ResourceOverrides - FrontDoorFrontendEndpoint: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings diff --git a/products/azstorageaccount/examples/ansible/basic.yaml b/products/azstorageaccount/examples/ansible/basic.yaml deleted file mode 100644 index 14da90797a53..000000000000 --- a/products/azstorageaccount/examples/ansible/basic.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azure_rm_storageaccount -description: Create Storage Account -properties: - resourceGroup: "<%= get_resource_name('resourceGroups', 'resource_group') -%>" - name: "<%= get_resource_name('storageAccounts', 'storage_account_name', 'st') -%>" - location: eastus - accountType: Standard_LRS \ No newline at end of file diff --git a/products/azstorageaccount/examples/terraform/basic.yaml b/products/azstorageaccount/examples/terraform/basic.yaml deleted file mode 100644 index e067ed81cd1b..000000000000 --- a/products/azstorageaccount/examples/terraform/basic.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_storage_account -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic -properties: - name: "<%= get_resource_name('storageAccounts', 'sa') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} - accountTier: Standard - accountReplicationType: LRS \ No newline at end of file diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 8f5b270f2098..01ca98640a33 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -3,6 +3,10 @@ module Azure module Terraform module SubTemplate + def azure_compile_template(template, data) + indent template, data[:indentation] || 0 + end + def build_azure_id_parser(sdk_op_def, object, indentation = 4) compile_template 'templates/azure/terraform/sdk/azure_id_parser.erb', indentation: indentation, @@ -30,14 +34,14 @@ def build_azure_schema_property(property, object, indentation = 0, data_source_i # Transforms a Cloud API representation of a property into a Terraform # schema representation. - def build_flatten_method(ef_desc) + def build_azure_flatten_method(ef_desc) compile_template 'templates/azure/terraform/flatten_property_method.erb', descriptor: ef_desc end # Transforms a Terraform schema representation of a property into a # representation used by the Cloud API. - def build_expand_method(ef_desc) + def build_azure_expand_method(ef_desc) compile_template 'templates/azure/terraform/expand_property_method.erb', descriptor: ef_desc end diff --git a/provider/terraform.rb b/provider/terraform.rb index 1b3f42f0525a..271b1a3fde97 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -21,6 +21,7 @@ require 'overrides/terraform/property_override' require 'provider/terraform/sub_template' require 'google/golang_utils' +require 'azure/golang_utils' require 'provider/azure/terraform_extension' module Provider @@ -30,6 +31,7 @@ class Terraform < Provider::AbstractCore include Provider::Terraform::Import include Provider::Terraform::SubTemplate include Google::GolangUtils + include ::Azure::GolangUtils include Provider::Azure::TerraformExtension # FileTemplate with Terraform specific fields diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index 150069daf9e0..c0ab60a3eeec 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -29,16 +29,31 @@ def build_subresource_schema(property, object) object: object end + # Transforms a Cloud API representation of a property into a Terraform + # schema representation. + def build_flatten_method(prefix, property) + compile_template 'templates/terraform/flatten_property_method.erb', + prefix: prefix, + property: property + end + + # Transforms a Terraform schema representation of a property into a + # representation used by the Cloud API. + def build_expand_method(prefix, property) + compile_template 'templates/terraform/expand_property_method.erb', + prefix: prefix, + property: property + end + def build_expand_resource_ref(var_name, property) compile_template 'templates/terraform/expand_resource_ref.erb', var_name: var_name, property: property end - def build_property_documentation(property, is_data_source = false) + def build_property_documentation(property) compile_template 'templates/terraform/property_documentation.erb', - property: property, - is_data_source: is_data_source + property: property end def build_nested_property_documentation(property) @@ -51,6 +66,7 @@ def build_nested_property_documentation(property) private def autogen_notice_contrib + # TODO: Azure Switch ['Please read more about how to change this file at', 'https://github.com/Azure/magic-module-specs'] end @@ -62,8 +78,7 @@ def autogen_notice_text(line) def compile_template(template_file, data) ctx = binding data.each { |name, value| ctx.local_variable_set(name, value) } - result = compile_file(ctx, template_file).join("\n") - indent result, data[:indentation] || 0 + azure_compile_template(compile_file(ctx, template_file).join("\n"), data) end end end diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 9efe4345d7b8..398f7851c96e 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -34,7 +34,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in <% property.value_type.nested_properties.each do |prop| -%> <% next if prop.name == property.key_name -%> -<%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> +<%# lines(build_azure_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { @@ -91,7 +91,7 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go } <% nested_properties.each do |prop| -%> -<%# lines(build_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> +<%# lines(build_azure_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%> l := v.([]interface{}) diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index 2da7734089bb..17fafc7c3852 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -98,7 +98,7 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= } <% if !property.nested_properties.empty? -%> <% property.nested_properties.each do |prop| -%> - <%# lines(build_flatten_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> + <%# lines(build_azure_flatten_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% end -%> <% else -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 5d026b8542d1..597a77d1d253 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -264,13 +264,13 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% while !expand_queue.empty? -%> <% descriptor = expand_queue.shift -%> -<%= lines(build_expand_method(descriptor)) -%> +<%= lines(build_azure_expand_method(descriptor)) -%> <% end -%> <% while !flatten_queue.empty? -%> <% descriptor = flatten_queue.shift -%> -<%= lines(build_flatten_method(descriptor)) -%> +<%= lines(build_azure_flatten_method(descriptor)) -%> <% end -%> diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 7a3b249e2c69..924dbbe3110b 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -45,7 +45,7 @@ -%> ValidateFunc: validation.StringInSlice([]string{ <% enum_values.each do |val| -%> - <%= go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, + <%= azure_go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, <% end -%> }, false), <% end -%> @@ -129,14 +129,14 @@ <% end -%> <% unless property.default_value.nil? || !data_source_input.empty? -%> <% if property.is_a?(Api::Type::Enum) -%> - Default: <%= go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, + Default: <%= azure_go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, <% else -%> - Default: <%= go_literal(property.default_value) -%>, + Default: <%= azure_go_literal(property.default_value) -%>, <% end -%> <% end -%> <% unless property.conflicting().empty? -%> <% conflicting_props = property.conflicting().map(&:name).map(&:underscore) -%> - ConflictsWith: <%= go_literal(conflicting_props) -%>, + ConflictsWith: <%= azure_go_literal(conflicting_props) -%>, <% end -%> }, <% else -%> diff --git a/templates/terraform/examples/container_registry.tf.erb b/templates/terraform/examples/container_registry.tf.erb deleted file mode 100644 index 567b0d238e56..000000000000 --- a/templates/terraform/examples/container_registry.tf.erb +++ /dev/null @@ -1,21 +0,0 @@ -resource "azurerm_resource_group" "example" { - name = "<%= ctx[:vars]["rg_name"] %>" - location = "West US" -} - -resource "azurerm_storage_account" "example" { - name = "tfexamplesa" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - account_tier = "Standard" - account_replication_type = "GRS" -} - -resource "azurerm_container_registry" "example" { - name = "tf-example-acr" - resource_group_name = "${azurerm_resource_group.example.name}" - location = "${azurerm_resource_group.example.location}" - admin_enabled = true - sku = "Classic" - storage_account_id = "${azurerm_storage_account.example.id}" -} \ No newline at end of file diff --git a/templates/terraform/examples/resource_group.tf.erb b/templates/terraform/examples/resource_group.tf.erb deleted file mode 100644 index 9b07d98a78a1..000000000000 --- a/templates/terraform/examples/resource_group.tf.erb +++ /dev/null @@ -1,8 +0,0 @@ -resource "azurerm_resource_group" "<%= ctx[:primary_resource_id] %>" { - name = "<%= ctx[:vars]["rg_name"] %>" - location = "West US" - - tags { - environment = "Production" - } -} \ No newline at end of file diff --git a/templates/terraform/nested_property_documentation.erb b/templates/terraform/nested_property_documentation.erb index 6306eaf23fef..fee1bb16d3bb 100644 --- a/templates/terraform/nested_property_documentation.erb +++ b/templates/terraform/nested_property_documentation.erb @@ -1,3 +1,4 @@ + <% if property.nested_properties? && (property.flatten_object.nil? || !property.flatten_object) -%> From 369d74fef8a1e3aa0412fb45b94df8967232f6d0 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 25 Jun 2019 18:06:36 -0700 Subject: [PATCH 111/175] Add new DateTime and Duration types --- api/azure/sdk_definition.rb | 1 + api/azure/sdk_type_definition.rb | 6 ++++++ api/azure/type.rb | 6 ++++++ provider/azure/ansible/module_extension.rb | 4 ++-- .../azure/ansible/sdktypes/property_to_sdkobject.erb | 10 +++++++--- templates/azure/terraform/resource.erb | 4 ++-- templates/azure/terraform/test_file.go.erb | 2 +- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index bf0f8810ec72..943d7fff816c 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -13,6 +13,7 @@ class SDKDefinition < Api::Object attr_reader :read attr_reader :update attr_reader :delete + attr_reader :list_by_parent attr_reader :list_by_resource_group attr_reader :list_by_subscription diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index ae3c9e157fe5..149ed35a7b7c 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -65,6 +65,12 @@ def validate end end + class ISO8601DurationObject < StringObject + end + + class ISO8601DateTimeObject < SDKTypeDefinition + end + class ComplexObject < SDKTypeDefinition end diff --git a/api/azure/type.rb b/api/azure/type.rb index f39dbc7e6bd3..8e7c385d42b1 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -34,6 +34,12 @@ def validate end end + class ISO8601Duration < Api::Type::String + end + + class ISO8601DateTime < Api::Type::String + end + end end end diff --git a/provider/azure/ansible/module_extension.rb b/provider/azure/ansible/module_extension.rb index 944a0b06065b..49089c3f9e7f 100644 --- a/provider/azure/ansible/module_extension.rb +++ b/provider/azure/ansible/module_extension.rb @@ -27,12 +27,12 @@ def azure_python_dict_for_property(prop, object, spaces = 0) # Creates a Python dictionary representing a nested object property # for validation. def azure_nested_obj_dict(prop, object, properties, spaces) - name = python_variable_name(prop, object.azure_sdk_definition.create) + name = azure_python_variable_name(prop, object.azure_sdk_definition.create) options = azure_prop_options(prop, object, spaces).join("\n") [ "#{name}=dict(\n#{indent_list(options, 4, true)}\n options=dict(", indent_list(properties.map do |p| - python_dict_for_property(p, object, spaces + 4) + azure_python_dict_for_property(p, object, spaces + 4) end, 8), " )\n)" ] diff --git a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb index 3f912824d855..eace8048a8a2 100644 --- a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb @@ -13,7 +13,7 @@ need_normalize = true if is_location? prop need_normalize = true if prop.is_a? Api::Type::Enum end - next unless need_normalize || prop.is_a?(Api::Type::Composite) + # next unless need_normalize || prop.is_a?(Api::Type::Composite) if need_normalize indent = 4 @@ -33,8 +33,12 @@ if <%= sdk_marshal.input -%>.get('<%= var -%>') is not None: if prop.is_a? Api::Type::NestedObject child_sdk_path = sdk_marshal.parent_reference + relative_refs.join('/') + '/' - child_sdk_marshal = Provider::Azure::Ansible::SDK::MarshalDescriptor.new prop.properties, sdk_marshal.operation, 'input', '|', child_sdk_path - build_property_to_sdk_object child_sdk_marshal + new_input = "#{sdk_marshal.input}['#{var}']" + new_output = "#{sdk_marshal.output}['#{var}']" + child_sdk_marshal = Provider::Azure::Ansible::SDK::MarshalDescriptor.new prop.properties, sdk_marshal.operation, new_input, new_output, child_sdk_path +-%> +<%= lines(build_property_to_sdk_object(child_sdk_marshal)) -%> +<% end end -%> \ No newline at end of file diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 597a77d1d253..6cd8d9549a75 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -176,7 +176,7 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) return <%= lines(build_errorf_with_resource_name("Error reading %s", true, object.azure_sdk_definition.read, output_properties, object)) -%> } -<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.post_read -%> +<%= lines(compile_template(object.custom_code.post_read, indentation: 4)) if object.custom_code.respond_to?(:post_read) && object.custom_code.post_read -%> <%= lines(build_sdk_object_to_property('resp', 'd', sdk_marshal)) -%> @@ -274,6 +274,6 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{ <% end -%> -<% if object.custom_code.extra_functions -%> +<% if object.custom_code.respond_to?(:extra_functions) && object.custom_code.extra_functions -%> <%= lines(compile(get_custom_template_path(object.custom_code.extra_functions))) -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index ba9dc29b1ea3..b381e38b4d55 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -16,7 +16,7 @@ import ( terraform_name = "azurerm_" + object.name.underscore azure_client_name = object.azure_sdk_definition.go_client properties = object.all_user_properties - contains_acctests = object.instance_variable_defined?(:@acctests) + contains_acctests = object.respond_to?(:acctests) && !object.acctests.nil? && !object.acctests.empty? -%> <% From 62c7ebb5f57160c44730c5e4ff0ff82b748507be Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 27 Jun 2019 14:06:55 -0700 Subject: [PATCH 112/175] Adjust resource group schema to match the latest Terraform code style --- api/azure/sdk_type_definition.rb | 3 +++ templates/azure/terraform/schemas/resource_group_name.erb | 2 +- templates/azure/terraform/sdk/function_invocation.erb | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 149ed35a7b7c..9a174c230c76 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -9,6 +9,7 @@ class SDKTypeDefinition < Api::Object attr_reader :go_variable_name attr_reader :go_field_name attr_reader :go_type_name + attr_reader :is_pointer_type attr_reader :python_parameter_name attr_reader :python_variable_name attr_reader :python_field_name @@ -21,6 +22,7 @@ def validate check :go_variable_name, type: ::String check :go_field_name, type: ::String check :go_type_name, type: ::String + check :is_pointer_type, type: :boolean, default: false check :python_parameter_name, type: ::String check :python_variable_name, type: ::String check :python_field_name, type: ::String @@ -31,6 +33,7 @@ def merge_overrides!(overrides) @empty_value_sensitive = overrides.empty_value_sensitive unless overrides.empty_value_sensitive.nil? @go_variable_name = overrides.go_variable_name unless overrides.go_variable_name.nil? @go_field_name = overrides.go_field_name unless overrides.go_field_name.nil? + @is_pointer_type = overrides.is_pointer_type unless overrides.is_pointer_type.nil? @python_parameter_name = overrides.python_parameter_name unless overrides.python_parameter_name.nil? @python_variable_name = overrides.python_variable_name unless overrides.python_variable_name.nil? @python_field_name = overrides.python_field_name unless overrides.python_field_name.nil? diff --git a/templates/azure/terraform/schemas/resource_group_name.erb b/templates/azure/terraform/schemas/resource_group_name.erb index 5dfd1ace2f71..56d8341c09f0 100644 --- a/templates/azure/terraform/schemas/resource_group_name.erb +++ b/templates/azure/terraform/schemas/resource_group_name.erb @@ -1 +1 @@ -"<%= prop_name -%>": resourceGroupNameSchema(), \ No newline at end of file +"<%= prop_name -%>": azure.SchemaResourceGroupNameDiffSuppress(), \ No newline at end of file diff --git a/templates/azure/terraform/sdk/function_invocation.erb b/templates/azure/terraform/sdk/function_invocation.erb index b55101485c4a..9c32466c85f8 100644 --- a/templates/azure/terraform/sdk/function_invocation.erb +++ b/templates/azure/terraform/sdk/function_invocation.erb @@ -1,3 +1,3 @@ <% params = sdk_op_def.request.reject {|k, v| k.start_with?("/") && k != "/"} -%> -<% param_vars = params.values.map{|v| v.go_variable_name} -%> +<% param_vars = params.values.map{|v| (v.is_pointer_type ? '&' : '') + v.go_variable_name} -%> client.<%= sdk_op_def.go_func_name -%>(ctx, <%= param_vars.join(", ") -%>) \ No newline at end of file From 5ce761880f405aa33ad504c484d9f25607ee9ba4 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 27 Jun 2019 15:13:37 -0700 Subject: [PATCH 113/175] Temparary disable go format and python format. --- provider/core.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/provider/core.rb b/provider/core.rb index 73c234682a23..a48857194db0 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -106,7 +106,8 @@ def generate(template, path, provider) old_file_chmod_mode = File.stat(template).mode FileUtils.chmod(old_file_chmod_mode, path) - format_output_file(path) + # TODO: Azure Switch + # format_output_file(path) end private From 4cf6703275242d1bd4c1a5d1d4dc70fcc3adee9a Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 28 Jun 2019 15:43:07 -0700 Subject: [PATCH 114/175] Add complete support for Ansible SDK marshal. --- provider/azure/ansible/sdk/helpers.rb | 40 +++++++++++++ .../sdk/property_normalize_descriptor.rb | 34 ----------- .../ansible/sdk/sdk_marshal_descriptor.rb | 15 ++++- provider/azure/ansible/sdk/sub_template.rb | 12 ++-- provider/azure/ansible_extension.rb | 1 - .../sdktypes/location_property_normalize.erb | 3 + .../sdktypes/property_normalization.erb | 41 ------------- .../ansible/sdktypes/property_normalize.erb | 39 +++++++++++++ .../sdktypes/property_to_sdkobject.erb | 58 ++++++++----------- .../ansible/sdktypes/reference_assignment.erb | 19 ++++++ .../azure/ansible/sdktypes/unsupported.erb | 1 + 11 files changed, 149 insertions(+), 114 deletions(-) delete mode 100644 provider/azure/ansible/sdk/property_normalize_descriptor.rb create mode 100644 templates/azure/ansible/sdktypes/location_property_normalize.erb delete mode 100644 templates/azure/ansible/sdktypes/property_normalization.erb create mode 100644 templates/azure/ansible/sdktypes/property_normalize.erb create mode 100644 templates/azure/ansible/sdktypes/reference_assignment.erb create mode 100644 templates/azure/ansible/sdktypes/unsupported.erb diff --git a/provider/azure/ansible/sdk/helpers.rb b/provider/azure/ansible/sdk/helpers.rb index 4bc0dbe35370..9637dc50d97c 100644 --- a/provider/azure/ansible/sdk/helpers.rb +++ b/provider/azure/ansible/sdk/helpers.rb @@ -2,7 +2,14 @@ module Provider module Azure module Ansible module SDK + module Helpers + def get_parent_reference(reference) + parent = reference[0..reference.rindex('/')] + return parent if parent == '/' + parent.chomp '/' + end + def get_properties_matching_sdk_reference(sdk_reference, object) object.all_user_properties .select{|p| p.azure_sdk_references.include?(sdk_reference)} @@ -21,7 +28,40 @@ def get_sdk_typedef_by_references(references, typedefs) return nil if ref.nil? typedefs[ref] end + + def self_require_type_marshal?(property, sdk_marshal) + return true if is_location? property + + sdk_ref = get_applicable_reference(property.azure_sdk_references, sdk_marshal.operation.request) + return false if !sdk_ref.start_with?('/') + + return true if property.is_a? Api::Type::Enum + return true if property.is_a? Api::Azure::Type::ResourceReference + + var_name = azure_python_variable_name(property, sdk_marshal.operation) + sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_marshal.operation.request) + return true if var_name != sdk_type.python_field_name + false + end + + def descendants_require_type_marshal?(property, sdk_marshal) + return property.nested_properties.any?{|p| require_type_marshal?(p, sdk_marshal)} if property.nested_properties? + false + end + + def require_type_marshal?(property, sdk_marshal) + self_require_type_marshal?(property, sdk_marshal) || descendants_require_type_marshal?(property, sdk_marshal) + end + + def property_normalization_template(property) + return get_custom_template_path(property.custom_normalize) if property.custom_normalize + return 'templates/azure/ansible/sdktypes/location_property_normalize.erb' if is_location? property + return 'templates/azure/ansible/sdktypes/property_normalize.erb' if property.is_a? Api::Type::Enum + return 'templates/azure/ansible/sdktypes/property_normalize.erb' if property.is_a? Api::Azure::Type::ResourceReference + 'templates/azure/ansible/sdktypes/unsupported.erb' + end end + end end end diff --git a/provider/azure/ansible/sdk/property_normalize_descriptor.rb b/provider/azure/ansible/sdk/property_normalize_descriptor.rb deleted file mode 100644 index 2fbe7296b205..000000000000 --- a/provider/azure/ansible/sdk/property_normalize_descriptor.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Provider - module Azure - module Ansible - module SDK - class PropertyNormalizeDescriptor - attr_reader :property - attr_reader :input - attr_reader :output - attr_reader :remove_from_input - attr_reader :python_variable - attr_reader :parent_reference - attr_reader :relative_references - attr_reader :sdk_operation - - def initialize(property, input, output, python_var, parent_ref, relative_refs, sdk_op, remove_input = false) - @property = property - @input = input - @output = output - @python_variable = python_var - @parent_reference = parent_ref - @relative_references = relative_refs - @sdk_operation = sdk_op - @remove_from_input = remove_input - end - - def create_child() - PropertyNormalizeDescriptor.new @property, @input, '|', @python_variable, @parent_reference + @relative_references[0] + '/', @relative_references[1..-1], @sdk_operation, true - end - end - end - end - end - end - \ No newline at end of file diff --git a/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb index 77b4117c9d41..de946f3cb7ce 100644 --- a/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb +++ b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb @@ -2,21 +2,34 @@ module Provider module Azure module Ansible module SDK + class MarshalDescriptor attr_reader :properties attr_reader :operation attr_reader :parent_reference + attr_reader :marshalled_references attr_reader :input attr_reader :output - def initialize(properties, sdk_operation, input, output, parent_sdk_reference = '/') + def initialize(properties, sdk_operation, input, output, parent_sdk_reference = '/', marshalled = nil) @properties = properties @operation = sdk_operation @input = input @output = output @parent_reference = parent_sdk_reference + @marshalled_references = marshalled || { '/' => @output } + end + + def add_marshalled_reference(reference, expression) + @marshalled_references[reference] = expression + end + + def create_child_descriptor(property, sdk_reference, sdk_type) + input_expression = "#{@input}['#{sdk_type.python_field_name}']" + MarshalDescriptor.new property.nested_properties, @operation, input_expression, @output, sdk_reference, @marshalled_references end end + end end end diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index eaf34f2baf2c..49bd02f848cd 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -2,16 +2,19 @@ module Provider module Azure module Ansible module SDK + module SubTemplate def build_sdk_method_invocation(sdk_client, sdk_op_def, indentation = 12) result = compile 'templates/azure/ansible/sdk/method_invocation.erb', 1 indent result, indentation end - def build_property_normalization(norm_desc, in_structure, indentation = 4) - template = get_custom_template_path(norm_desc.property.custom_normalize) - template ||= 'templates/azure/ansible/sdktypes/property_normalization.erb' - result = compile template, 1 + def build_property_normalization(property, sdk_marshal) + result = compile property_normalization_template(property), 1 + end + + def build_sdk_reference_assignment(input_expression, reference, sdk_marshal, indentation = 0) + result = compile 'templates/azure/ansible/sdktypes/reference_assignment.erb', 1 indent result, indentation end @@ -27,6 +30,7 @@ def build_property_inline_response_format(property, sdk_operation, indentation = indent result, indentation end end + end end end diff --git a/provider/azure/ansible_extension.rb b/provider/azure/ansible_extension.rb index 54162d4f56a6..2248d2faa091 100644 --- a/provider/azure/ansible_extension.rb +++ b/provider/azure/ansible_extension.rb @@ -2,7 +2,6 @@ require 'provider/azure/ansible/helpers' require 'provider/azure/ansible/sub_template' require 'provider/azure/ansible/sdk/sdk_marshal_descriptor' -require 'provider/azure/ansible/sdk/property_normalize_descriptor' require 'provider/azure/ansible/sdk/helpers' require 'provider/azure/ansible/module/sub_template' require 'provider/azure/ansible/sdk/sub_template' diff --git a/templates/azure/ansible/sdktypes/location_property_normalize.erb b/templates/azure/ansible/sdktypes/location_property_normalize.erb new file mode 100644 index 000000000000..4cadd94a9639 --- /dev/null +++ b/templates/azure/ansible/sdktypes/location_property_normalize.erb @@ -0,0 +1,3 @@ +resource_group = self.get_resource_group(self.resource_group) +if <%= sdk_marshal.input -%>.get('location') is None: + <%= sdk_marshal.output -%>['location'] = resource_group.location \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/property_normalization.erb b/templates/azure/ansible/sdktypes/property_normalization.erb deleted file mode 100644 index a43bba232fcc..000000000000 --- a/templates/azure/ansible/sdktypes/property_normalization.erb +++ /dev/null @@ -1,41 +0,0 @@ -<% - if is_location? norm_desc.property --%> -<%= norm_desc.input -%>['<%= norm_desc.python_variable -%>'] = resource_group.location -<% - elsif norm_desc.relative_references.length > 1 --%> -<% sdk_path = norm_desc.parent_reference + norm_desc.relative_references[0] -%> -<% sdk_type = norm_desc.sdk_operation.request[sdk_path] -%> -<% if in_structure -%> -'<%= sdk_type.python_field_name -%>': { -<%= lines(build_property_normalization(norm_desc.create_child(), true)) -%> -} -<% else -%> -<%= norm_desc.output -%>['<%= sdk_type.python_field_name -%>'] = { -<%= lines(build_property_normalization(norm_desc.create_child(), true)) -%> -} -<% end -%> -<% - elsif norm_desc.relative_references.length == 1 --%> -<% sdk_path = norm_desc.parent_reference + norm_desc.relative_references[0] -%> -<% sdk_type = norm_desc.sdk_operation.request[sdk_path] -%> -<% if norm_desc.remove_from_input || norm_desc.python_variable != sdk_type.python_field_name -%> -<% actual_input = "#{norm_desc.input}.pop('#{norm_desc.python_variable}')" -%> -<% else -%> -<% actual_input = "#{norm_desc.input}['#{norm_desc.python_variable}']" -%> -<% end -%> -<% if norm_desc.property.is_a? Api::Type::Enum -%> -<% actual_input = "_snake_to_camel(#{actual_input}, True)" -%> -<% elsif norm_desc.property.is_a? Api::Azure::Type::ResourceReference -%> -<% actual_input = "self.normalize_resource_id(\n #{actual_input},\n '#{norm_desc.property.sample_value}')" -%> -<% end -%> -<% if in_structure -%> -'<%= sdk_type.python_field_name -%>': <%= actual_input -%> -<% else -%> -<%= norm_desc.output -%>['<%= sdk_type.python_field_name -%>'] = <%= actual_input -%> -<% end -%> -<% - end --%> \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/property_normalize.erb b/templates/azure/ansible/sdktypes/property_normalize.erb new file mode 100644 index 000000000000..c453c1734b54 --- /dev/null +++ b/templates/azure/ansible/sdktypes/property_normalize.erb @@ -0,0 +1,39 @@ +<% + must_have_value = property.required || !property.default_value.nil? + indentation = (must_have_value ? 0 : 4) + + reference = get_applicable_reference(property.azure_sdk_references, sdk_marshal.operation.request) + var_name = azure_python_variable_name(property, sdk_marshal.operation) +-%> +<% if !must_have_value -%> +if <%= sdk_marshal.input -%>.get('<%= var_name -%>') is not None: +<% end -%> +<% + print reference + ":\n " + print sdk_marshal.parent_reference + "\n " + + + need_remove = false + if reference.start_with?(sdk_marshal.parent_reference) + relative_references = reference[sdk_marshal.parent_reference.length..-1].split('/').reject(&:empty?) +print relative_references +print "\n" + need_remove = true if relative_references.length != 1 + sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_marshal.operation.request) + need_remove = true if relative_references.length == 1 && sdk_type.python_field_name != var_name + else + need_remove = true + end + input_expression = "#{sdk_marshal.input}#{need_remove ? '.pop(' : '['}'#{var_name}'#{need_remove ? ')' : ']'}" +-%> +<% + normalize_format = '%s' + if property.is_a? Api::Type::Enum + normalize_format = '_snake_to_camel(%s, True)' + elsif property.is_a? Api::Azure::Type::ResourceReference + normalize_format = "self.normalize_resource_id(\n %s,\n '#{property.sample_value}')" + else + normalize_format = '# TODO: Not implemented template for %s' + end +-%> +<%= lines(build_sdk_reference_assignment(normalize_format % input_expression, reference, sdk_marshal, indentation)) -%> \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb index eace8048a8a2..e05cddb7f545 100644 --- a/templates/azure/ansible/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/ansible/sdktypes/property_to_sdkobject.erb @@ -1,44 +1,36 @@ <% - sdk_marshal.properties.each do |prop| - ref = get_applicable_reference(prop.azure_sdk_references, sdk_marshal.operation.request) - next unless ref.start_with?(sdk_marshal.parent_reference) - relative_refs = ref[sdk_marshal.parent_reference.length..-1].split('/') - next if relative_refs.length == 0 + # We support the following different SDK marshalling types (property path -> sdk path): + # 1. x -> x (e.g. enum, or "a" in case 5 - 7) + # 2. x -> a (e.g. property rename) + # 3. x/y -> a (e.g. property restructure, we handle x using its own definition) + # 4. x -> a/b (e.g. property restructure) + # 5. a/x -> a/b (actually equivalent to case 2 after we handled "a") + # 6. a/x/y -> a/b (actually equivalent to case 3 after we handled "a") + # 7. a/x -> a/b/c (actually equivalent to case 4 after we handled "a") - var = azure_python_variable_name(prop, sdk_marshal.operation) - sdk_type = sdk_marshal.operation.request[ref] - need_normalize = (relative_refs.length > 1) - if relative_refs.length == 1 - need_normalize = true if sdk_type.python_field_name != var - need_normalize = true if is_location? prop - need_normalize = true if prop.is_a? Api::Type::Enum - end - # next unless need_normalize || prop.is_a?(Api::Type::Composite) + sdk_marshal.properties.each do |prop| + reference = get_applicable_reference(prop.azure_sdk_references, sdk_marshal.operation.request) + sdk_type = sdk_marshal.operation.request[reference] + var_name = azure_python_variable_name(prop, sdk_marshal.operation) + parent_ref = get_parent_reference(reference) - if need_normalize - indent = 4 - norm_desc = Provider::Azure::Ansible::SDK::PropertyNormalizeDescriptor.new prop, sdk_marshal.input, sdk_marshal.output, var, sdk_marshal.parent_reference, relative_refs, sdk_marshal.operation + if require_type_marshal?(prop, sdk_marshal) + if self_require_type_marshal?(prop, sdk_marshal) -%> -<% if is_location? prop -%> -resource_group = self.get_resource_group(self.resource_group) -if <%= sdk_marshal.input -%>.get('<%= var -%>') is None: -<% elsif !always_has_value? prop -%> -if <%= sdk_marshal.input -%>.get('<%= var -%>') is not None: +<%= lines(build_property_normalization(prop, sdk_marshal)) -%> <% else -%> -<% indent = 0 -%> -<% end -%> -<%= lines(build_property_normalization(norm_desc, false, indent)) -%> +if <%= sdk_marshal.input -%>.get('<%= var_name -%>') is not None: <% - end - - if prop.is_a? Api::Type::NestedObject - child_sdk_path = sdk_marshal.parent_reference + relative_refs.join('/') + '/' - new_input = "#{sdk_marshal.input}['#{var}']" - new_output = "#{sdk_marshal.output}['#{var}']" - child_sdk_marshal = Provider::Azure::Ansible::SDK::MarshalDescriptor.new prop.properties, sdk_marshal.operation, new_input, new_output, child_sdk_path + child_marshal = sdk_marshal.create_child_descriptor(prop, reference, sdk_type) + output_expression = "#{sdk_marshal.marshalled_references[parent_ref]}['#{sdk_type.python_field_name}']" + sdk_marshal.add_marshalled_reference(reference, output_expression) -%> -<%= lines(build_property_to_sdk_object(child_sdk_marshal)) -%> +<%= lines(build_property_to_sdk_object(child_marshal, 4)) -%> <% + end + else + output_expression = "#{sdk_marshal.marshalled_references[parent_ref]}['#{sdk_type.python_field_name}']" + sdk_marshal.add_marshalled_reference(reference, output_expression) end end -%> \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/reference_assignment.erb b/templates/azure/ansible/sdktypes/reference_assignment.erb new file mode 100644 index 000000000000..250e2a2f804a --- /dev/null +++ b/templates/azure/ansible/sdktypes/reference_assignment.erb @@ -0,0 +1,19 @@ +<% + sdk_type = sdk_marshal.operation.request[reference] + parent_ref = get_parent_reference(reference) + + output_expression = "#{sdk_marshal.marshalled_references[parent_ref]}['#{sdk_type.python_field_name}']" + + assignment = "# TODO: SDK assignment not implemented for #{reference}" + if sdk_marshal.marshalled_references.include?(parent_ref) + assignment = "#{output_expression} = #{input_expression}" + else + new_object = "'#{sdk_type.python_field_name}': #{input_expression}" + new_object = "{\n#{indent(new_object, 4)}\n}" + assignment = build_sdk_reference_assignment(new_object, parent_ref, sdk_marshal) + output_expression = "#{sdk_marshal.marshalled_references[parent_ref]}['#{sdk_type.python_field_name}']" + end + + sdk_marshal.add_marshalled_reference(reference, output_expression) +-%> +<%= lines(assignment) -%> \ No newline at end of file diff --git a/templates/azure/ansible/sdktypes/unsupported.erb b/templates/azure/ansible/sdktypes/unsupported.erb new file mode 100644 index 000000000000..d5ec6dcf40c6 --- /dev/null +++ b/templates/azure/ansible/sdktypes/unsupported.erb @@ -0,0 +1 @@ +# TODO: <%= property.name -%> SDK normalize is not implemented From 070a3627bcbaf887c6c7267a7f9174c0df66c5d2 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Fri, 28 Jun 2019 15:50:30 -0700 Subject: [PATCH 115/175] Remove DEBUG messages. --- templates/azure/ansible/sdktypes/property_normalize.erb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/templates/azure/ansible/sdktypes/property_normalize.erb b/templates/azure/ansible/sdktypes/property_normalize.erb index c453c1734b54..25691ebacd7b 100644 --- a/templates/azure/ansible/sdktypes/property_normalize.erb +++ b/templates/azure/ansible/sdktypes/property_normalize.erb @@ -9,15 +9,9 @@ if <%= sdk_marshal.input -%>.get('<%= var_name -%>') is not None: <% end -%> <% - print reference + ":\n " - print sdk_marshal.parent_reference + "\n " - - need_remove = false if reference.start_with?(sdk_marshal.parent_reference) relative_references = reference[sdk_marshal.parent_reference.length..-1].split('/').reject(&:empty?) -print relative_references -print "\n" need_remove = true if relative_references.length != 1 sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_marshal.operation.request) need_remove = true if relative_references.length == 1 && sdk_type.python_field_name != var_name From f56490a37ef339d17ecd0449028d3d30d0ca973f Mon Sep 17 00:00:00 2001 From: Su Shi <1684739+metacpp@users.noreply.github.com> Date: Sat, 29 Jun 2019 13:58:22 -0700 Subject: [PATCH 116/175] ignore .bundle folder. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3426d84b63dc..2d5dc6e28609 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ ehthumbs.db Thumbs.db .vscode/ + +.bundle/ From 467688415b58a761852935582643b269ca0cd954 Mon Sep 17 00:00:00 2001 From: Su Shi <1684739+metacpp@users.noreply.github.com> Date: Sun, 30 Jun 2019 00:12:09 -0700 Subject: [PATCH 117/175] Fix the code template issue for Terraform. (#12) --- templates/azure/terraform/schemas/datasource_location.erb | 2 +- .../terraform/schemas/datasource_resource_group_name.erb | 2 +- templates/azure/terraform/schemas/location_get.erb | 4 ++-- templates/azure/terraform/schemas/location_set.erb | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/azure/terraform/schemas/datasource_location.erb b/templates/azure/terraform/schemas/datasource_location.erb index 3770e311be36..a82232ca28c7 100644 --- a/templates/azure/terraform/schemas/datasource_location.erb +++ b/templates/azure/terraform/schemas/datasource_location.erb @@ -1 +1 @@ -"<%= property.name.underscore -%>": locationForDataSourceSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": azure.SchemaLocationForDataSource(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/datasource_resource_group_name.erb b/templates/azure/terraform/schemas/datasource_resource_group_name.erb index 3aacd199dc6e..16d818450f34 100644 --- a/templates/azure/terraform/schemas/datasource_resource_group_name.erb +++ b/templates/azure/terraform/schemas/datasource_resource_group_name.erb @@ -1 +1 @@ -"<%= prop_name -%>": resourceGroupNameForDataSourceSchema(), \ No newline at end of file +"<%= prop_name -%>": azure.SchemaResourceGroupNameForDataSource(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/location_get.erb b/templates/azure/terraform/schemas/location_get.erb index 7e737dc5c8ea..d76b2793b91f 100644 --- a/templates/azure/terraform/schemas/location_get.erb +++ b/templates/azure/terraform/schemas/location_get.erb @@ -1,5 +1,5 @@ <% if input_var == 'd' -%> -<%= output_var -%> := azureRMNormalizeLocation(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) +<%= output_var -%> := azure.NormalizeLocation(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) <% else -%> -<%= output_var -%> := azureRMNormalizeLocation(<%= input_var -%>["<%= prop_name -%>"].(<%= go_type(property) -%>)) +<%= output_var -%> := azure.NormalizeLocation(<%= input_var -%>["<%= prop_name -%>"].(<%= go_type(property) -%>)) <% end -%> diff --git a/templates/azure/terraform/schemas/location_set.erb b/templates/azure/terraform/schemas/location_set.erb index e0028e26f5fc..51875c9796eb 100644 --- a/templates/azure/terraform/schemas/location_set.erb +++ b/templates/azure/terraform/schemas/location_set.erb @@ -1,7 +1,7 @@ if location := <%= input_var -%>; location != nil { <% if output_var == 'd' -%> - d.Set("<%= prop_name -%>", azureRMNormalizeLocation(*location)) + d.Set("<%= prop_name -%>", azure.NormalizeLocation(*location)) <% else -%> - <%= output_var -%>["<%= prop_name -%>"] = azureRMNormalizeLocation(*location) + <%= output_var -%>["<%= prop_name -%>"] = azure.NormalizeLocation(*location) <% end -%> } \ No newline at end of file From 332b3ef95b4269c175bca8497c8d75ca61c95c71 Mon Sep 17 00:00:00 2001 From: Su Shi <1684739+metacpp@users.noreply.github.com> Date: Tue, 2 Jul 2019 13:12:55 -0700 Subject: [PATCH 118/175] Fix the template for location. --- build/ansible | 2 +- build/inspec | 2 +- build/terraform | 2 +- build/terraform-beta | 2 +- templates/azure/terraform/schemas/location.erb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/ansible b/build/ansible index 1139dfc0046a..adf6ec907a40 160000 --- a/build/ansible +++ b/build/ansible @@ -1 +1 @@ -Subproject commit 1139dfc0046a7d01d239ec55d0c2480c5939042c +Subproject commit adf6ec907a402079b7656354bb000eb6b5aec339 diff --git a/build/inspec b/build/inspec index 9de2048e8a0b..38254818353a 160000 --- a/build/inspec +++ b/build/inspec @@ -1 +1 @@ -Subproject commit 9de2048e8a0bdae93c659bcda5515b906905c2f7 +Subproject commit 38254818353ad195ffe7a50100b728c60d28b41a diff --git a/build/terraform b/build/terraform index 2265fbc91f6f..23ac5efd95b6 160000 --- a/build/terraform +++ b/build/terraform @@ -1 +1 @@ -Subproject commit 2265fbc91f6f6d13d654f19cfdd8f75d55a4cbe3 +Subproject commit 23ac5efd95b6efde8cfb74bc8eb58f40699e1e53 diff --git a/build/terraform-beta b/build/terraform-beta index 40d2c97ce784..3b0064d17133 160000 --- a/build/terraform-beta +++ b/build/terraform-beta @@ -1 +1 @@ -Subproject commit 40d2c97ce784914030fb0f87815c1452783813b2 +Subproject commit 3b0064d171336a2523b4b4a94cd053a96b8aabab diff --git a/templates/azure/terraform/schemas/location.erb b/templates/azure/terraform/schemas/location.erb index 16b413623d14..6d8a7d13d08e 100644 --- a/templates/azure/terraform/schemas/location.erb +++ b/templates/azure/terraform/schemas/location.erb @@ -1 +1 @@ -"<%= property.name.underscore -%>": locationSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": azure.SchemaLocation(), \ No newline at end of file From b956f9195e259b6fbcd6f81072f1b612e478529b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 8 Jul 2019 17:22:08 -0700 Subject: [PATCH 119/175] Remove azure resource definitions. --- .../examples/terraform/basic.yaml | 15 - products/azapimngdiagnostic/api.yaml | 349 ------------------ products/azapimngdiagnostic/terraform.yaml | 8 - products/azapimngpolicy/api.yaml | 116 ------ .../examples/terraform/basic.yaml | 13 - .../examples/terraform/findReplace.yaml | 13 - products/azapimngpolicy/terraform.yaml | 41 -- .../terraform_apimng_name_schema.erb | 1 - .../terraform_content_field_assign.erb | 1 - .../terraform_format_content_set.erb | 7 - .../terraform_format_field_assign.erb | 1 - .../azapimngpolicy/terraform_format_get.erb | 10 - .../examples/terraform/basic.yaml | 11 - products/azautomationboolvariable/api.yaml | 130 ------- .../examples/terraform/basic.yaml | 14 - .../examples/terraform/complete.yaml | 15 - .../azautomationboolvariable/terraform.yaml | 46 --- .../terraform_get_value.erb | 1 - .../terraform_sdk_value.erb | 1 - .../terraform_set_value.erb | 7 - .../azautomationdatetimevariable/api.yaml | 130 ------- .../examples/terraform/basic.yaml | 14 - .../examples/terraform/complete.yaml | 15 - .../terraform.yaml | 46 --- .../terraform_get_value.erb | 5 - .../terraform_sdk_value.erb | 1 - .../terraform_set_value.erb | 7 - products/azautomationintvariable/api.yaml | 130 ------- .../examples/terraform/basic.yaml | 14 - .../examples/terraform/complete.yaml | 15 - .../azautomationintvariable/terraform.yaml | 46 --- .../terraform_get_value.erb | 1 - .../terraform_sdk_value.erb | 1 - .../terraform_set_value.erb | 7 - products/azautomationnullvariable/api.yaml | 130 ------- .../examples/terraform/basic.yaml | 13 - .../examples/terraform/complete.yaml | 14 - .../azautomationnullvariable/terraform.yaml | 35 -- products/azautomationstringvariable/api.yaml | 130 ------- .../examples/terraform/basic.yaml | 14 - .../examples/terraform/complete.yaml | 15 - .../azautomationstringvariable/terraform.yaml | 45 --- .../terraform_get_value.erb | 1 - .../terraform_set_value.erb | 7 - products/azcontainerregistry/api.yaml | 198 ---------- products/azcontainerregistry/terraform.yaml | 10 - products/azresourcegroup/ansible.yaml | 19 - products/azresourcegroup/api.yaml | 84 ----- .../examples/terraform/basic.yaml | 5 - products/azresourcegroup/terraform.yaml | 10 - products/azservicebusrecovery/ansible.yaml | 19 - products/azservicebusrecovery/api.yaml | 129 ------- .../service_bus_disaster_recovery_config.yaml | 10 - products/azservicebusrecovery/terraform.yaml | 13 - 54 files changed, 2133 deletions(-) delete mode 100644 products/azapimanagement/examples/terraform/basic.yaml delete mode 100644 products/azapimngdiagnostic/api.yaml delete mode 100644 products/azapimngdiagnostic/terraform.yaml delete mode 100644 products/azapimngpolicy/api.yaml delete mode 100644 products/azapimngpolicy/examples/terraform/basic.yaml delete mode 100644 products/azapimngpolicy/examples/terraform/findReplace.yaml delete mode 100644 products/azapimngpolicy/terraform.yaml delete mode 100644 products/azapimngpolicy/terraform_apimng_name_schema.erb delete mode 100644 products/azapimngpolicy/terraform_content_field_assign.erb delete mode 100644 products/azapimngpolicy/terraform_format_content_set.erb delete mode 100644 products/azapimngpolicy/terraform_format_field_assign.erb delete mode 100644 products/azapimngpolicy/terraform_format_get.erb delete mode 100644 products/azautomationaccount/examples/terraform/basic.yaml delete mode 100644 products/azautomationboolvariable/api.yaml delete mode 100644 products/azautomationboolvariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationboolvariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationboolvariable/terraform.yaml delete mode 100644 products/azautomationboolvariable/terraform_get_value.erb delete mode 100644 products/azautomationboolvariable/terraform_sdk_value.erb delete mode 100644 products/azautomationboolvariable/terraform_set_value.erb delete mode 100644 products/azautomationdatetimevariable/api.yaml delete mode 100644 products/azautomationdatetimevariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationdatetimevariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationdatetimevariable/terraform.yaml delete mode 100644 products/azautomationdatetimevariable/terraform_get_value.erb delete mode 100644 products/azautomationdatetimevariable/terraform_sdk_value.erb delete mode 100644 products/azautomationdatetimevariable/terraform_set_value.erb delete mode 100644 products/azautomationintvariable/api.yaml delete mode 100644 products/azautomationintvariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationintvariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationintvariable/terraform.yaml delete mode 100644 products/azautomationintvariable/terraform_get_value.erb delete mode 100644 products/azautomationintvariable/terraform_sdk_value.erb delete mode 100644 products/azautomationintvariable/terraform_set_value.erb delete mode 100644 products/azautomationnullvariable/api.yaml delete mode 100644 products/azautomationnullvariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationnullvariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationnullvariable/terraform.yaml delete mode 100644 products/azautomationstringvariable/api.yaml delete mode 100644 products/azautomationstringvariable/examples/terraform/basic.yaml delete mode 100644 products/azautomationstringvariable/examples/terraform/complete.yaml delete mode 100644 products/azautomationstringvariable/terraform.yaml delete mode 100644 products/azautomationstringvariable/terraform_get_value.erb delete mode 100644 products/azautomationstringvariable/terraform_set_value.erb delete mode 100644 products/azcontainerregistry/api.yaml delete mode 100644 products/azcontainerregistry/terraform.yaml delete mode 100644 products/azresourcegroup/ansible.yaml delete mode 100644 products/azresourcegroup/api.yaml delete mode 100644 products/azresourcegroup/examples/terraform/basic.yaml delete mode 100644 products/azresourcegroup/terraform.yaml delete mode 100644 products/azservicebusrecovery/ansible.yaml delete mode 100644 products/azservicebusrecovery/api.yaml delete mode 100644 products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml delete mode 100644 products/azservicebusrecovery/terraform.yaml diff --git a/products/azapimanagement/examples/terraform/basic.yaml b/products/azapimanagement/examples/terraform/basic.yaml deleted file mode 100644 index eebbd7e42f1a..000000000000 --- a/products/azapimanagement/examples/terraform/basic.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_api_management -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic -properties: - name: "<%= get_resource_name('service', 'AM') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} - publisher_name: pub1 - publisher_email: pub1@email.com - sku: - name: Developer - capacity: 1 \ No newline at end of file diff --git a/products/azapimngdiagnostic/api.yaml b/products/azapimngdiagnostic/api.yaml deleted file mode 100644 index ea08ac804b03..000000000000 --- a/products/azapimngdiagnostic/api.yaml +++ /dev/null @@ -1,349 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure API Management Diagnostic -prefix: azapimngdiagnostic -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: ApiManagementDiagnostic - api_name: NotUsedInAzure - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.ApiManagement - go_client_namespace: apimanagement - go_client: apiManagementDiagnosticClient - python_client_namespace: azure.mgmt.apimanagement - python_client: ApiManagementClient.diagnostic - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - python_parameter_name: service_name - python_variable_name: api_management_name - 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: diagnostics - go_variable_name: name - python_parameter_name: diagnostic_id - python_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: DiagnosticContract - python_parameter_name: parameters - python_variable_name: diagnostic - 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: '""' - python_parameter_name: if_match - python_variable_name: "''" - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: DiagnosticContractProperties - go_type_name: DiagnosticContractProperties - '/properties/alwaysLog': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: AlwaysLog - go_enum_type_name: AlwaysLog - '/properties/backend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Backend - go_type_name: PipelineDiagnosticSettings - '/properties/backend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Request - go_type_name: HTTPMessageDiagnostic - '/properties/backend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/backend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/backend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/backend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Response - go_type_name: HTTPMessageDiagnostic - '/properties/backend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/backend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/backend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/enableHttpCorrelationHeaders': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: EnableHTTPCorrelationHeaders - '/properties/frontend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Frontend - go_type_name: PipelineDiagnosticSettings - '/properties/frontend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Request - go_type_name: HTTPMessageDiagnostic - '/properties/frontend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/frontend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/frontend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/frontend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Response - go_type_name: HTTPMessageDiagnostic - '/properties/frontend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/frontend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/frontend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/loggerId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoggerID - '/properties/sampling': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sampling - go_type_name: SamplingSettings - '/properties/sampling/percentage': !ruby/object:Api::Azure::SDKTypeDefinition::FloatObject - go_field_name: Percentage - '/properties/sampling/samplingType': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: SamplingType - go_enum_type_name: SamplingType - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - python_parameter_name: service_name - python_variable_name: api_management_name - 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: diagnostics - go_variable_name: name - python_parameter_name: diagnostic_id - python_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: DiagnosticContract - '/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - python_field_name: id - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - python_field_name: name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: DiagnosticContractProperties - go_type_name: DiagnosticContractProperties - go_variable_name: properties - '/properties/alwaysLog': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: AlwaysLog - go_enum_type_name: AlwaysLog - '/properties/backend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Backend - go_type_name: PipelineDiagnosticSettings - '/properties/backend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Request - go_type_name: HTTPMessageDiagnostic - '/properties/backend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/backend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/backend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/backend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Response - go_type_name: HTTPMessageDiagnostic - '/properties/backend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/backend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/backend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/enableHttpCorrelationHeaders': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: EnableHTTPCorrelationHeaders - '/properties/frontend': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Frontend - go_type_name: PipelineDiagnosticSettings - '/properties/frontend/request': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Request - go_type_name: HTTPMessageDiagnostic - '/properties/frontend/request/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/frontend/request/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/frontend/request/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/frontend/response': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Response - go_type_name: HTTPMessageDiagnostic - '/properties/frontend/response/headers': !ruby/object:Api::Azure::SDKTypeDefinition::StringArrayObject - go_field_name: Headers - '/properties/frontend/response/body': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Body - go_type_name: BodyDiagnosticSettings - '/properties/frontend/response/body/bytes': !ruby/object:Api::Azure::SDKTypeDefinition::Integer32Object - go_field_name: Bytes - '/properties/loggerId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoggerID - '/properties/sampling': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sampling - go_type_name: SamplingSettings - '/properties/sampling/percentage': !ruby/object:Api::Azure::SDKTypeDefinition::FloatObject - go_field_name: Percentage - '/properties/sampling/samplingType': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: SamplingType - go_enum_type_name: SamplingType - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group_name - python_variable_name: resource_group - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - python_parameter_name: service_name - python_variable_name: api_management_name - 'diagnosticId': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: diagnostics - go_variable_name: name - python_parameter_name: diagnostic_id - python_variable_name: name - 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: '""' - python_parameter_name: if_match - python_variable_name: "''" - - description: Manages an API Management Diagnostic on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: The name of the resource group. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - properties: - - !ruby/object:Api::Type::String - name: apiManagementName - description: The name of the API Management service. - required: true - input: true - azure_sdk_references: ['serviceName'] - order: 650 - - !ruby/object:Api::Type::String - name: name - description: Diagnostic identifier. Must be unique in the current API Management service instance. - required: true - input: true - azure_sdk_references: ['diagnosticId', '/name'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: loggerId - description: Resource Id of a target logger. - required: true - azure_sdk_references: ['/properties/loggerId'] - - !ruby/object:Api::Type::Enum - name: alwaysLog - description: Specifies for what type of messages sampling settings should not apply. - values: - - :AllErrors - azure_sdk_references: ['/properties/alwaysLog'] - - !ruby/object:Api::Type::Boolean - name: enableHttpCorrelationHeaders - description: Whether to process Correlation Headers coming to Api Management Service. Only applicable to Application Insights diagnostics. - default_value: true - azure_sdk_references: ['/properties/enableHttpCorrelationHeaders'] - - !ruby/object:Api::Type::Enum - name: samplingType - description: Sampling type. - values: - - :Fixed - azure_sdk_references: ['/properties/sampling/samplingType'] - - !ruby/object:Api::Type::Double - name: samplingPercentage - description: Rate of sampling for fixed-rate sampling. - azure_sdk_references: ['/properties/sampling/percentage'] - - !ruby/object:Api::Type::NestedObject - name: backend - description: Diagnostic settings for incoming/outgoing HTTP messages to the Backend. - azure_sdk_references: ['/properties/backend'] - properties: - - !ruby/object:Api::Type::NestedObject - name: request - description: Diagnostic settings for request. - azure_sdk_references: ['/properties/backend/request'] - properties: - - !ruby/object:Api::Type::Array - name: headers - description: Array of HTTP Headers to log. - item_type: Api::Type::String - azure_sdk_references: ['/properties/backend/request/headers'] - - !ruby/object:Api::Type::Integer - name: bodyBytes - description: Number of request body bytes to log. - azure_sdk_references: ['/properties/backend/request/body/bytes'] - - !ruby/object:Api::Type::NestedObject - name: response - description: Diagnostic settings for response. - azure_sdk_references: ['/properties/backend/response'] - properties: - - !ruby/object:Api::Type::Array - name: headers - description: Array of HTTP Headers to log. - item_type: Api::Type::String - azure_sdk_references: ['/properties/backend/response/headers'] - - !ruby/object:Api::Type::Integer - name: bodyBytes - description: Number of request body bytes to log. - azure_sdk_references: ['/properties/backend/response/body/bytes'] - - !ruby/object:Api::Type::NestedObject - name: frontend - description: Diagnostic settings for incoming/outgoing HTTP messages to the Gateway. - azure_sdk_references: ['/properties/frontend'] - properties: - - !ruby/object:Api::Type::NestedObject - name: request - description: Diagnostic settings for request. - azure_sdk_references: ['/properties/frontend/request'] - properties: - - !ruby/object:Api::Type::Array - name: headers - description: Array of HTTP Headers to log. - item_type: Api::Type::String - azure_sdk_references: ['/properties/frontend/request/headers'] - - !ruby/object:Api::Type::Integer - name: bodyBytes - description: Number of request body bytes to log. - azure_sdk_references: ['/properties/frontend/request/body/bytes'] - - !ruby/object:Api::Type::NestedObject - name: response - description: Diagnostic settings for response. - azure_sdk_references: ['/properties/frontend/response'] - properties: - - !ruby/object:Api::Type::Array - name: headers - description: Array of HTTP Headers to log. - item_type: Api::Type::String - azure_sdk_references: ['/properties/frontend/response/headers'] - - !ruby/object:Api::Type::Integer - name: bodyBytes - description: Number of request body bytes to log. - azure_sdk_references: ['/properties/frontend/response/body/bytes'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: Resource ID. - output: true - azure_sdk_references: ['/id'] \ No newline at end of file diff --git a/products/azapimngdiagnostic/terraform.yaml b/products/azapimngdiagnostic/terraform.yaml deleted file mode 100644 index c84de3bf44ba..000000000000 --- a/products/azapimngdiagnostic/terraform.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azapimngdiagnostic -overrides: !ruby/object:Provider::ResourceOverrides - ApiManagementDiagnostic: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings \ No newline at end of file diff --git a/products/azapimngpolicy/api.yaml b/products/azapimngpolicy/api.yaml deleted file mode 100644 index db4a777141a9..000000000000 --- a/products/azapimngpolicy/api.yaml +++ /dev/null @@ -1,116 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure API Management Policy -prefix: azapimngpolicy -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: ApiManagementPolicy - api_name: ApiManagementPolicy - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.ApiManagement - go_client_namespace: apimanagement - go_client: apiManagementPolicyClient - python_client_namespace: azure.mgmt.apimanagement - python_client: APIManagementClient - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: PolicyContract - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: PolicyContractProperties - go_type_name: PolicyContractProperties - '/properties/contentFormat': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: ContentFormat - go_enum_type_name: PolicyContentFormat - '/properties/policyContent': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: PolicyContent - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: PolicyContract - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: PolicyContractProperties - go_type_name: PolicyContractProperties - go_variable_name: properties - '/properties/contentFormat': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: ContentFormat - go_enum_type_name: PolicyContentFormat - '/properties/policyContent': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: PolicyContent - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'serviceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: service - go_variable_name: serviceName - 'ifMatch': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: '""' - - description: | - Manages a global Policy within an API Management Service. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: resourceGroupName - description: The name of the Resource Group in which the API Management Service exists. - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: apiManagementName - description: The name of the API Management Service where this Policy should be created. - required: true - input: true - azure_sdk_references: ['serviceName'] - properties: - - !ruby/object:Api::Type::String - name: xmlContent - description: The XML configuration of this Policy. - azure_sdk_references: ['/properties/policyContent'] - - !ruby/object:Api::Type::String - name: xmlLink - description: The HTTP endpoint of the XML configuration accessible from the API Management Service. - azure_sdk_references: ['/properties/policyContent'] - - !ruby/object:Api::Type::Enum - name: format - values: - - :Xml - - :XmlLink - description: 'The content format of the Policy.' - order: 1100 - azure_sdk_references: ['/properties/contentFormat'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the API Management Policy. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azapimngpolicy/examples/terraform/basic.yaml b/products/azapimngpolicy/examples/terraform/basic.yaml deleted file mode 100644 index 8c5fc38a16d0..000000000000 --- a/products/azapimngpolicy/examples/terraform/basic.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_api_management_policy -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azapimanagement - example: basic -properties: - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - api_management_name: ${azurerm_api_management.<%= resource_id_hint -%>.name} - xml_content: \ No newline at end of file diff --git a/products/azapimngpolicy/examples/terraform/findReplace.yaml b/products/azapimngpolicy/examples/terraform/findReplace.yaml deleted file mode 100644 index 6f50b28b5f22..000000000000 --- a/products/azapimngpolicy/examples/terraform/findReplace.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_api_management_policy -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azapimanagement - example: basic -properties: - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - api_management_name: ${azurerm_api_management.<%= resource_id_hint -%>.name} - xml_content: \ No newline at end of file diff --git a/products/azapimngpolicy/terraform.yaml b/products/azapimngpolicy/terraform.yaml deleted file mode 100644 index f22a6ff3d1fd..000000000000 --- a/products/azapimngpolicy/terraform.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azapimngpolicy -overrides: !ruby/object:Provider::ResourceOverrides - ApiManagementPolicy: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name_in_logs: Global Policy - properties: - apiManagementName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - name_in_logs: API Management Service - custom_schema_definition: products/azapimngpolicy/terraform_apimng_name_schema.erb - format: !ruby/object:Provider::Azure::Terraform::PropertyOverride - hide_from_schema: true - custom_schema_get: products/azapimngpolicy/terraform_format_get.erb - custom_schema_set: products/azapimngpolicy/terraform_format_content_set.erb - custom_sdkfield_assign: products/azapimngpolicy/terraform_format_field_assign.erb - xmlContent: !ruby/object:Provider::Azure::Terraform::PropertyOverride - conflicts_with: [xml_link] - diff_suppress_func: 'suppress.SuppressXmlDiff' - custom_schema_set: templates/terraform/schemas/empty.erb - custom_sdkfield_assign: products/azapimngpolicy/terraform_content_field_assign.erb - xmlLink: !ruby/object:Provider::Azure::Terraform::PropertyOverride - conflicts_with: [xml_content] - custom_schema_set: templates/terraform/schemas/empty.erb - custom_sdkfield_assign: templates/terraform/schemas/empty.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: findReplace - steps: [findReplace] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: update - steps: [basic, findReplace, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: findReplace - resource_name_hints: - resourceGroups: example-rg - service: example-apim - location: West US diff --git a/products/azapimngpolicy/terraform_apimng_name_schema.erb b/products/azapimngpolicy/terraform_apimng_name_schema.erb deleted file mode 100644 index aef793d33086..000000000000 --- a/products/azapimngpolicy/terraform_apimng_name_schema.erb +++ /dev/null @@ -1 +0,0 @@ -"<%= property.name.underscore -%>": azure.SchemaApiManagementName(), \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_content_field_assign.erb b/products/azapimngpolicy/terraform_content_field_assign.erb deleted file mode 100644 index 12ba86d032d5..000000000000 --- a/products/azapimngpolicy/terraform_content_field_assign.erb +++ /dev/null @@ -1 +0,0 @@ -PolicyContent: utils.String(content), \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_content_set.erb b/products/azapimngpolicy/terraform_format_content_set.erb deleted file mode 100644 index cb3e270a4a1b..000000000000 --- a/products/azapimngpolicy/terraform_format_content_set.erb +++ /dev/null @@ -1,7 +0,0 @@ -d.Set("xml_content", "") -d.Set("xml_link", "") -if properties.ContentFormat == apimanagement.XML { - d.Set("xml_content", properties.PolicyContent) -} else if properties.ContentFormat == apimanagement.XMLLink { - d.Set("xml_link", properties.PolicyContent) -} \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_field_assign.erb b/products/azapimngpolicy/terraform_format_field_assign.erb deleted file mode 100644 index c1dafcd773c1..000000000000 --- a/products/azapimngpolicy/terraform_format_field_assign.erb +++ /dev/null @@ -1 +0,0 @@ -ContentFormat: format, \ No newline at end of file diff --git a/products/azapimngpolicy/terraform_format_get.erb b/products/azapimngpolicy/terraform_format_get.erb deleted file mode 100644 index d1724d7bd80e..000000000000 --- a/products/azapimngpolicy/terraform_format_get.erb +++ /dev/null @@ -1,10 +0,0 @@ -if xmlContent == "" && xmlLink == "" { - return fmt.Errorf("Either `xml_content` or `xml_link` is required") -} - -content := xmlContent -format := apimanagement.XML -if xmlLink != "" { - content = xmlLink - format = apimanagement.XMLLink -} \ No newline at end of file diff --git a/products/azautomationaccount/examples/terraform/basic.yaml b/products/azautomationaccount/examples/terraform/basic.yaml deleted file mode 100644 index d4aa2939dfd7..000000000000 --- a/products/azautomationaccount/examples/terraform/basic.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_account -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic -properties: - name: "<%= get_resource_name('automationAccounts', 'AutoAcct') -%>" - location: ${azurerm_resource_group.<%= resource_id_hint -%>.location} - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - sku_name: Basic \ No newline at end of file diff --git a/products/azautomationboolvariable/api.yaml b/products/azautomationboolvariable/api.yaml deleted file mode 100644 index b8d308b507a7..000000000000 --- a/products/azautomationboolvariable/api.yaml +++ /dev/null @@ -1,130 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationintvariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::Boolean - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationboolvariable/examples/terraform/basic.yaml b/products/azautomationboolvariable/examples/terraform/basic.yaml deleted file mode 100644 index 4f3ca8533126..000000000000 --- a/products/azautomationboolvariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_bool_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: false \ No newline at end of file diff --git a/products/azautomationboolvariable/examples/terraform/complete.yaml b/products/azautomationboolvariable/examples/terraform/complete.yaml deleted file mode 100644 index 6a3fa8eb02b6..000000000000 --- a/products/azautomationboolvariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_bool_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. - value: true \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform.yaml b/products/azautomationboolvariable/terraform.yaml deleted file mode 100644 index eecc6412ba2f..000000000000 --- a/products/azautomationboolvariable/terraform.yaml +++ /dev/null @@ -1,46 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationboolvariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationBoolVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationboolvariable/terraform_get_value.erb - custom_schema_set: products/azautomationboolvariable/terraform_set_value.erb - custom_sdkfield_assign: products/azautomationboolvariable/terraform_sdk_value.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US -datasources: !ruby/object:Provider::ResourceOverrides - AutomationBoolVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - description: The Name of the Resource Group where the App Service exists. - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - datasource_example_outputs: - variable_id: id \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform_get_value.erb b/products/azautomationboolvariable/terraform_get_value.erb deleted file mode 100644 index d5f4e7130dc7..000000000000 --- a/products/azautomationboolvariable/terraform_get_value.erb +++ /dev/null @@ -1 +0,0 @@ -<%= output_var -%> := strconv.FormatBool(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform_sdk_value.erb b/products/azautomationboolvariable/terraform_sdk_value.erb deleted file mode 100644 index e9520c1ab0fa..000000000000 --- a/products/azautomationboolvariable/terraform_sdk_value.erb +++ /dev/null @@ -1 +0,0 @@ -Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationboolvariable/terraform_set_value.erb b/products/azautomationboolvariable/terraform_set_value.erb deleted file mode 100644 index 403b1dba98f3..000000000000 --- a/products/azautomationboolvariable/terraform_set_value.erb +++ /dev/null @@ -1,7 +0,0 @@ -if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_bool_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) -} \ No newline at end of file diff --git a/products/azautomationdatetimevariable/api.yaml b/products/azautomationdatetimevariable/api.yaml deleted file mode 100644 index abc61a635d4b..000000000000 --- a/products/azautomationdatetimevariable/api.yaml +++ /dev/null @@ -1,130 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationdatetimevariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::String - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationdatetimevariable/examples/terraform/basic.yaml b/products/azautomationdatetimevariable/examples/terraform/basic.yaml deleted file mode 100644 index fc7cd368b01d..000000000000 --- a/products/azautomationdatetimevariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_datetime_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: "2019-04-24T21:40:54.074Z" \ No newline at end of file diff --git a/products/azautomationdatetimevariable/examples/terraform/complete.yaml b/products/azautomationdatetimevariable/examples/terraform/complete.yaml deleted file mode 100644 index 37ced1312c44..000000000000 --- a/products/azautomationdatetimevariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_datetime_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. - value: "2019-04-20T08:40:04.02Z" \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform.yaml b/products/azautomationdatetimevariable/terraform.yaml deleted file mode 100644 index 983d43a53aae..000000000000 --- a/products/azautomationdatetimevariable/terraform.yaml +++ /dev/null @@ -1,46 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationdatetimevariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationDatetimeVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationdatetimevariable/terraform_get_value.erb - custom_schema_set: products/azautomationdatetimevariable/terraform_set_value.erb - custom_sdkfield_assign: products/azautomationdatetimevariable/terraform_sdk_value.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US -datasources: !ruby/object:Provider::ResourceOverrides - AutomationDatetimeVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - description: The Name of the Resource Group where the App Service exists. - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - datasource_example_outputs: - variable_id: id \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_get_value.erb b/products/azautomationdatetimevariable/terraform_get_value.erb deleted file mode 100644 index aa08a8af6523..000000000000 --- a/products/azautomationdatetimevariable/terraform_get_value.erb +++ /dev/null @@ -1,5 +0,0 @@ -vTime, parseErr := time.Parse(time.RFC3339, d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) -if parseErr != nil { - return fmt.Errorf("Error invalid time format: %+v", parseErr) -} -<%= output_var -%> := fmt.Sprintf("\"\\/Date(%d)\\/\"", vTime.UnixNano() / 1000000) \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_sdk_value.erb b/products/azautomationdatetimevariable/terraform_sdk_value.erb deleted file mode 100644 index e9520c1ab0fa..000000000000 --- a/products/azautomationdatetimevariable/terraform_sdk_value.erb +++ /dev/null @@ -1 +0,0 @@ -Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationdatetimevariable/terraform_set_value.erb b/products/azautomationdatetimevariable/terraform_set_value.erb deleted file mode 100644 index 47400c5e4400..000000000000 --- a/products/azautomationdatetimevariable/terraform_set_value.erb +++ /dev/null @@ -1,7 +0,0 @@ -if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_datetime_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value.(time.Time).Format("2006-01-02T15:04:05.999Z")) -} \ No newline at end of file diff --git a/products/azautomationintvariable/api.yaml b/products/azautomationintvariable/api.yaml deleted file mode 100644 index abd3bd92e394..000000000000 --- a/products/azautomationintvariable/api.yaml +++ /dev/null @@ -1,130 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationintvariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::Integer - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationintvariable/examples/terraform/basic.yaml b/products/azautomationintvariable/examples/terraform/basic.yaml deleted file mode 100644 index 0b8f5d927131..000000000000 --- a/products/azautomationintvariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_int_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: 1234 \ No newline at end of file diff --git a/products/azautomationintvariable/examples/terraform/complete.yaml b/products/azautomationintvariable/examples/terraform/complete.yaml deleted file mode 100644 index 6866b75f32fa..000000000000 --- a/products/azautomationintvariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_int_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. - value: 12345 \ No newline at end of file diff --git a/products/azautomationintvariable/terraform.yaml b/products/azautomationintvariable/terraform.yaml deleted file mode 100644 index 01ce9d48bfeb..000000000000 --- a/products/azautomationintvariable/terraform.yaml +++ /dev/null @@ -1,46 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationintvariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationIntVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationintvariable/terraform_get_value.erb - custom_schema_set: products/azautomationintvariable/terraform_set_value.erb - custom_sdkfield_assign: products/azautomationintvariable/terraform_sdk_value.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US -datasources: !ruby/object:Provider::ResourceOverrides - AutomationIntVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - description: The Name of the Resource Group where the App Service exists. - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - datasource_example_outputs: - variable_id: id \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_get_value.erb b/products/azautomationintvariable/terraform_get_value.erb deleted file mode 100644 index 551568401104..000000000000 --- a/products/azautomationintvariable/terraform_get_value.erb +++ /dev/null @@ -1 +0,0 @@ -<%= output_var -%> := strconv.Itoa(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_sdk_value.erb b/products/azautomationintvariable/terraform_sdk_value.erb deleted file mode 100644 index e9520c1ab0fa..000000000000 --- a/products/azautomationintvariable/terraform_sdk_value.erb +++ /dev/null @@ -1 +0,0 @@ -Value: utils.String(value), \ No newline at end of file diff --git a/products/azautomationintvariable/terraform_set_value.erb b/products/azautomationintvariable/terraform_set_value.erb deleted file mode 100644 index 07343a0de429..000000000000 --- a/products/azautomationintvariable/terraform_set_value.erb +++ /dev/null @@ -1,7 +0,0 @@ -if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_int_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) -} \ No newline at end of file diff --git a/products/azautomationnullvariable/api.yaml b/products/azautomationnullvariable/api.yaml deleted file mode 100644 index 24c65df10b22..000000000000 --- a/products/azautomationnullvariable/api.yaml +++ /dev/null @@ -1,130 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationvariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::String - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted. Defaults to `false`.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationnullvariable/examples/terraform/basic.yaml b/products/azautomationnullvariable/examples/terraform/basic.yaml deleted file mode 100644 index f93ad5c61271..000000000000 --- a/products/azautomationnullvariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_null_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} \ No newline at end of file diff --git a/products/azautomationnullvariable/examples/terraform/complete.yaml b/products/azautomationnullvariable/examples/terraform/complete.yaml deleted file mode 100644 index 62fba8e308ff..000000000000 --- a/products/azautomationnullvariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_null_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. \ No newline at end of file diff --git a/products/azautomationnullvariable/terraform.yaml b/products/azautomationnullvariable/terraform.yaml deleted file mode 100644 index b2aa0886ff8d..000000000000 --- a/products/azautomationnullvariable/terraform.yaml +++ /dev/null @@ -1,35 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationnullvariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationNullVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - encrypted: !ruby/object:Provider::Azure::Terraform::PropertyOverride - exclude: true - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - exclude: true - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US diff --git a/products/azautomationstringvariable/api.yaml b/products/azautomationstringvariable/api.yaml deleted file mode 100644 index a99fdc24b4a1..000000000000 --- a/products/azautomationstringvariable/api.yaml +++ /dev/null @@ -1,130 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Automation Variable -prefix: azautomationstringvariable -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: AutomationVariable - api_name: AutomationVariable - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Automation - go_client_namespace: automation - go_client: automationVariableClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: VariableCreateOrUpdateParameters - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableCreateOrUpdateProperties - go_type_name: VariableCreateOrUpdateProperties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Variable - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: VariableProperties - go_type_name: VariableProperties - go_variable_name: properties - '/properties/description': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Description - '/properties/isEncrypted': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: IsEncrypted - '/properties/value': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Value - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'automationAccountName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: automationAccounts - go_variable_name: accountName - 'variableName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: variables - go_variable_name: name - - description: | - Manages an automation variable on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Automation Variable.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Type::String - name: 'automationAccountName' - description: 'The name of the automation account in which the Variable is created.' - required: true - input: true - azure_sdk_references: ['automationAccountName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the Automation Variable.' - required: true - input: true - azure_sdk_references: ['variableName', '/name'] - - !ruby/object:Api::Type::String - name: 'description' - description: 'The description of the Automation Variable.' - azure_sdk_references: ['/properties/description'] - - !ruby/object:Api::Type::String - name: 'value' - description: 'The value of the Automation Variable.' - azure_sdk_references: ['/properties/value'] - - !ruby/object:Api::Type::Boolean - name: 'encrypted' - description: 'Specifies if the Automation Variable is encrypted.' - default_value: false - azure_sdk_references: ['/properties/isEncrypted'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the Automation Variable. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azautomationstringvariable/examples/terraform/basic.yaml b/products/azautomationstringvariable/examples/terraform/basic.yaml deleted file mode 100644 index 6861d18f2337..000000000000 --- a/products/azautomationstringvariable/examples/terraform/basic.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - value: Hello, Terraform Basic Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/examples/terraform/complete.yaml b/products/azautomationstringvariable/examples/terraform/complete.yaml deleted file mode 100644 index 8268f4f900b2..000000000000 --- a/products/azautomationstringvariable/examples/terraform/complete.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_automation_string_variable -prerequisites: - - !ruby/object:Provider::Azure::ExampleReference - product: azresourcegroup - example: basic - - !ruby/object:Provider::Azure::ExampleReference - product: azautomationaccount - example: basic -properties: - name: "<%= get_resource_name('variables', 'AutoVar') -%>" - resource_group_name: ${azurerm_resource_group.<%= resource_id_hint -%>.name} - automation_account_name: ${azurerm_automation_account.<%= resource_id_hint -%>.name} - description: This variable is created by Terraform acceptance test. - value: Hello, Terraform Complete Test. \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform.yaml b/products/azautomationstringvariable/terraform.yaml deleted file mode 100644 index c72da2c7cf88..000000000000 --- a/products/azautomationstringvariable/terraform.yaml +++ /dev/null @@ -1,45 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: azautomationstringvariable -overrides: !ruby/object:Provider::ResourceOverrides - AutomationVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - name: AutomationStringVariable - properties: - name: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - automationAccountName: !ruby/object:Provider::Terraform::PropertyOverride - validation: !ruby/object:Provider::Terraform::Validation - function: validate.NoEmptyStrings - value: !ruby/object:Provider::Azure::Terraform::PropertyOverride - custom_schema_get: products/azautomationstringvariable/terraform_get_value.erb - custom_schema_set: products/azautomationstringvariable/terraform_set_value.erb - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: complete - steps: [complete] - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basicCompleteUpdate - steps: [basic, complete, basic] - document_examples: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::DocumentExampleReference - title: Example Usage - example_name: basic - resource_name_hints: - resourceGroups: tfex-example-rg - automationAccounts: tfex-example-account - variables: tfex-example-var - location: West US -datasources: !ruby/object:Provider::ResourceOverrides - AutomationStringVariable: !ruby/object:Provider::Azure::Terraform::ResourceOverride - properties: - resourceGroupName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - description: The Name of the Resource Group where the App Service exists. - acctests: - - !ruby/object:Provider::Azure::Terraform::ResourceOverride::AccTestDefinition - name: basic - steps: [basic] - datasource_example_outputs: - variable_id: id \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform_get_value.erb b/products/azautomationstringvariable/terraform_get_value.erb deleted file mode 100644 index 819f62f2c41f..000000000000 --- a/products/azautomationstringvariable/terraform_get_value.erb +++ /dev/null @@ -1 +0,0 @@ -<%= output_var -%> := strconv.Quote(d.Get("<%= prop_name -%>").(<%= go_type(property) -%>)) \ No newline at end of file diff --git a/products/azautomationstringvariable/terraform_set_value.erb b/products/azautomationstringvariable/terraform_set_value.erb deleted file mode 100644 index f2b33613cf40..000000000000 --- a/products/azautomationstringvariable/terraform_set_value.erb +++ /dev/null @@ -1,7 +0,0 @@ -if !d.Get("encrypted").(bool) { - value, err := azure.ParseAzureRmAutomationVariableValue("azurerm_automation_string_variable", properties.Value) - if err != nil { - return err - } - d.Set("value", value) -} \ No newline at end of file diff --git a/products/azcontainerregistry/api.yaml b/products/azcontainerregistry/api.yaml deleted file mode 100644 index 2189c0de3a5b..000000000000 --- a/products/azcontainerregistry/api.yaml +++ /dev/null @@ -1,198 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Container Registry -prefix: arm -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: ContainerRegistry - api_name: ContainerRegistry - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.ContainerRegistry - go_client_namespace: containerregistry - go_client: containerRegistryClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Create - python_func_name: create - async: true - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: registries - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: Registry - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryProperties - go_type_name: RegistryProperties - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: registries - go_variable_name: name - response: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_variable_name: resourceGroup - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Registry - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/loginServer': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: LoginServer - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryProperties - go_type_name: RegistryProperties - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - update: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Update - python_func_name: update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: registries - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: RegistryUpdateParameters - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: RegistryPropertiesUpdateParameters - go_type_name: RegistryPropertiesUpdateParameters - '/properties/adminUserEnabled': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: AdminUserEnabled - '/sku': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: Sku - go_type_name: Sku - '/sku/name': !ruby/object:Api::Azure::SDKTypeDefinition::EnumObject - go_field_name: Name - go_enum_type_name: SkuName - '/sku/tier': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tier - '/properties/storageAccount': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: StorageAccount - go_type_name: StorageAccountProperties - '/properties/storageAccount/id': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: ID - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - async: true - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - 'registryName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: registries - go_variable_name: name - - description: | - Manages a container registry on Azure. - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'Specifies the name of the Container Registry.' - required: true - input: true - azure_sdk_references: ['registryName', '/name'] - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the Container Registry.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - - !ruby/object:Api::Azure::Type::Location - name: 'location' - description: 'Specifies the supported Azure location where the resource exists.' - required: true - input: true - azure_sdk_references: ['/location'] - - !ruby/object:Api::Type::Enum - name: 'sku' - values: - - :Classic - - :Basic - - :Standard - - :Premium - description: 'The SKU name of the the container registry.' - default_value: :Classic - azure_sdk_references: ['/sku/name'] - order: 830 - - !ruby/object:Api::Type::Boolean - name: 'adminEnabled' - description: 'Specifies whether the admin user is enabled.' - default_value: false - azure_sdk_references: ['/properties/adminUserEnabled'] - - !ruby/object:Api::Type::String - name: 'storageAccountId' - description: 'The ID of a Storage Account which must be located in the same Azure Region as the Container Registry.' - azure_sdk_references: ['/properties/storageAccount/id'] - - !ruby/object:Api::Type::String - name: 'loginServer' - description: 'The URL that can be used to log into the container registry.' - output: true - azure_sdk_references: ['/loginServer'] - - !ruby/object:Api::Azure::Type::Tags - name: 'tags' - description: 'A mapping of tags to assign to the container registry.' - azure_sdk_references: ['/tags'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the container registry. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azcontainerregistry/terraform.yaml b/products/azcontainerregistry/terraform.yaml deleted file mode 100644 index 94bc190a97e5..000000000000 --- a/products/azcontainerregistry/terraform.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: Arm -overrides: !ruby/object:Provider::ResourceOverrides - ContainerRegistry: !ruby/object:Provider::Terraform::ResourceOverride - example: - - !ruby/object:Provider::Terraform::Examples - name: "container_registry" - primary_resource_id: "example" - vars: - rg_name: "example-rg" diff --git a/products/azresourcegroup/ansible.yaml b/products/azresourcegroup/ansible.yaml deleted file mode 100644 index 603c422cf553..000000000000 --- a/products/azresourcegroup/ansible.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- !ruby/object:Provider::Ansible::Config -manifest: !ruby/object:Provider::Ansible::Manifest - metadata_version: '1.1' - status: - - preview - supported_by: 'community' - requirements: - - python >= 2.6 - - requests >= 2.18.4 - - google-auth >= 1.3.0 - version_added: '2.6' - author: Google Inc. (@googlecloudplatform) -overrides: !ruby/object:Provider::ResourceOverrides - ResourceGroup: !ruby/object:Provider::Ansible::ResourceOverride - transport: !ruby/object:Api::Resource::Transport - encoder: encode_request - decoder: decode_request - provider_helpers: - - 'products/pubsub/helpers/python/provider_topic.py' diff --git a/products/azresourcegroup/api.yaml b/products/azresourcegroup/api.yaml deleted file mode 100644 index 407671452e3b..000000000000 --- a/products/azresourcegroup/api.yaml +++ /dev/null @@ -1,84 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Resource Group -prefix: arm -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: 'ResourceGroup' - api_name: ResourceGroups - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: Microsoft.Resources - go_client_namespace: resources - go_client: resourceGroupsClient - python_client_namespace: '?' - python_client: '?' - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: Group - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_type_name: Group - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/location': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Location - '/tags': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Tags - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - async: true - request: - 'name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: name - - description: | - Manages a resource group on Azure. - properties: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'name' - description: 'The name of the resource group.' - required: true - input: true - azure_sdk_references: ['name', '/name'] - - !ruby/object:Api::Azure::Type::Location - name: 'location' - description: 'The location where the resource group should be created.' - required: true - input: true - azure_sdk_references: ['/location'] - - !ruby/object:Api::Azure::Type::Tags - name: 'tags' - description: 'A mapping of tags to assign to the resource group.' - azure_sdk_references: ['/tags'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the resource group. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azresourcegroup/examples/terraform/basic.yaml b/products/azresourcegroup/examples/terraform/basic.yaml deleted file mode 100644 index 07684ef6c218..000000000000 --- a/products/azresourcegroup/examples/terraform/basic.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- !ruby/object:Provider::Azure::Example -resource: azurerm_resource_group -properties: - name: "<%= get_resource_name('resourceGroups', 'RG') -%>" - location: "<%= get_location() -%>" \ No newline at end of file diff --git a/products/azresourcegroup/terraform.yaml b/products/azresourcegroup/terraform.yaml deleted file mode 100644 index 58abe421fe1d..000000000000 --- a/products/azresourcegroup/terraform.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: Arm -overrides: !ruby/object:Provider::ResourceOverrides - ResourceGroup: !ruby/object:Provider::Terraform::ResourceOverride - example: - - !ruby/object:Provider::Terraform::Examples - name: "resource_group" - primary_resource_id: "example" - vars: - rg_name: "ExampleRG" diff --git a/products/azservicebusrecovery/ansible.yaml b/products/azservicebusrecovery/ansible.yaml deleted file mode 100644 index ea1548931ecf..000000000000 --- a/products/azservicebusrecovery/ansible.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- !ruby/object:Provider::Ansible::Config -manifest: !ruby/object:Provider::Ansible::Manifest - metadata_version: '1.1' - status: - - preview - supported_by: 'community' - requirements: - - python >= 2.6 - - requests >= 2.18.4 - - google-auth >= 1.3.0 - version_added: '2.6' - author: Zim Kalinowski (@zikalino) -overrides: !ruby/object:Provider::ResourceOverrides - ServiceBusDisasterRecoveryConfig: !ruby/object:Provider::Ansible::ResourceOverride - transport: !ruby/object:Api::Resource::Transport - encoder: encode_request - decoder: decode_request - provider_helpers: - - 'products/pubsub/helpers/python/provider_topic.py' diff --git a/products/azservicebusrecovery/api.yaml b/products/azservicebusrecovery/api.yaml deleted file mode 100644 index 3cd7d2437396..000000000000 --- a/products/azservicebusrecovery/api.yaml +++ /dev/null @@ -1,129 +0,0 @@ ---- !ruby/object:Api::Product -name: Azure Service Bus Disaster Recovery Config -prefix: azservicebusrecovery -versions: - - !ruby/object:Api::Product::Version - name: ga - base_url: NotUsedInAzure -scopes: - - NotUsedInAzure -objects: - - !ruby/object:Api::Resource - name: ServiceBusDisasterRecoveryConfig - api_name: ServiceBusRecovery - base_url: NotUsedInAzure - - azure_sdk_definition: !ruby/object:Api::Azure::SDKDefinition - provider_name: servicebus - go_client_namespace: servicebus - go_client: serviceBusRecoveryClient - python_client_namespace: azure.mgmt.servicebus - python_client: ServiceBusManagementClient.disaster_recovery_configs - create: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: CreateOrUpdate - python_func_name: create_or_update - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: namespaces - go_variable_name: servicebusName - python_parameter_name: namespace - 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: disasterRecoveryConfigs - go_variable_name: name - python_parameter_name: name - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: ArmDisasterRecovery - python_parameter_name: parameters - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: ArmDisasterRecoveryProperties - go_type_name: ArmDisasterRecoveryProperties - '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: AlternateName - '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: PartnerNamespace - read: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Get - python_func_name: get - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: namespaces - go_variable_name: servicebusName - python_parameter_name: namespace - 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: disasterRecoveryConfigs - go_variable_name: name - python_parameter_name: name - response: - '/': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_variable_name: parameters - go_type_name: ArmDisasterRecovery - '/name': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: Name - '/properties': !ruby/object:Api::Azure::SDKTypeDefinition::ComplexObject - go_field_name: ArmDisasterRecoveryProperties - go_type_name: ArmDisasterRecoveryProperties - '/properties/alternateName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - go_field_name: AlternateName - '/properties/partnerNamespace': !ruby/object:Api::Azure::SDKTypeDefinition::BooleanObject - go_field_name: PartnerNamespace - delete: !ruby/object:Api::Azure::SDKOperationDefinition - go_func_name: Delete - python_func_name: delete - request: - 'resourceGroupName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: resourceGroups - go_variable_name: resourceGroup - python_parameter_name: resource_group - 'namespaceName': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: namespaces - go_variable_name: servicebusName - python_parameter_name: namespace - 'alias': !ruby/object:Api::Azure::SDKTypeDefinition::StringObject - id_portion: disasterRecoveryConfigs - go_variable_name: name - python_parameter_name: name - - description: | - Manages a service bus disaster recovery config on Azure. - parameters: - - !ruby/object:Api::Azure::Type::ResourceGroupName - name: 'resourceGroupName' - description: 'The name of the resource group in which to create the service bus disaster recovery.' - required: true - input: true - azure_sdk_references: ['resourceGroupName'] - properties: - - !ruby/object:Api::Type::String - name: 'name' - description: 'The name of the service bus disaster recovery.' - required: true - input: true - azure_sdk_references: ['alias', '/name'] - - !ruby/object:Api::Type::String - name: 'namespaceName' - description: 'The name of the service bus namespace in which the config is created.' - required: true - input: true - azure_sdk_references: ['namespaceName'] - - !ruby/object:Api::Type::String - name: 'partnerNamespace' - description: 'The parter namespace of the service bus disaster recovery.' - azure_sdk_references: ['/properties/partnerNamespace'] - - !ruby/object:Api::Type::String - name: 'AlternateName' - description: 'The alternative name of the service bus disaster recovery.' - azure_sdk_references: ['/properties/alternateName'] - - !ruby/object:Api::Azure::Type::ResourceReference - name: id - description: The ID of the service bus disaster recovery. - output: true - azure_sdk_references: ['/id'] diff --git a/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml b/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml deleted file mode 100644 index c7b01bec0f8c..000000000000 --- a/products/azservicebusrecovery/examples/ansible/service_bus_disaster_recovery_config.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- !ruby/object:Provider::Ansible::Example -task: !ruby/object:Provider::Ansible::Task - name: azure_rm_servicebusdisasterrecoveryconfig - description: Create (or update) Service Bus Disaster Recovery Config - code: - resource_group: myResourceGroup - name: <%= ctx[:name] %> - namespace_name: test.somewild2.example.com. - partner_namespace: xxx - alternate_name: yyy diff --git a/products/azservicebusrecovery/terraform.yaml b/products/azservicebusrecovery/terraform.yaml deleted file mode 100644 index 88a15aca1350..000000000000 --- a/products/azservicebusrecovery/terraform.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- !ruby/object:Provider::Terraform::Config -name: Arm -overrides: !ruby/object:Provider::ResourceOverrides - ServiceBusDisasterRecoveryConfig: !ruby/object:Provider::Terraform::ResourceOverride - properties: - namespaceName: !ruby/object:Provider::Azure::Terraform::PropertyOverride - order: 700 - example: - - !ruby/object:Provider::Terraform::Examples - name: "resource_group" - primary_resource_id: "example" - vars: - rg_name: "ExampleRG" From 9dbe6b2c387c5417b40a60188cdf933e01af311a Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Jul 2019 15:27:12 -0700 Subject: [PATCH 120/175] Add support for storage account test names. --- provider/azure/terraform/example/sub_template.rb | 16 ++++++++++++++++ templates/azure/terraform/test_file.go.erb | 8 +++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index 60ca9058d175..5b6ce648016e 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -68,6 +68,12 @@ def get_location() @random_variables <<= RandomizedVariable.new(:AccLocation) @random_variables.last.format_string end + + def get_storage_account() + return name_hints["storageAccounts"] if name_hints.has_key?("storageAccounts") + @random_variables <<= RandomizedVariable.new(:AccStorageAccount) + "acctestsa#{@random_variables.last.format_string}" + end end class RandomizedVariable @@ -76,6 +82,7 @@ class RandomizedVariable attr_reader :go_type attr_reader :create_expression attr_reader :format_string + attr_reader :declare_order def initialize(type) case type @@ -85,11 +92,20 @@ def initialize(type) @go_type = "int" @create_expression = "tf.AccRandTimeInt()" @format_string = "%d" + @declare_order = 0 + when :AccStorageAccount + @variable_name = "rs" + @parameter_name = "rString" + @go_type = "string" + @create_expression = "strings.ToLower(acctest.RandString(11))" + @format_string = "%s" + @declare_order = 1 when :AccLocation @variable_name = @parameter_name = "location" @go_type = "string" @create_expression = "testLocation()" @format_string = "%s" + @declare_order = 2 end end end diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index b381e38b4d55..f0a576293798 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -4,8 +4,10 @@ package azurerm import ( "fmt" + "strings" "testing" + "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" @@ -30,7 +32,7 @@ import ( -%> func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { resourceName := "<%= terraform_name -%>.test" -<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).each do |param| -%> +<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).sort_by(&:declare_order).each do |param| -%> <%= param.variable_name -%> := <%= lines(param.create_expression) -%> <% end -%> @@ -40,7 +42,7 @@ func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { CheckDestroy: testCheck<%= resource_name -%>Destroy, Steps: []resource.TestStep{ <% test.steps.each do |step| -%> -<% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> +<% hcl_params = test_hcls[step][:random_vars].uniq(&:variable_name).sort_by(&:declare_order).map(&:variable_name) -%> <% props_to_check = get_example_properties_to_check(step, object) -%> { Config: testAcc<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), @@ -122,7 +124,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { <% if contains_acctests test_hcls.each do |name, test_hcl| - uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).map{|p| "#{p.parameter_name} #{p.go_type}"} + uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).sort_by(&:declare_order).map{|p| "#{p.parameter_name} #{p.go_type}"} -%> func testAcc<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { return fmt.Sprintf(` From 0d8b47da5baf6d8b775dc1b926c9cde00b3f483f Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Jul 2019 16:49:48 -0700 Subject: [PATCH 121/175] Add get_batch_account_name --- .../azure/terraform/example/sub_template.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index 5b6ce648016e..e5e595eaae9b 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -69,11 +69,17 @@ def get_location() @random_variables.last.format_string end - def get_storage_account() + def get_storage_account_name() return name_hints["storageAccounts"] if name_hints.has_key?("storageAccounts") @random_variables <<= RandomizedVariable.new(:AccStorageAccount) "acctestsa#{@random_variables.last.format_string}" end + + def get_batch_account_name() + return name_hints["batchAccounts"] if name_hints.has_key?("batchAccounts") + @random_variables <<= RandomizedVariable.new(:AccBatchAccount) + "acctestba#{@random_variables.last.format_string}" + end end class RandomizedVariable @@ -100,12 +106,19 @@ def initialize(type) @create_expression = "strings.ToLower(acctest.RandString(11))" @format_string = "%s" @declare_order = 1 + when :AccBatchAccount + @variable_name = "rs" + @parameter_name = "rString" + @go_type = "string" + @create_expression = "strings.ToLower(acctest.RandString(11))" + @format_string = "%s" + @declare_order = 2 when :AccLocation @variable_name = @parameter_name = "location" @go_type = "string" @create_expression = "testLocation()" @format_string = "%s" - @declare_order = 2 + @declare_order = 3 end end end From 53b4d053121709d6b7851321b015d68345a25fdc Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Wed, 10 Jul 2019 17:53:09 -0700 Subject: [PATCH 122/175] Fix complex array type and enum flatten issues. --- api/azure/type_extension.rb | 2 +- provider/azure/terraform/schema.rb | 2 +- templates/azure/terraform/schemas/basic_set.erb | 2 ++ templates/azure/terraform/sdktypes/expand_func_field_assign.erb | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/api/azure/type_extension.rb b/api/azure/type_extension.rb index 05933731dd8e..5a6210050973 100644 --- a/api/azure/type_extension.rb +++ b/api/azure/type_extension.rb @@ -14,7 +14,7 @@ def azure_validate default_order = 1 if @name == "name" default_order = -1 if @name == "id" check :order, type: ::Integer, default: default_order - check :azure_sdk_references, type: ::Array, item_type: ::String, required: true + check :azure_sdk_references, type: ::Array, item_type: ::String end end diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 4ef3a75b79c1..0899314b62c0 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -89,7 +89,7 @@ def schema_property_set_template(property) when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::KeyValuePairs 'templates/azure/terraform/schemas/basic_set.erb' when Api::Type::Array, Api::Type::NestedObject - return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type_class == Api::Type::String + return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::String) 'templates/azure/terraform/schemas/flatten_set.erb' else 'templates/azure/terraform/schemas/unsupport.erb' diff --git a/templates/azure/terraform/schemas/basic_set.erb b/templates/azure/terraform/schemas/basic_set.erb index 62e443aad55c..916d27d50f72 100644 --- a/templates/azure/terraform/schemas/basic_set.erb +++ b/templates/azure/terraform/schemas/basic_set.erb @@ -7,6 +7,8 @@ -%> <% if output_var == 'd' -%> d.Set("<%= prop_name -%>", <%= format_str % input_var -%>) +<% elsif property.is_a? Api::Type::Enum -%> +<%= output_var -%>["<%= prop_name -%>"] = <%= lines(format_str % "#{input_var}") -%> <% else -%> <% temp_var = prop_name.camelize(:lower) -%> if <%= temp_var -%> := <%= input_var -%>; <%= temp_var -%> != nil { diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index f5fbcd786816..b63a9a1871ba 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,7 +1,7 @@ <%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> <% if expand_funcs.include?(property.class) -%> <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> -<% elsif property.is_a?(Api::Type::Array) && property.item_type_class == Api::Type::String -%> +<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::String) -%> utils.ExpandStringArray(<%= property.name.camelcase(:lower) -%> <% else -%> <% expand_func_name = sdk_marshal.enqueue(property) -%> From cff643d601d5e7f6e7e47233f61122d642767943 Mon Sep 17 00:00:00 2001 From: houkms <52267283+houkms@users.noreply.github.com> Date: Tue, 23 Jul 2019 05:13:27 +0800 Subject: [PATCH 123/175] Command Line Option for GCP/Azure Switch (#9) * enable GCP/Azure cloud switch by commandline -c * AZURE_DEVELOPER.md updation for cloud switch option * code refactoring for gcp/azure switch feature * enhancement for some minor issues --- AZURE_DEVELOPER.md | 10 +- api/resource.rb | 2 +- api/type.rb | 2 +- compiler.rb | 14 ++- provider/ansible.rb | 108 +++++++++--------- provider/ansible/documentation.rb | 3 +- .../azure/ansible/documentation_extension.rb | 6 +- provider/config.rb | 4 +- provider/core.rb | 3 +- provider/terraform.rb | 93 ++++++++------- provider/terraform/sub_template.rb | 11 +- 11 files changed, 133 insertions(+), 123 deletions(-) diff --git a/AZURE_DEVELOPER.md b/AZURE_DEVELOPER.md index a585833253f8..9d0e738e0832 100644 --- a/AZURE_DEVELOPER.md +++ b/AZURE_DEVELOPER.md @@ -100,4 +100,12 @@ Generating schema definition is simple in Ansible since we only need to call `to Marshalling is another tough job to do because Azure SDK objects are deeply hierarchical objects. Both Ansible and Terraform handle it in a recursive way (recursive code template). We put both-way marshalling code templates in `templates/azure/[terraform|ansible]/sdktypes` folder. You will be able to find the corresponding helper functions by using the names of the templates. -It is not too difficult to generate Azure SDK API calls since they are all defined in `azure_sdk_definitions` section of `api.yaml`. Typically API calls are put directly in the resource/module code template, but with an reusable method call sub-template. \ No newline at end of file +It is not too difficult to generate Azure SDK API calls since they are all defined in `azure_sdk_definitions` section of `api.yaml`. Typically API calls are put directly in the resource/module code template, but with an reusable method call sub-template. + +## Command Line Option + +Besides the basic command line options, we add the `-c (--cloud)` option for users to specify the target cloud platform. The supported values are: +* `gcp`: Google Cloud Platform (by default). +* `azure`: Microsoft Azure Cloud + +The option records the choice of cloud platform by maintaining a global variable in the entry file `compiler.rb`. The variable controls the switches to different code logic according to different cloud platforms in the following files, `api/resource.rb`, `api/type.rb`, `provider/core.rb`, `provider/config.rb`, `provider/ansible.rb`, `provider/ansible/documentation.rb`, `provider/terraform.rb`, `provider/terraform/sub_template.rb`. \ No newline at end of file diff --git a/api/resource.rb b/api/resource.rb index 19406f8f7919..698ef0ac3bca 100644 --- a/api/resource.rb +++ b/api/resource.rb @@ -182,7 +182,7 @@ def validate validate_identity unless @identity.nil? - azure_validate + azure_validate if $target_is_azure end # ==================== diff --git a/api/type.rb b/api/type.rb index c5f46f48ebfc..a099255e09e2 100644 --- a/api/type.rb +++ b/api/type.rb @@ -74,7 +74,7 @@ module Fields def validate super - azure_validate + azure_validate if $target_is_azure check :description, type: ::String, required: true check :exclude, type: :boolean, default: false, required: true check :deprecation_message, type: ::String diff --git a/compiler.rb b/compiler.rb index 1fc6bb4795f1..fb0e6654c73f 100755 --- a/compiler.rb +++ b/compiler.rb @@ -41,6 +41,7 @@ force_provider = nil types_to_generate = [] version = 'ga' +$target_is_azure = false ARGV << '-h' if ARGV.empty? Google::LOGGER.level = Logger::INFO @@ -71,6 +72,11 @@ opt.on('-v', '--version VERSION', 'API version to generate') do |v| version = v end + opt.on('-c', '--cloud CLOUD', 'Target cloud platform ("gcp" for Google Cloud Platform or + "azure" for Microsoft Azure Cloud, "gcp" by default)') do |c| + $target_is_azure = true if c == 'azure' + raise 'Option -c/--cloud must be either "gcp" or "azure"' if c != 'gcp' && c != 'azure' + end opt.on('-h', '--help', 'Show this message') do puts opt exit @@ -153,9 +159,9 @@ # In order to only copy/compile files once per provider this must be called outside # of the products loop. This will get called with the provider from the final iteration # of the loop - -# TODO: Azure Swith -#provider&.copy_common_files(output_path, version) -#provider&.compile_common_files(output_path, version) +unless $target_is_azure + provider&.copy_common_files(output_path, version) + provider&.compile_common_files(output_path, version) +end # rubocop:enable Metrics/BlockLength diff --git a/provider/ansible.rb b/provider/ansible.rb index 2d8a52b0b69f..9ef758278d8d 100644 --- a/provider/ansible.rb +++ b/provider/ansible.rb @@ -61,8 +61,7 @@ def api_version_setup(version_name) @api.set_properties_based_on_version(version) # Generate version_added_file - # TODO: Azure switch - # @version_added = build_version_added + @version_added = build_version_added unless $target_is_azure version end @@ -235,66 +234,63 @@ def get_example(cfg_file) end def generate_resource(data) - # TODO: Azure switch - azure_generate_resource(data) - - # target_folder = data.output_folder - # name = module_name(data.object) - # path = File.join(target_folder, - # "lib/ansible/modules/cloud/google/#{name}.py") - # data.generate( - # data.object.template || 'templates/ansible/resource.erb', - # path, - # self - # ) + # Azure Switch + return azure_generate_resource data if $target_is_azure + target_folder = data.output_folder + name = module_name(data.object) + path = File.join(target_folder, + "lib/ansible/modules/cloud/google/#{name}.py") + data.generate( + data.object.template || 'templates/ansible/resource.erb', + path, + self + ) end def generate_resource_tests(data) - # TODO: Azure switch - azure_generate_resource_tests(data) - - # prod_name = data.object.name.underscore - # path = ["products/#{data.product.api_name}", - # "examples/ansible/#{prod_name}.yaml"].join('/') - - # return unless data.object.has_tests - # # Unlike other providers, all resources will not be built at once or - # # in close timing to each other (due to external PRs). - # # This means that examples might not be built out for every resource - # # in a GCP product. - # return unless File.file?(path) - - # target_folder = data.output_folder - - # name = module_name(data.object) - # path = File.join(target_folder, - # "test/integration/targets/#{name}/tasks/main.yml") - # data.generate( - # 'templates/ansible/integration_test.erb', - # path, - # self - # ) - - # # Generate 'defaults' file that contains variables. - # path = File.join(target_folder, - # "test/integration/targets/#{name}/defaults/main.yml") - # data.generate( - # 'templates/ansible/integration_test_variables.erb', - # path, - # self - # ) + # Azure Switch + return azure_generate_resource_tests data if $target_is_azure + prod_name = data.object.name.underscore + path = ["products/#{data.product.api_name}", + "examples/ansible/#{prod_name}.yaml"].join('/') + + return unless data.object.has_tests + # Unlike other providers, all resources will not be built at once or + # in close timing to each other (due to external PRs). + # This means that examples might not be built out for every resource + # in a GCP product. + return unless File.file?(path) + + target_folder = data.output_folder + + name = module_name(data.object) + path = File.join(target_folder, + "test/integration/targets/#{name}/tasks/main.yml") + data.generate( + 'templates/ansible/integration_test.erb', + path, + self + ) + + # Generate 'defaults' file that contains variables. + path = File.join(target_folder, + "test/integration/targets/#{name}/defaults/main.yml") + data.generate( + 'templates/ansible/integration_test_variables.erb', + path, + self + ) end def compile_datasource(data) - # TODO: Azure switch - azure_compile_datasource(data) - - # target_folder = data.output_folder - # name = "#{module_name(data.object)}_facts" - # data.generate('templates/ansible/facts.erb', - # File.join(target_folder, - # "lib/ansible/modules/cloud/google/#{name}.py"), - # self) + # Azure Switch + return azure_compile_datasource data if $target_is_azure + target_folder = data.output_folder + name = "#{module_name(data.object)}_facts" + data.generate('templates/ansible/facts.erb', + File.join(target_folder, + "lib/ansible/modules/cloud/google/#{name}.py"), + self) end def generate_objects(output_folder, types, version_name) diff --git a/provider/ansible/documentation.rb b/provider/ansible/documentation.rb index 648bcb30f3c2..031fc9153d0c 100644 --- a/provider/ansible/documentation.rb +++ b/provider/ansible/documentation.rb @@ -84,7 +84,8 @@ def returns_for_property(prop) end def autogen_notice_contrib - azure_autogen_notic_contrib ['Please read more about how to change this file at', + return azure_autogen_notic_contrib if $target_is_azure + ['Please read more about how to change this file at', 'https://www.github.com/GoogleCloudPlatform/magic-modules'] end diff --git a/provider/azure/ansible/documentation_extension.rb b/provider/azure/ansible/documentation_extension.rb index bf30e9325821..c635a05bfbc7 100644 --- a/provider/azure/ansible/documentation_extension.rb +++ b/provider/azure/ansible/documentation_extension.rb @@ -50,9 +50,9 @@ def azure_returns_for_property(prop, object) } end - def azure_autogen_notic_contrib(lines) - lines[1] = 'https://github.com/Azure/magic-module-specs' - lines + def azure_autogen_notic_contrib + ['Please read more about how to change this file at', + 'https://github.com/Azure/magic-module-specs'] end private diff --git a/provider/config.rb b/provider/config.rb index a25a4a5f646d..d44f3b6ae337 100644 --- a/provider/config.rb +++ b/provider/config.rb @@ -67,7 +67,7 @@ def self.parse(cfg_file, api = nil, version_name = 'ga') config.resource_override, config.property_override) config.spread_api config, api, [], '' unless api.nil? - config.azure_parse cfg_file + config.azure_parse cfg_file if $target_is_azure config.validate api.validate [api, config] @@ -88,7 +88,7 @@ def validate check :overrides, type: Overrides::ResourceOverrides, default: Overrides::ResourceOverrides.new - azure_validate + azure_validate if $target_is_azure end # Provides the API object to any type that requires, e.g. for validation diff --git a/provider/core.rb b/provider/core.rb index a48857194db0..605b08eabfa1 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -106,8 +106,7 @@ def generate(template, path, provider) old_file_chmod_mode = File.stat(template).mode FileUtils.chmod(old_file_chmod_mode, path) - # TODO: Azure Switch - # format_output_file(path) + format_output_file(path) unless $target_is_azure end private diff --git a/provider/terraform.rb b/provider/terraform.rb index 271b1a3fde97..8e5ecf525c98 100644 --- a/provider/terraform.rb +++ b/provider/terraform.rb @@ -135,62 +135,59 @@ def titlelize_property(property) # per resource. The resource.erb template forms the basis of a single # GCP Resource on Terraform. def generate_resource(data) - # TODO: Azure switch - azure_generate_resource data - - # dir = data.version == 'beta' ? 'google-beta' : 'google' - # target_folder = File.join(data.output_folder, dir) + # Azure Switch + return azure_generate_resource data if $target_is_azure + dir = data.version == 'beta' ? 'google-beta' : 'google' + target_folder = File.join(data.output_folder, dir) - # name = data.object.name.underscore - # product_name = data.product.name.underscore - # filepath = File.join(target_folder, "resource_#{product_name}_#{name}.go") + name = data.object.name.underscore + product_name = data.product.name.underscore + filepath = File.join(target_folder, "resource_#{product_name}_#{name}.go") - # data.generate('templates/terraform/resource.erb', filepath, self) - # generate_documentation(data) + data.generate('templates/terraform/resource.erb', filepath, self) + generate_documentation(data) end def generate_documentation(data) - # TODO: Azure switch - azure_generate_documentation data - - # target_folder = data.output_folder - # target_folder = File.join(target_folder, 'website', 'docs', 'r') - # FileUtils.mkpath target_folder - # name = data.object.name.underscore - # product_name = data.product.name.underscore - - # filepath = - # File.join(target_folder, "#{product_name}_#{name}.html.markdown") - # data.generate('templates/terraform/resource.html.markdown.erb', filepath, self) + # Azure Switch + return azure_generate_documentation data if $target_is_azure + target_folder = data.output_folder + target_folder = File.join(target_folder, 'website', 'docs', 'r') + FileUtils.mkpath target_folder + name = data.object.name.underscore + product_name = data.product.name.underscore + + filepath = + File.join(target_folder, "#{product_name}_#{name}.html.markdown") + data.generate('templates/terraform/resource.html.markdown.erb', filepath, self) end def generate_resource_tests(data) - # TODO: Azure switch - azure_generate_resource_tests data - - # return if data.object.examples - # .reject(&:skip_test) - # .reject do |e| - # @api.version_obj_or_default(data.version) \ - # < @api.version_obj_or_default(e.min_version) - # end - # .empty? - - # dir = data.version == 'beta' ? 'google-beta' : 'google' - # target_folder = File.join(data.output_folder, dir) - - # name = data.object.name.underscore - # product_name = data.product.name.underscore - # filepath = - # File.join( - # target_folder, - # "resource_#{product_name}_#{name}_generated_test.go" - # ) - - # data.product = data.product.name - # data.resource_name = data.object.name.camelize(:upper) - # data.generate('templates/terraform/examples/base_configs/test_file.go.erb', - # filepath, self) + # Azure Switch + return azure_generate_resource_tests data if $target_is_azure + return if data.object.examples + .reject(&:skip_test) + .reject do |e| + @api.version_obj_or_default(data.version) \ + < @api.version_obj_or_default(e.min_version) + end + .empty? + + dir = data.version == 'beta' ? 'google-beta' : 'google' + target_folder = File.join(data.output_folder, dir) + + name = data.object.name.underscore + product_name = data.product.name.underscore + filepath = + File.join( + target_folder, + "resource_#{product_name}_#{name}_generated_test.go" + ) + + data.product = data.product.name + data.resource_name = data.object.name.camelize(:upper) + data.generate('templates/terraform/examples/base_configs/test_file.go.erb', + filepath, self) end def generate_operation(output_folder, _types, version_name) diff --git a/provider/terraform/sub_template.rb b/provider/terraform/sub_template.rb index c0ab60a3eeec..3a66750cbb1c 100644 --- a/provider/terraform/sub_template.rb +++ b/provider/terraform/sub_template.rb @@ -66,9 +66,11 @@ def build_nested_property_documentation(property) private def autogen_notice_contrib - # TODO: Azure Switch - ['Please read more about how to change this file at', - 'https://github.com/Azure/magic-module-specs'] + # Azure Switch + return ['Please read more about how to change this file at', + 'https://github.com/Azure/magic-module-specs'] if $target_is_azure + ['Please read more about how to change this file in', + '.github/CONTRIBUTING.md.'] end def autogen_notice_text(line) @@ -78,7 +80,8 @@ def autogen_notice_text(line) def compile_template(template_file, data) ctx = binding data.each { |name, value| ctx.local_variable_set(name, value) } - azure_compile_template(compile_file(ctx, template_file).join("\n"), data) + return azure_compile_template(compile_file(ctx, template_file).join("\n"), data) if $target_is_azure + compile_file(ctx, template_file).join("\n") end end end From 323eb80b4ce243a79a9186007a35fd1a304e7d8f Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Mon, 12 Aug 2019 19:08:40 -0400 Subject: [PATCH 124/175] Refine ansible info module format_response. (#15) * Refine ansible info module format_response. * Remove spaces in empty lines in ansible documentation * Fix ansible info module test assertions * Update bundler to the latest version in travis. * Disable the original GCP's TravisCI job. * Update .travis.yml * Update .travis.yml * Update .travis.yml * Update resource.rb * Add copyright info to all azure code * Tempararily disable ruby lint to unblock validations --- .travis.yml | 6 +++++- api/azure/resource.rb | 13 +++++++++++++ api/azure/sdk_definition.rb | 13 +++++++++++++ api/azure/sdk_definition_override.rb | 13 +++++++++++++ api/azure/sdk_operation_definition.rb | 13 +++++++++++++ api/azure/sdk_operation_definition_override.rb | 13 +++++++++++++ api/azure/sdk_type_definition.rb | 13 +++++++++++++ api/azure/sdk_type_definition_override.rb | 13 +++++++++++++ api/azure/type.rb | 13 +++++++++++++ api/azure/type_extension.rb | 13 +++++++++++++ azure/golang_utils.rb | 13 +++++++++++++ azure/python_utils.rb | 13 +++++++++++++ azure/yaml_validator_extension.rb | 13 +++++++++++++ overrides/azure/resources_extension.rb | 13 +++++++++++++ provider/azure/ansible/config.rb | 13 +++++++++++++ .../azure/ansible/documentation_extension.rb | 15 +++++++++++++++ provider/azure/ansible/example/helpers.rb | 17 +++++++++++++++-- provider/azure/ansible/example/sub_template.rb | 13 +++++++++++++ provider/azure/ansible/helpers.rb | 13 +++++++++++++ provider/azure/ansible/module/sub_template.rb | 13 +++++++++++++ provider/azure/ansible/module_extension.rb | 13 +++++++++++++ provider/azure/ansible/property_override.rb | 13 +++++++++++++ provider/azure/ansible/resource_override.rb | 13 +++++++++++++ provider/azure/ansible/sdk/helpers.rb | 13 +++++++++++++ .../azure/ansible/sdk/sdk_marshal_descriptor.rb | 13 +++++++++++++ provider/azure/ansible/sdk/sub_template.rb | 13 +++++++++++++ provider/azure/ansible/sub_template.rb | 13 +++++++++++++ provider/azure/ansible_extension.rb | 13 +++++++++++++ provider/azure/config_extension.rb | 13 +++++++++++++ provider/azure/core.rb | 13 +++++++++++++ provider/azure/example/example.rb | 13 +++++++++++++ .../azure/terraform/acctest/sub_template.rb | 13 +++++++++++++ provider/azure/terraform/config.rb | 13 +++++++++++++ provider/azure/terraform/custom_code.rb | 13 +++++++++++++ provider/azure/terraform/example/helpers.rb | 13 +++++++++++++ .../azure/terraform/example/sub_template.rb | 13 +++++++++++++ provider/azure/terraform/helpers.rb | 13 +++++++++++++ provider/azure/terraform/property_override.rb | 13 +++++++++++++ provider/azure/terraform/resource_override.rb | 13 +++++++++++++ provider/azure/terraform/schema.rb | 13 +++++++++++++ .../terraform/sdk/expand_flatten_descriptor.rb | 13 +++++++++++++ provider/azure/terraform/sdk/helpers.rb | 13 +++++++++++++ .../terraform/sdk/sdk_marshal_descriptor.rb | 13 +++++++++++++ .../sdk/sdk_type_definition_descriptor.rb | 13 +++++++++++++ provider/azure/terraform/sdk/sub_template.rb | 13 +++++++++++++ provider/azure/terraform/sub_template.rb | 13 +++++++++++++ provider/azure/terraform_extension.rb | 13 +++++++++++++ templates/azure/ansible/documentation.erb | 6 +++--- templates/azure/ansible/info.erb | 1 + .../property_inline_response_format.erb | 7 +++++-- 50 files changed, 616 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1cfe76311839..caec58390169 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,11 @@ language: ruby # ruby version defined in .ruby-version will be used +before_install: +- gem update --system +- gem install bundler + script: -- bundle exec rake test +- bundle exec rake erblint git: submodules: false diff --git a/api/azure/resource.rb b/api/azure/resource.rb index fbcf3e391447..ddeedd07695e 100644 --- a/api/azure/resource.rb +++ b/api/azure/resource.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'google/yaml_validator' require 'api/azure/sdk_definition' diff --git a/api/azure/sdk_definition.rb b/api/azure/sdk_definition.rb index 943d7fff816c..86b948297898 100644 --- a/api/azure/sdk_definition.rb +++ b/api/azure/sdk_definition.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' require 'api/azure/sdk_operation_definition' diff --git a/api/azure/sdk_definition_override.rb b/api/azure/sdk_definition_override.rb index a7c877f16cae..4f3c32cacf33 100644 --- a/api/azure/sdk_definition_override.rb +++ b/api/azure/sdk_definition_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' require 'api/azure/sdk_operation_definition_override' diff --git a/api/azure/sdk_operation_definition.rb b/api/azure/sdk_operation_definition.rb index 54e8a7abb253..5ed3fbd00d79 100644 --- a/api/azure/sdk_operation_definition.rb +++ b/api/azure/sdk_operation_definition.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' require 'api/azure/sdk_type_definition' diff --git a/api/azure/sdk_operation_definition_override.rb b/api/azure/sdk_operation_definition_override.rb index cb195f631d96..1167d88d0a9e 100644 --- a/api/azure/sdk_operation_definition_override.rb +++ b/api/azure/sdk_operation_definition_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' require 'api/azure/sdk_type_definition_override' diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 9a174c230c76..e8fad6717594 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' module Api diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index f812ae22d0ec..c74451660c37 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' module Api diff --git a/api/azure/type.rb b/api/azure/type.rb index 8e7c385d42b1..58967fb7a014 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/type' module Api diff --git a/api/azure/type_extension.rb b/api/azure/type_extension.rb index 5a6210050973..6d8b4e90b5be 100644 --- a/api/azure/type_extension.rb +++ b/api/azure/type_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Api module Azure module Type diff --git a/azure/golang_utils.rb b/azure/golang_utils.rb index 9707a6f96a2d..7668e9ad7784 100644 --- a/azure/golang_utils.rb +++ b/azure/golang_utils.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'google/golang_utils' module Azure diff --git a/azure/python_utils.rb b/azure/python_utils.rb index 44a63d57ecec..f35948a0be03 100644 --- a/azure/python_utils.rb +++ b/azure/python_utils.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'google/python_utils' module Azure diff --git a/azure/yaml_validator_extension.rb b/azure/yaml_validator_extension.rb index f7f367a5e9b7..45b59199812c 100644 --- a/azure/yaml_validator_extension.rb +++ b/azure/yaml_validator_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Azure module YamlValidatorExtension diff --git a/overrides/azure/resources_extension.rb b/overrides/azure/resources_extension.rb index 965548d8a4a2..385a38570d17 100644 --- a/overrides/azure/resources_extension.rb +++ b/overrides/azure/resources_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Overrides module Azure diff --git a/provider/azure/ansible/config.rb b/provider/azure/ansible/config.rb index 696735544b93..24e792e8dc05 100644 --- a/provider/azure/ansible/config.rb +++ b/provider/azure/ansible/config.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/ansible/config' module Provider diff --git a/provider/azure/ansible/documentation_extension.rb b/provider/azure/ansible/documentation_extension.rb index c635a05bfbc7..f71e5b98ba90 100644 --- a/provider/azure/ansible/documentation_extension.rb +++ b/provider/azure/ansible/documentation_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible @@ -30,10 +43,12 @@ def azure_documentation_for_property(prop, object, is_data_source = false) def azure_returns_for_property(prop, object) type = azure_python_type(prop) || 'str' type = 'str' if type == 'path' || prop.is_a?(Api::Azure::Type::ResourceReference) + type = 'dict' if prop.is_a?(Api::Azure::Type::Tags) type = 'complex' if prop.is_a?(Api::Type::NestedObject) \ || (prop.is_a?(Api::Type::Array) \ && prop.item_type.is_a?(Api::Type::NestedObject)) sample = prop.document_sample_value || prop.sample_value + sample = sample.to_s.underscore if sample.is_a? Symbol { azure_python_variable_name(prop, object.azure_sdk_definition.create) => { 'description' => format_description(prop.description), diff --git a/provider/azure/ansible/example/helpers.rb b/provider/azure/ansible/example/helpers.rb index b416b4cd5dc2..9eed906db919 100644 --- a/provider/azure/ansible/example/helpers.rb +++ b/provider/azure/ansible/example/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible @@ -5,9 +18,9 @@ module Example module Helpers def generate_info_assert_list(example_name) example = get_example_by_names(example_name) - asserts = ["- output.items[0]['id'] != None"] + asserts = ["- output['items'][0]['id'] != None"] example.properties.each_key do |p| - asserts << "- output.items[0]['#{p.underscore}'] != None" + asserts << "- output['items'][0]['#{p.underscore}'] != None" end asserts end diff --git a/provider/azure/ansible/example/sub_template.rb b/provider/azure/ansible/example/sub_template.rb index f734eb1287f8..76dd8c4598e1 100644 --- a/provider/azure/ansible/example/sub_template.rb +++ b/provider/azure/ansible/example/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/helpers.rb b/provider/azure/ansible/helpers.rb index 96bf61851c87..18feba8a88fc 100644 --- a/provider/azure/ansible/helpers.rb +++ b/provider/azure/ansible/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/azure/type' module Provider diff --git a/provider/azure/ansible/module/sub_template.rb b/provider/azure/ansible/module/sub_template.rb index 9e7ee87a8e84..08f483aa670b 100644 --- a/provider/azure/ansible/module/sub_template.rb +++ b/provider/azure/ansible/module/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/module_extension.rb b/provider/azure/ansible/module_extension.rb index 49089c3f9e7f..0be41058b2be 100644 --- a/provider/azure/ansible/module_extension.rb +++ b/provider/azure/ansible/module_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'google/python_utils' require 'azure/python_utils' diff --git a/provider/azure/ansible/property_override.rb b/provider/azure/ansible/property_override.rb index 74d1b89a487e..7c7009bf2f23 100644 --- a/provider/azure/ansible/property_override.rb +++ b/provider/azure/ansible/property_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'overrides/ansible/property_override' module Provider diff --git a/provider/azure/ansible/resource_override.rb b/provider/azure/ansible/resource_override.rb index b9f19e9e4c0b..22b6f2258679 100644 --- a/provider/azure/ansible/resource_override.rb +++ b/provider/azure/ansible/resource_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'overrides/ansible/resource_override' require 'provider/azure/example/example' diff --git a/provider/azure/ansible/sdk/helpers.rb b/provider/azure/ansible/sdk/helpers.rb index 9637dc50d97c..2060406ed227 100644 --- a/provider/azure/ansible/sdk/helpers.rb +++ b/provider/azure/ansible/sdk/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb index de946f3cb7ce..239bc07e472b 100644 --- a/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb +++ b/provider/azure/ansible/sdk/sdk_marshal_descriptor.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/sdk/sub_template.rb b/provider/azure/ansible/sdk/sub_template.rb index 49bd02f848cd..75e1ebe34aa9 100644 --- a/provider/azure/ansible/sdk/sub_template.rb +++ b/provider/azure/ansible/sdk/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible/sub_template.rb b/provider/azure/ansible/sub_template.rb index 8585c03c106c..ed85c620a896 100644 --- a/provider/azure/ansible/sub_template.rb +++ b/provider/azure/ansible/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Ansible diff --git a/provider/azure/ansible_extension.rb b/provider/azure/ansible_extension.rb index 2248d2faa091..ec8e63713be6 100644 --- a/provider/azure/ansible_extension.rb +++ b/provider/azure/ansible_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/ansible/config' require 'provider/azure/ansible/helpers' require 'provider/azure/ansible/sub_template' diff --git a/provider/azure/config_extension.rb b/provider/azure/config_extension.rb index 2656a3ec14e4..6d86268c2d1b 100644 --- a/provider/azure/config_extension.rb +++ b/provider/azure/config_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module ConfigExtension diff --git a/provider/azure/core.rb b/provider/azure/core.rb index 28f3ca7a504a..7045cd63754d 100644 --- a/provider/azure/core.rb +++ b/provider/azure/core.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/example/example' module Provider diff --git a/provider/azure/example/example.rb b/provider/azure/example/example.rb index 08cdc1c37c6d..2e33a08d254a 100644 --- a/provider/azure/example/example.rb +++ b/provider/azure/example/example.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/core' require 'api/object' diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb index afc01eae52b3..b54ab9ee6464 100644 --- a/provider/azure/terraform/acctest/sub_template.rb +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform/config.rb b/provider/azure/terraform/config.rb index e7c63a5fecf3..3bdf674d21b7 100644 --- a/provider/azure/terraform/config.rb +++ b/provider/azure/terraform/config.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/config' module Provider diff --git a/provider/azure/terraform/custom_code.rb b/provider/azure/terraform/custom_code.rb index 017cfba73e2c..800f319d1b54 100644 --- a/provider/azure/terraform/custom_code.rb +++ b/provider/azure/terraform/custom_code.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/terraform/custom_code' module Provider diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index 15e4de09a974..c2c17f3a281f 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' module Provider diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index e5e595eaae9b..d1f1f7daa6f1 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'api/object' module Provider diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index 0cf0d1eee3c3..5eb0e942cd20 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 2f2a93034776..89c63f53144a 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'overrides/terraform/property_override' module Provider diff --git a/provider/azure/terraform/resource_override.rb b/provider/azure/terraform/resource_override.rb index 238d01c82ce1..827249b8a9d2 100644 --- a/provider/azure/terraform/resource_override.rb +++ b/provider/azure/terraform/resource_override.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'overrides/terraform/resource_override' require 'api/azure/sdk_definition_override' diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 0899314b62c0..2e3b74f9b807 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb index bb4f1ca30875..72a98378ebc5 100644 --- a/provider/azure/terraform/sdk/expand_flatten_descriptor.rb +++ b/provider/azure/terraform/sdk/expand_flatten_descriptor.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/terraform/sdk/sdk_type_definition_descriptor' module Provider diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 56010b432090..0b19a0d6817d 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/terraform/sdk/expand_flatten_descriptor' module Provider diff --git a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb index feaa9d7a3c07..ab334ac9b789 100644 --- a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb +++ b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/terraform/sdk/sdk_type_definition_descriptor' module Provider diff --git a/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb b/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb index 6240d75138b2..45d2b0279aa0 100644 --- a/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb +++ b/provider/azure/terraform/sdk/sdk_type_definition_descriptor.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform/sdk/sub_template.rb b/provider/azure/terraform/sdk/sub_template.rb index 5999635cea97..d1ad25febfd2 100644 --- a/provider/azure/terraform/sdk/sub_template.rb +++ b/provider/azure/terraform/sdk/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform/sub_template.rb b/provider/azure/terraform/sub_template.rb index 01ca98640a33..de39c50cd3c4 100644 --- a/provider/azure/terraform/sub_template.rb +++ b/provider/azure/terraform/sub_template.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + module Provider module Azure module Terraform diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index 615c4da2e736..a7f06e292e9c 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -1,3 +1,16 @@ +# Copyright 2019 Microsoft Corp. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + require 'provider/azure/terraform/config' require 'provider/azure/terraform/custom_code' require 'provider/azure/terraform/helpers' diff --git a/templates/azure/ansible/documentation.erb b/templates/azure/ansible/documentation.erb index 3e426c9a4c74..796fa29b2ea6 100644 --- a/templates/azure/ansible/documentation.erb +++ b/templates/azure/ansible/documentation.erb @@ -35,10 +35,10 @@ description: extends_documentation_fragment: - azure - <%= lines('- azure_tags') if is_tags_defined?(object) && !is_data_source -%> +<%= lines(' - azure_tags') if is_tags_defined?(object) && !is_data_source -%> author: - - "<%= @config.author -%>" + - <%= lines(@config.author) -%> ''' <% unless object.examples.empty? -%> @@ -52,7 +52,7 @@ EXAMPLES = ''' output_hash = output_properties.map{|p| azure_returns_for_property(p, object)}.reduce({}, :merge) output_hash = { 'items' => { - 'description' => 'List of items', + 'description' => ['List of items.'], 'returned' => 'always', 'type' => 'complex', 'contains' => output_hash diff --git a/templates/azure/ansible/info.erb b/templates/azure/ansible/info.erb index bdbd2d8748b7..26b27de89f3c 100644 --- a/templates/azure/ansible/info.erb +++ b/templates/azure/ansible/info.erb @@ -22,6 +22,7 @@ __metaclass__ = type <%= lines(compile('templates/azure/ansible/documentation.erb')) -%> from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils.common.dict_transformations import _camel_to_snake try: from msrestazure.azure_exceptions import CloudError diff --git a/templates/azure/ansible/sdktypes/property_inline_response_format.erb b/templates/azure/ansible/sdktypes/property_inline_response_format.erb index fc2511b1ed85..0da0379d4487 100644 --- a/templates/azure/ansible/sdktypes/property_inline_response_format.erb +++ b/templates/azure/ansible/sdktypes/property_inline_response_format.erb @@ -11,6 +11,9 @@ py_fields <<= sdk_type_def.python_field_name || property.name.underscore end end - access_chain = py_fields.map{|f| "['#{f}']"}.join + access_gets = py_fields[0..-2].map{|f| ".get('#{f}', {})"} + access_gets <<= ".get('#{py_fields.last}')" + access_chain = 'd' + access_gets.join + access_chain = "_camel_to_snake(#{access_chain})" if property.is_a? Api::Type::Enum -%> -'<%= py_var -%>': <%= py_fields.empty? ? "self.#{py_var}" : "d#{access_chain}" -%>, \ No newline at end of file +'<%= py_var -%>': <%= py_fields.empty? ? "self.#{py_var}" : "#{access_chain}" -%>, \ No newline at end of file From cbf48d494302d6a5581532f2fc1c4039fc2af3a1 Mon Sep 17 00:00:00 2001 From: houkms <52267283+houkms@users.noreply.github.com> Date: Tue, 13 Aug 2019 14:00:27 +0800 Subject: [PATCH 125/175] Fix issues for Terraform WebApplicationFirewallPolicy resource (#13) * fix some minor issues in Go codes templates * code refined * fix minor logic error * fix redundant brace in template * fix issues in code generation for terraform * code refined * special case for tags property in exmaple * code refined --- provider/azure/terraform/example/helpers.rb | 26 ++++++++++++++++++- provider/azure/terraform/schema.rb | 2 +- .../terraform/example/hcl_properties.erb | 5 +++- .../terraform/expand_property_method.erb | 10 +++---- .../terraform/flatten_property_method.erb | 2 +- .../terraform/schemas/string_array_set.erb | 4 +-- .../sdktypes/expand_func_field_assign.erb | 4 +-- 7 files changed, 40 insertions(+), 13 deletions(-) diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index c2c17f3a281f..c0a36d8587ac 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -24,13 +24,37 @@ def get_example_properties_to_check(example_name, object) params = param_props.map{|p| p.name.underscore}.to_set example = get_example_by_names(example_name) - example.properties + example_props = example.properties .reject do |pn, pv| params.include?(pn) || pn == 'location' end .transform_values do |v| v.is_a?(String) && !v.match(/\$\{.+\}/).nil? ? :AttrSet : v end + flatten_example_properties_to_check(example_props, true) + end + + def flatten_example_properties_to_check(properties, has_nested_item) + return properties unless has_nested_item + flat_properties = Hash.new + has_nested_item = false + properties.each do |pn, pv| + if pv.is_a?(Hash) + pv.each do |key, val| + flat_properties["#{pn}.#{key}"] = val + has_nested_item = true if val.is_a?(Hash) || val.is_a?(Array) + end + elsif pv.is_a?(Array) + flat_properties["#{pn}.#"] = pv.length + pv.each_index do |ind| + flat_properties["#{pn}.#{ind}"] = pv[ind] + has_nested_item = true if pv[ind].is_a?(Hash) || pv[ind].is_a?(Array) + end + else + flat_properties[pn] = pv + end + end + return flatten_example_properties_to_check(flat_properties, has_nested_item) end end end diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 2e3b74f9b807..013a08c9c192 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -102,7 +102,7 @@ def schema_property_set_template(property) when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::KeyValuePairs 'templates/azure/terraform/schemas/basic_set.erb' when Api::Type::Array, Api::Type::NestedObject - return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::String) + return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String") 'templates/azure/terraform/schemas/flatten_set.erb' else 'templates/azure/terraform/schemas/unsupport.erb' diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb index 7b53a6085ef0..7b792090b00a 100644 --- a/templates/azure/terraform/example/hcl_properties.erb +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -12,6 +12,9 @@ <%= prop[0].ljust(prop_alignment) -%> = "<%= prop[1] -%>" <% elsif prop[1].is_a?(Integer) || prop[1].is_a?(TrueClass) || prop[1].is_a?(FalseClass) -%> <%= prop[0].ljust(prop_alignment) -%> = <%= lines(prop[1].to_s) -%> +<% elsif prop[1].is_a?(Array) && (prop[1].length == 0 || prop[1][0].is_a?(String)) + res_arr = prop[1].map{|elem| "\"#{elem}\""} -%> +<%= prop[0].ljust(prop_alignment) -%> = [<%= res_arr.join(", ") -%>] <% else -%> // TODO: Unsupported property "<%= prop[0] -%>" value <%= lines(prop[1]) -%> <% @@ -24,7 +27,7 @@ blocks.each do |block| -%> -<%= prop[0] -%> = { +<%= prop[0] -%> <%= "= " if prop[0] == "tags"-%>{ <%= lines(build_hcl_properties(block)) -%> } <% diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 398f7851c96e..1463525bae32 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -73,18 +73,19 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go return &result <% elsif property.is_a?(Api::Type::Array) -%> results := make([]<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>, 0) - for _, v := range input { + for _, item := range input { + v := item.(map[string]interface{}) <% nested_properties.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 8)) -%> <% end -%> - item := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ + result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ <%= lines(build_property_to_sdk_object(sdk_marshal.clone(nil, nested_properties), 12)) -%> } - results = append(results, item) + results = append(results, result) } return &results <% end -%> @@ -119,7 +120,6 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go <% end -%> <% end # nested_properties, array of resourcerefs, else -%> <% else -%> - // TODO: Expand Property '<%= property.name -%>' of type <%= property.class -%> is not supported -} +// TODO: Expand Property '<%= property.name -%>' of type <%= property.class -%> is not supported <% end # tf_types.include?(property.class) -%> <% end # custom_code check -%> diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index 17fafc7c3852..f23d878e855a 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -39,7 +39,7 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= return results } - for _, item := range input { + for _, item := range *input { v := make(map[string]interface{}) <%= lines(build_sdk_object_to_property('item', 'v', sdk_marshal.clone(nil, property.nested_properties), 8)) -%> diff --git a/templates/azure/terraform/schemas/string_array_set.erb b/templates/azure/terraform/schemas/string_array_set.erb index 1c7399dc558a..91774c2304ef 100644 --- a/templates/azure/terraform/schemas/string_array_set.erb +++ b/templates/azure/terraform/schemas/string_array_set.erb @@ -1,5 +1,5 @@ <% if output_var == 'd' -%> -d.Set("<%= prop_name -%>", utils.FlattenStringArray(<%= input_var -%>)) +d.Set("<%= prop_name -%>", utils.FlattenStringSlice(<%= input_var -%>)) <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenStringArray(<%= input_var -%>) +<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenStringSlice(<%= input_var -%>) <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index b63a9a1871ba..eb7bbf180d9e 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,8 +1,8 @@ <%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> <% if expand_funcs.include?(property.class) -%> <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> -<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::String) -%> -utils.ExpandStringArray(<%= property.name.camelcase(:lower) -%> +<% elsif property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String") -%> +utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> <% else -%> <% expand_func_name = sdk_marshal.enqueue(property) -%> expand<%= sdk_marshal.resource -%><%= expand_func_name -%>(<%= property.name.camelcase(:lower) -%> From ad3f8fe9d7cdfa0eb3b6f7538b82c49ab06feae4 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 13 Aug 2019 14:36:34 -0700 Subject: [PATCH 126/175] Refine terraform HCL empty line positions --- templates/azure/terraform/example/hcl_properties.erb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/templates/azure/terraform/example/hcl_properties.erb b/templates/azure/terraform/example/hcl_properties.erb index 7b792090b00a..3323d635a0bf 100644 --- a/templates/azure/terraform/example/hcl_properties.erb +++ b/templates/azure/terraform/example/hcl_properties.erb @@ -1,10 +1,16 @@ <% # props_left: [[name_1, val_1], [name_2, val_2], ...] props_left = properties.to_a + is_first_section = true begin simple_props = props_left.take_while{|p| !p[1].is_a?(Hash) && !(p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} props_left = props_left.drop_while{|p| !p[1].is_a?(Hash) && !(p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} +-%> +<%= "\n" if !is_first_section && !simple_props.empty? -%> +<% + is_first_section = false unless simple_props.empty? + prop_alignment = simple_props.map{|p| p[0].length}.max simple_props.each do |prop| if prop[1].is_a?(String) @@ -20,13 +26,17 @@ <% end end + complex_props = props_left.take_while{|p| p[1].is_a?(Hash) || (p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} props_left = props_left.drop_while{|p| p[1].is_a?(Hash) || (p[1].is_a?(Array) && p[1].length > 0 && p[1][0].is_a?(Hash))} complex_props.each do |prop| blocks = prop[1].is_a?(Array) ? prop[1] : [prop[1]] blocks.each do |block| -%> - +<%= "\n" unless is_first_section -%> +<% + is_first_section = false +-%> <%= prop[0] -%> <%= "= " if prop[0] == "tags"-%>{ <%= lines(build_hcl_properties(block)) -%> } From eb86416fe59cacfd97d51ae9f276fb7febebffd5 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 13 Aug 2019 17:46:10 -0700 Subject: [PATCH 127/175] Introduce BooleanEnum type to properties --- api/azure/type.rb | 11 +++ provider/azure/terraform/property_override.rb | 4 ++ provider/azure/terraform/schema.rb | 67 ++++++++++++------- provider/azure/terraform/sdk/helpers.rb | 2 + provider/azure/terraform_extension.rb | 1 + .../terraform/schemas/boolean_enum_get.erb | 9 +++ .../terraform/schemas/boolean_enum_set.erb | 6 ++ .../azure/terraform/schemas/primitive.erb | 8 ++- .../sdktypes/plain_var_field_assign.erb | 1 + 9 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 templates/azure/terraform/schemas/boolean_enum_get.erb create mode 100644 templates/azure/terraform/schemas/boolean_enum_set.erb create mode 100644 templates/azure/terraform/sdktypes/plain_var_field_assign.erb diff --git a/api/azure/type.rb b/api/azure/type.rb index 58967fb7a014..99aabbd8248e 100644 --- a/api/azure/type.rb +++ b/api/azure/type.rb @@ -47,6 +47,17 @@ def validate end end + class BooleanEnum < Api::Type::Boolean + attr_reader :true_value + attr_reader :false_value + + def validate + super + check :true_value, type: [Symbol], required: true + check :false_value, type: [Symbol], required: true + end + end + class ISO8601Duration < Api::Type::String end diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index 89c63f53144a..f36d0d9245a7 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -22,6 +22,8 @@ def self.attributes super.concat(%i[ name_in_logs hide_from_schema + true_value + false_value custom_schema_definition custom_schema_get custom_schema_set @@ -35,6 +37,8 @@ def validate super check :name_in_logs, type: ::String check :hide_from_schema, type: :boolean, default: false + check :true_value, type: [Symbol] + check :false_value, type: [Symbol] check :custom_schema_definition, type: ::String check :custom_schema_get, type: ::String check :custom_schema_set, type: ::String diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 013a08c9c192..b577d93df3ef 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -17,18 +17,19 @@ module Terraform module Schema def go_type(property) - case property - when Api::Type::Boolean + if property.is_a?(Api::Type::Boolean) 'bool' - when Api::Type::Enum, Api::Type::String + elsif property.is_a?(Api::Type::Enum) || + property.is_a?(Api::Type::String) 'string' - when Api::Type::Integer + elsif property.is_a?(Api::Type::Integer) 'int' - when Api::Type::Double + elsif property.is_a?(Api::Type::Double) 'float64' - when Api::Type::KeyValuePairs + elsif property.is_a?(Api::Type::KeyValuePairs) 'map[string]interface{}' - when Api::Type::Array, Api::Type::NestedObject + elsif property.is_a?(Api::Type::Array) || + property.is_a?(Api::Type::NestedObject) '[]interface{}' else 'interface{}' @@ -36,8 +37,7 @@ def go_type(property) end def go_empty_value(property) - case property - when Api::Type::Enum, Api::Type::String + if property.is_a?(Api::Type::Enum) || property.is_a?(Api::Type::String) '""' else 'nil' @@ -62,15 +62,20 @@ def expand_funcs def schema_property_template(property, is_data_source) return property.custom_schema_definition unless get_property_value(property, "custom_schema_definition", nil).nil? - case property - when Api::Azure::Type::ResourceGroupName + if property.is_a?(Api::Azure::Type::ResourceGroupName) !is_data_source ? 'templates/azure/terraform/schemas/resource_group_name.erb' : 'templates/azure/terraform/schemas/datasource_resource_group_name.erb' - when Api::Azure::Type::Location + elsif property.is_a?(Api::Azure::Type::Location) !is_data_source ? 'templates/azure/terraform/schemas/location.erb' : 'templates/azure/terraform/schemas/datasource_location.erb' - when Api::Azure::Type::Tags + elsif property.is_a?(Api::Azure::Type::Tags) !is_data_source ? 'templates/azure/terraform/schemas/tags.erb' : 'templates/azure/terraform/schemas/datasource_tags.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, - Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject + elsif property.is_a?(Api::Type::Boolean) || + property.is_a?(Api::Type::Enum) || + property.is_a?(Api::Type::String) || + property.is_a?(Api::Type::Integer) || + property.is_a?(Api::Type::Double) || + property.is_a?(Api::Type::Array) || + property.is_a?(Api::Type::KeyValuePairs) || + property.is_a?(Api::Type::NestedObject) 'templates/azure/terraform/schemas/primitive.erb' else 'templates/azure/terraform/schemas/unsupport.erb' @@ -80,11 +85,18 @@ def schema_property_template(property, is_data_source) def schema_property_get_template(property) return property.custom_schema_get unless get_property_value(property, "custom_schema_get", nil).nil? return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) - case property - when Api::Azure::Type::Location + if property.is_a?(Api::Azure::Type::Location) 'templates/azure/terraform/schemas/location_get.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, - Api::Type::Array, Api::Type::KeyValuePairs, Api::Type::NestedObject + elsif property.is_a?(Api::Azure::Type::BooleanEnum) + 'templates/azure/terraform/schemas/boolean_enum_get.erb' + elsif property.is_a?(Api::Type::Boolean) || + property.is_a?(Api::Type::Enum) || + property.is_a?(Api::Type::String) || + property.is_a?(Api::Type::Integer) || + property.is_a?(Api::Type::Double) || + property.is_a?(Api::Type::Array) || + property.is_a?(Api::Type::KeyValuePairs) || + property.is_a?(Api::Type::NestedObject) 'templates/azure/terraform/schemas/basic_get.erb' else 'templates/azure/terraform/schemas/unsupport.erb' @@ -94,14 +106,21 @@ def schema_property_get_template(property) def schema_property_set_template(property) return property.custom_schema_set unless get_property_value(property, "custom_schema_set", nil).nil? return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) - case property - when Api::Azure::Type::Location + if property.is_a?(Api::Azure::Type::Location) 'templates/azure/terraform/schemas/location_set.erb' - when Api::Azure::Type::Tags + elsif property.is_a?(Api::Azure::Type::Tags) 'templates/azure/terraform/schemas/tags_set.erb' - when Api::Type::Boolean, Api::Type::Enum, Api::Type::String, Api::Type::Integer, Api::Type::Double, Api::Type::KeyValuePairs + elsif property.is_a?(Api::Azure::Type::BooleanEnum) + 'templates/azure/terraform/schemas/boolean_enum_set.erb' + elsif property.is_a?(Api::Type::Boolean) || + property.is_a?(Api::Type::Enum) || + property.is_a?(Api::Type::String) || + property.is_a?(Api::Type::Integer) || + property.is_a?(Api::Type::Double) || + property.is_a?(Api::Type::KeyValuePairs) 'templates/azure/terraform/schemas/basic_set.erb' - when Api::Type::Array, Api::Type::NestedObject + elsif property.is_a?(Api::Type::Array) || + property.is_a?(Api::Type::NestedObject) return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String") 'templates/azure/terraform/schemas/flatten_set.erb' else diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 0b19a0d6817d..796a70d4c60a 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -38,6 +38,7 @@ def get_sdk_typedef_by_references(references, typedefs) def property_to_sdk_field_assignment_template(property, sdk_type) return property.custom_sdkfield_assign unless get_property_value(property, "custom_sdkfield_assign", nil).nil? return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) + return 'templates/azure/terraform/sdktypes/plain_var_field_assign.erb' if property.is_a?(Api::Azure::Type::BooleanEnum) case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::FloatObject, @@ -56,6 +57,7 @@ def property_to_sdk_field_assignment_template(property, sdk_type) end def property_to_schema_assignment_template(property, sdk_operation, api_path) + return 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' if property.is_a?(Api::Azure::Type::BooleanEnum) sdk_type = sdk_operation.response[api_path] || sdk_operation.request[api_path] case sdk_type when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index a7f06e292e9c..2c63b2787d4c 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -47,6 +47,7 @@ def initialize(config, api, start_time) def azure_tf_types(map) map[Api::Azure::Type::ResourceReference] = 'schema.TypeString' + map[Api::Azure::Type::BooleanEnum] = 'schema.TypeBool' map end diff --git a/templates/azure/terraform/schemas/boolean_enum_get.erb b/templates/azure/terraform/schemas/boolean_enum_get.erb new file mode 100644 index 000000000000..087be28361fb --- /dev/null +++ b/templates/azure/terraform/schemas/boolean_enum_get.erb @@ -0,0 +1,9 @@ +<% enum_prefix = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_enum_const_prefix -%> +<%= output_var -%> := <%= sdk_marshal.package -%>.<%= lines(enum_prefix + property.false_value.to_s) -%> +<% if input_var == 'd' -%> +if d.Get("<%= prop_name -%>").(bool) { +<% else -%> +if <%= input_var -%>["<%= prop_name -%>"].(bool) { +<% end -%> + <%= output_var -%> = <%= sdk_marshal.package -%>.<%= lines(enum_prefix + property.true_value.to_s) -%> +} \ No newline at end of file diff --git a/templates/azure/terraform/schemas/boolean_enum_set.erb b/templates/azure/terraform/schemas/boolean_enum_set.erb new file mode 100644 index 000000000000..0e48a36ecf0c --- /dev/null +++ b/templates/azure/terraform/schemas/boolean_enum_set.erb @@ -0,0 +1,6 @@ +<% enum_prefix = get_sdk_typedef_by_references(property.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_enum_const_prefix -%> +<% if output_var == 'd' -%> +d.Set("<%= prop_name -%>", <%= input_var -%> == <%= sdk_marshal.package -%>.<%= enum_prefix + property.false_value.to_s -%>) +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = <%= input_var -%> == <%= sdk_marshal.package -%>.<%= enum_prefix + property.false_value.to_s -%> +<% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 924dbbe3110b..9a8292e540ce 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -31,12 +31,14 @@ <% if force_new?(property, object) && data_source_input.empty? -%> ForceNew: true, <% end -%> -<% unless property.validation.nil? || property.output -%> +<% if !property.validation.nil? && !property.output -%> <% if !property.validation.regex.nil? && (data_source_input.empty? || data_source_input.include?(property)) -%> ValidateFunc: validateRegexp(`<%= property.validation.regex -%>`), <% elsif !property.validation.function.nil? && (data_source_input.empty? || data_source_input.include?(property)) -%> ValidateFunc: <%= property.validation.function -%>, <% end # property.validation.nil? -%> +<% elsif property.required && property.is_a?(Api::Type::String) && (data_source_input.empty? || data_source_input.include?(property)) -%> + ValidateFunc: validate.NoEmptyStrings, <% end # property.validation.nil? -%> <% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> <% @@ -130,6 +132,8 @@ <% unless property.default_value.nil? || !data_source_input.empty? -%> <% if property.is_a?(Api::Type::Enum) -%> Default: <%= azure_go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, +<% elsif property.is_a?(Api::Azure::Type::BooleanEnum) -%> + Default: <%= lines((property.default_value == property.true_value).to_s) -%> <% else -%> Default: <%= azure_go_literal(property.default_value) -%>, <% end -%> @@ -140,5 +144,5 @@ <% end -%> }, <% else -%> - // TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported +// TODO: Property '<%= property.name -%>' of type <%= property.class -%> is not supported in primitive.erb <% end # tf_types.include?(property.class) -%> diff --git a/templates/azure/terraform/sdktypes/plain_var_field_assign.erb b/templates/azure/terraform/sdktypes/plain_var_field_assign.erb new file mode 100644 index 000000000000..0d02505ea127 --- /dev/null +++ b/templates/azure/terraform/sdktypes/plain_var_field_assign.erb @@ -0,0 +1 @@ +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%><%= property.name.camelcase(:lower) -%><%= ',' if in_structure -%> \ No newline at end of file From 096c5acf8a5f9db214cad8a6b5f1672b24b7410b Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Tue, 13 Aug 2019 18:01:48 -0700 Subject: [PATCH 128/175] Missing comma for BooleanEnum Default value --- templates/azure/terraform/schemas/primitive.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 9a8292e540ce..43e69b4024d1 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -133,7 +133,7 @@ <% if property.is_a?(Api::Type::Enum) -%> Default: <%= azure_go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, <% elsif property.is_a?(Api::Azure::Type::BooleanEnum) -%> - Default: <%= lines((property.default_value == property.true_value).to_s) -%> + Default: <%= (property.default_value == property.true_value).to_s -%>, <% else -%> Default: <%= azure_go_literal(property.default_value) -%>, <% end -%> From c2fa1ab87648e16169993aa2fbba593879f360e9 Mon Sep 17 00:00:00 2001 From: houkms <52267283+houkms@users.noreply.github.com> Date: Fri, 6 Sep 2019 04:15:19 +0800 Subject: [PATCH 129/175] Support Datetime & Duration & IntegerArray & ReferenceArray Types for Terraform (#16) * add support for Array of AzureResourceReference, DateTime and Duration, Array of Integer32/64 * fix some issues in property flatten * add support for key-val paris * expand and flatten IntegerArray and KeyValPairs types as util functions * remove useless codes * codes refined --- api/azure/sdk_type_definition.rb | 6 ++++++ provider/azure/terraform/example/helpers.rb | 3 ++- provider/azure/terraform/schema.rb | 17 ++++++++++++----- provider/azure/terraform/sdk/helpers.rb | 8 +++++++- provider/azure/terraform_extension.rb | 4 ++++ .../azure/terraform/expand_property_method.erb | 17 ++++++++++++++++- .../schemas/datetime_and_duration_set.erb | 9 +++++++++ .../terraform/schemas/integer_array_set.erb | 9 +++++++++ .../terraform/schemas/key_value_pairs_set.erb | 5 +++++ templates/azure/terraform/schemas/primitive.erb | 6 +++++- .../datetime_and_duration_field_assign.erb | 8 ++++++++ .../sdktypes/expand_func_field_assign.erb | 4 +++- .../sdktypes/integer_array_field_assign.erb | 5 +++++ 13 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 templates/azure/terraform/schemas/datetime_and_duration_set.erb create mode 100644 templates/azure/terraform/schemas/integer_array_set.erb create mode 100644 templates/azure/terraform/schemas/key_value_pairs_set.erb create mode 100644 templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb create mode 100644 templates/azure/terraform/sdktypes/integer_array_field_assign.erb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index e8fad6717594..586b8cdd2429 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -64,6 +64,12 @@ class Integer32Object < SDKTypeDefinition class Integer64Object < SDKTypeDefinition end + class Integer32ArrayObject < SDKTypeDefinition + end + + class Integer64ArrayObject < SDKTypeDefinition + end + class FloatObject < SDKTypeDefinition end diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index c0a36d8587ac..2cbf26642742 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -40,8 +40,9 @@ def flatten_example_properties_to_check(properties, has_nested_item) has_nested_item = false properties.each do |pn, pv| if pv.is_a?(Hash) + flat_properties["#{pn}.#"] = pv.empty? ? 0 : 1 pv.each do |key, val| - flat_properties["#{pn}.#{key}"] = val + flat_properties["#{pn}.0.#{key}"] = val has_nested_item = true if val.is_a?(Hash) || val.is_a?(Array) end elsif pv.is_a?(Array) diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index b577d93df3ef..73ced066674c 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -75,7 +75,9 @@ def schema_property_template(property, is_data_source) property.is_a?(Api::Type::Double) || property.is_a?(Api::Type::Array) || property.is_a?(Api::Type::KeyValuePairs) || - property.is_a?(Api::Type::NestedObject) + property.is_a?(Api::Type::NestedObject) || + property.is_a?(Api::Azure::Type::ISO8601DateTime) || + property.is_a?(Api::Azure::Type::ISO8601Duration) 'templates/azure/terraform/schemas/primitive.erb' else 'templates/azure/terraform/schemas/unsupport.erb' @@ -112,16 +114,21 @@ def schema_property_set_template(property) 'templates/azure/terraform/schemas/tags_set.erb' elsif property.is_a?(Api::Azure::Type::BooleanEnum) 'templates/azure/terraform/schemas/boolean_enum_set.erb' + elsif property.is_a?(Api::Azure::Type::ISO8601DateTime) || property.is_a?(Api::Azure::Type::ISO8601Duration) + 'templates/azure/terraform/schemas/datetime_and_duration_set.erb' elsif property.is_a?(Api::Type::Boolean) || property.is_a?(Api::Type::Enum) || property.is_a?(Api::Type::String) || property.is_a?(Api::Type::Integer) || - property.is_a?(Api::Type::Double) || - property.is_a?(Api::Type::KeyValuePairs) + property.is_a?(Api::Type::Double) 'templates/azure/terraform/schemas/basic_set.erb' elsif property.is_a?(Api::Type::Array) || - property.is_a?(Api::Type::NestedObject) - return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String") + property.is_a?(Api::Type::NestedObject) || + property.is_a?(Api::Type::KeyValuePairs) + return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || + property.item_type == "Api::Type::String" || property.item_type == "Api::Azure::Type::ResourceReference") + return 'templates/azure/terraform/schemas/integer_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type == "Api::Type::Integer" + return 'templates/azure/terraform/schemas/key_value_pairs_set.erb' if property.is_a?(Api::Type::KeyValuePairs) 'templates/azure/terraform/schemas/flatten_set.erb' else 'templates/azure/terraform/schemas/unsupport.erb' diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 796a70d4c60a..2da7ea917219 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -40,6 +40,10 @@ def property_to_sdk_field_assignment_template(property, sdk_type) return 'templates/azure/terraform/schemas/hide_from_schema.erb' if get_property_value(property, "hide_from_schema", false) return 'templates/azure/terraform/sdktypes/plain_var_field_assign.erb' if property.is_a?(Api::Azure::Type::BooleanEnum) case sdk_type + when Api::Azure::SDKTypeDefinition::Integer32ArrayObject, Api::Azure::SDKTypeDefinition::Integer64ArrayObject + 'templates/azure/terraform/sdktypes/integer_array_field_assign.erb' + when Api::Azure::SDKTypeDefinition::ISO8601DateTimeObject, Api::Azure::SDKTypeDefinition::ISO8601DurationObject + 'templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb' when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::FloatObject, Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject @@ -63,7 +67,9 @@ def property_to_schema_assignment_template(property, sdk_operation, api_path) when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object, Api::Azure::SDKTypeDefinition::FloatObject, - Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject + Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject, + Api::Azure::SDKTypeDefinition::ISO8601DateTimeObject, Api::Azure::SDKTypeDefinition::ISO8601DurationObject, + Api::Azure::SDKTypeDefinition::Integer32ArrayObject, Api::Azure::SDKTypeDefinition::Integer64ArrayObject 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_schema_assign.erb' diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index 2c63b2787d4c..fecb07a8d409 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -48,6 +48,10 @@ def initialize(config, api, start_time) def azure_tf_types(map) map[Api::Azure::Type::ResourceReference] = 'schema.TypeString' map[Api::Azure::Type::BooleanEnum] = 'schema.TypeBool' + map[Api::Azure::Type::ISO8601DateTime] = 'schema.TypeString' + map[Api::Azure::Type::ISO8601Duration] = 'schema.TypeString' + map['Api::Azure::Type::ResourceReference'] = 'schema.TypeString' + map['Api::Type::Integer'] = 'schema.TypeInt' map end diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 1463525bae32..04cb0a9ab2c6 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -7,7 +7,22 @@ prefix: sdk_marshal.resource, property: property)) -%> <% else -%> -<% if property.is_a?(Api::Type::Map) -%> +<% if property.is_a?(Api::Azure::Type::ISO8601DateTime) -%> +func convertStringToDate(input interface{}) *date.Time { + v := input.(string) + + dateTime, err := date.ParseTime(time.RFC3339, v) + if err != nil { + log.Printf("[ERROR] Cannot convert an invalid string to RFC3339 date %q: %+v", v, err) + return nil + } + + result := date.Time{ + Time: dateTime, + } + return &result +} +<% elsif property.is_a?(Api::Type::Map) -%> func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { if v == nil { return map[string]interface{}{}, nil diff --git a/templates/azure/terraform/schemas/datetime_and_duration_set.erb b/templates/azure/terraform/schemas/datetime_and_duration_set.erb new file mode 100644 index 000000000000..2928e95c3680 --- /dev/null +++ b/templates/azure/terraform/schemas/datetime_and_duration_set.erb @@ -0,0 +1,9 @@ +<% format_str = property.is_a?(Api::Azure::Type::ISO8601Duration) ? '%s' : '(%s).String()' -%> +<% if output_var == 'd' -%> +d.Set("<%= prop_name -%>", <%= format_str % input_var-%>) +<% else -%> +<% temp_var = prop_name.camelize(:lower) -%> +if <%= temp_var -%> := <%= input_var -%>; <%= temp_var -%> != nil { + <%= output_var -%>["<%= prop_name -%>"] = <%= lines(format_str % "*#{temp_var}") -%> +} +<% end -%> diff --git a/templates/azure/terraform/schemas/integer_array_set.erb b/templates/azure/terraform/schemas/integer_array_set.erb new file mode 100644 index 000000000000..d3b7d44efc7d --- /dev/null +++ b/templates/azure/terraform/schemas/integer_array_set.erb @@ -0,0 +1,9 @@ +<% bit_number = 32 if sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer32ArrayObject) -%> +<% bit_number = 64 if sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer64ArrayObject) -%> +<% if output_var == 'd' -%> +if err := d.Set("<%= prop_name -%>", utils.FlattenInteger<%= bit_number -%>Slice(<%= input_var -%>)); err != nil { + return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) +} +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenInteger<%= bit_number -%>Slice(<%= input_var -%>) +<% end -%> diff --git a/templates/azure/terraform/schemas/key_value_pairs_set.erb b/templates/azure/terraform/schemas/key_value_pairs_set.erb new file mode 100644 index 000000000000..19cfd77b1397 --- /dev/null +++ b/templates/azure/terraform/schemas/key_value_pairs_set.erb @@ -0,0 +1,5 @@ +<% if output_var == 'd' -%> +d.Set("<%= prop_name -%>", utils.FlattenKeyValuePairs(<%= input_var -%>)) +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenKeyValuePairs(<%= input_var -%>) +<% end -%> diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 43e69b4024d1..e05899fed8d8 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -40,7 +40,11 @@ <% elsif property.required && property.is_a?(Api::Type::String) && (data_source_input.empty? || data_source_input.include?(property)) -%> ValidateFunc: validate.NoEmptyStrings, <% end # property.validation.nil? -%> -<% if property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> +<% if property.is_a?(Api::Azure::Type::ISO8601DateTime) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> + ValidateFunc: validateRFC3339Date, +<% elsif property.is_a?(Api::Azure::Type::ISO8601Duration) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> + ValidateFunc: validateIso8601Duration(), +<% elsif property.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output && (data_source_input.empty? || data_source_input.include?(property)) -%> <% enum_values = property.values sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) diff --git a/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb b/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb new file mode 100644 index 000000000000..3e0129da211e --- /dev/null +++ b/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb @@ -0,0 +1,8 @@ +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> +<% if property.is_a?(Api::Azure::Type::ISO8601Duration) -%> +utils.String(<%= property.name.camelcase(:lower) -%> +<% elsif property.is_a?(Api::Azure::Type::ISO8601DateTime) -%> +<% sdk_marshal.enqueue(property) -%> +convertStringToDate(<%= property.name.camelcase(:lower) -%> +<% end -%> +)<%= ',' if in_structure -%> diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index eb7bbf180d9e..8b89cd1aee1c 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,8 +1,10 @@ <%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> <% if expand_funcs.include?(property.class) -%> <%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> -<% elsif property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String") -%> +<% elsif property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String" || property.item_type == "Api::Azure::Type::ResourceReference") -%> utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> +<% elsif property.is_a?(Api::Type::KeyValuePairs) -%> +utils.ExpandKeyValuePairs(<%= property.name.camelcase(:lower) -%> <% else -%> <% expand_func_name = sdk_marshal.enqueue(property) -%> expand<%= sdk_marshal.resource -%><%= expand_func_name -%>(<%= property.name.camelcase(:lower) -%> diff --git a/templates/azure/terraform/sdktypes/integer_array_field_assign.erb b/templates/azure/terraform/sdktypes/integer_array_field_assign.erb new file mode 100644 index 000000000000..48e73090483f --- /dev/null +++ b/templates/azure/terraform/sdktypes/integer_array_field_assign.erb @@ -0,0 +1,5 @@ +<% bit_number = 32 if sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer32ArrayObject) -%> +<% bit_number = 64 if sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer64ArrayObject) -%> +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> +utils.ExpandInteger<%= bit_number -%>Slice(<%= property.name.camelcase(:lower) -%> +)<%= ',' if in_structure -%> From a7da04037c0c0895b11f307618bf94a7b3ceedb6 Mon Sep 17 00:00:00 2001 From: Junyi Yi Date: Thu, 5 Sep 2019 13:45:27 -0700 Subject: [PATCH 130/175] Update tags and Create template according to the latest coding style --- provider/azure/terraform/schema.rb | 2 +- templates/azure/terraform/datasource.erb | 3 ++- templates/azure/terraform/resource.erb | 8 +++++--- templates/azure/terraform/schemas/tags.erb | 2 +- templates/azure/terraform/schemas/tags_set.erb | 2 +- templates/azure/terraform/sdk/azure_id_parser.erb | 2 +- .../azure/terraform/sdktypes/expand_func_field_assign.erb | 5 ++++- 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index 73ced066674c..df2171e5d398 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -55,7 +55,7 @@ def expand_funcs Api::Type::Integer => 'utils.Int', Api::Type::Double => 'utils.Float', Api::Azure::Type::Location => "utils.String", - Api::Azure::Type::Tags => 'expandTags', + Api::Azure::Type::Tags => 'tags.Expand', Api::Azure::Type::ResourceReference => "utils.String" } end diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index fb654668d644..df1896742dfc 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -36,7 +36,8 @@ func dataSource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{ <% input_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 6cd8d9549a75..dc6140dcd2a8 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -97,7 +97,7 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> - if requireResourcesToBeImported { + if features.ShouldResourcesBeImported() && d.IsNewResource() { resp, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> if err != nil { if !utils.ResponseWasNotFound(resp.Response) { @@ -111,7 +111,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% settable_properties.select{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> @@ -192,7 +193,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% if prop.name != "location" -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> <% end -%> diff --git a/templates/azure/terraform/schemas/tags.erb b/templates/azure/terraform/schemas/tags.erb index 857afa535730..a890164c48df 100644 --- a/templates/azure/terraform/schemas/tags.erb +++ b/templates/azure/terraform/schemas/tags.erb @@ -1 +1 @@ -"<%= property.name.underscore -%>": tagsSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": tags.Schema(), \ No newline at end of file diff --git a/templates/azure/terraform/schemas/tags_set.erb b/templates/azure/terraform/schemas/tags_set.erb index deb6184eb2bf..7fd0dff35817 100644 --- a/templates/azure/terraform/schemas/tags_set.erb +++ b/templates/azure/terraform/schemas/tags_set.erb @@ -1,5 +1,5 @@ <% if output_var == 'd' -%> -flattenAndSetTags(d, <%= input_var -%>) +tags.FlattenAndSet(d, <%= input_var -%>) <% else -%> // TODO: setting tags to <%= output_var -%> is not supported <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb index 8e0dbb62a4d1..65841a1acf64 100644 --- a/templates/azure/terraform/sdk/azure_id_parser.erb +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -1,4 +1,4 @@ -id, err := parseAzureResourceID(d.Id()) +id, err := azure.ParseAzureResourceID(d.Id()) if err != nil { return err } diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 8b89cd1aee1c..0e8d38877ce5 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -1,6 +1,9 @@ <%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> +<% var_name = sdk_marshal.sdktype.type_definition.go_variable_name -%> +<% special_known_name = (property.name == 'tags' ? 't' : nil) -%> +<% input_var = var_name || special_known_name || property.name.camelcase(:lower) -%> <% if expand_funcs.include?(property.class) -%> -<%= expand_func(property) -%>(<%= property.name.camelcase(:lower) -%> +<%= expand_func(property) -%>(<%= input_var -%> <% elsif property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String" || property.item_type == "Api::Azure::Type::ResourceReference") -%> utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> From 8986b4e78fa24648998696fd58c3b717679fc45e Mon Sep 17 00:00:00 2001 From: houkms Date: Thu, 12 Sep 2019 18:17:02 +0800 Subject: [PATCH 131/175] missing go_type_name override in adk_type_definition --- api/azure/sdk_type_definition.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 586b8cdd2429..a59b029bced8 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -46,6 +46,7 @@ def merge_overrides!(overrides) @empty_value_sensitive = overrides.empty_value_sensitive unless overrides.empty_value_sensitive.nil? @go_variable_name = overrides.go_variable_name unless overrides.go_variable_name.nil? @go_field_name = overrides.go_field_name unless overrides.go_field_name.nil? + @go_type_name = overrides.go_type_name unless overrides.go_type_name.nil? @is_pointer_type = overrides.is_pointer_type unless overrides.is_pointer_type.nil? @python_parameter_name = overrides.python_parameter_name unless overrides.python_parameter_name.nil? @python_variable_name = overrides.python_variable_name unless overrides.python_variable_name.nil? From ca6e07fe350497f3176afd76df9b76bf584cc602 Mon Sep 17 00:00:00 2001 From: houkms Date: Mon, 16 Sep 2019 10:56:05 +0800 Subject: [PATCH 132/175] adjust MaxItems and MinItems of TypeList in datasource --- templates/azure/terraform/schemas/primitive.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index e05899fed8d8..6c77e07b9b2d 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -73,10 +73,10 @@ }, }, <% elsif property.is_a?(Api::Type::Array) -%> -<% unless property.min_size.nil? && data_source_input.empty? -%> +<% if !property.min_size.nil? && data_source_input.empty? -%> MinItems: <%= property.min_size %>, <% end -%> -<% unless property.max_size.nil? && data_source_input.empty? -%> +<% if !property.max_size.nil? && data_source_input.empty? -%> MaxItems: <%= property.max_size %>, <% end -%> <% if property.item_type.is_a?(Api::Type::NestedObject) -%> From 36c9681638c272f93b04e61431151ddf2e834825 Mon Sep 17 00:00:00 2001 From: houkms Date: Mon, 16 Sep 2019 15:04:50 +0800 Subject: [PATCH 133/175] fix nested map expanding issue in TestCheckResourceAttr --- provider/azure/terraform/example/helpers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index 2cbf26642742..407473328511 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -40,9 +40,9 @@ def flatten_example_properties_to_check(properties, has_nested_item) has_nested_item = false properties.each do |pn, pv| if pv.is_a?(Hash) - flat_properties["#{pn}.#"] = pv.empty? ? 0 : 1 + flat_properties["#{pn}.%"] = pv.length if !pn.include?('.') pv.each do |key, val| - flat_properties["#{pn}.0.#{key}"] = val + flat_properties["#{pn}.#{key}"] = val has_nested_item = true if val.is_a?(Hash) || val.is_a?(Array) end elsif pv.is_a?(Array) From 2857c31b6ba6b4f6c910cc29a1dce8750b654fee Mon Sep 17 00:00:00 2001 From: houkms Date: Tue, 17 Sep 2019 15:52:49 +0800 Subject: [PATCH 134/175] fix some known issues --- templates/azure/terraform/expand_property_method.erb | 4 ++-- templates/azure/terraform/schemas/basic_set.erb | 2 +- templates/azure/terraform/sdktypes/property_to_sdkobject.erb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 04cb0a9ab2c6..cb09199e3cf0 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -79,7 +79,7 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go <% nested_properties.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) -%> +<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) if !prop.output -%> <% end -%> result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ @@ -93,7 +93,7 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go <% nested_properties.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> <% output_var = var_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 8)) -%> +<%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 8)) if !prop.output -%> <% end -%> result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>{ diff --git a/templates/azure/terraform/schemas/basic_set.erb b/templates/azure/terraform/schemas/basic_set.erb index 916d27d50f72..3a5ae838ef5b 100644 --- a/templates/azure/terraform/schemas/basic_set.erb +++ b/templates/azure/terraform/schemas/basic_set.erb @@ -2,7 +2,7 @@ format_str = '%s' case sdk_marshal.sdktype.type_definition when Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object - format_str = 'int(%s)' + format_str = 'int(*%s)' end -%> <% if output_var == 'd' -%> diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index 39003c0c82d9..f1bd025c041f 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -24,6 +24,6 @@ -%> <%= lines(build_sdk_field_assignment(nil, sdk_marshal.clone(child_api_path))) if matched_properties.empty? -%> <% matched_properties.each do |property| -%> -<%= lines(build_sdk_field_assignment(property, sdk_marshal.clone(child_api_path))) -%> +<%= lines(build_sdk_field_assignment(property, sdk_marshal.clone(child_api_path))) if !property.output-%> <% end -%> <% end -%> From d3c1bd2a0c16e88b543439a79a82a3cb4c100ac9 Mon Sep 17 00:00:00 2001 From: houkms Date: Wed, 18 Sep 2019 14:02:26 +0800 Subject: [PATCH 135/175] fix the int32 pointer issue --- templates/azure/terraform/schemas/basic_set.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/basic_set.erb b/templates/azure/terraform/schemas/basic_set.erb index 3a5ae838ef5b..7cae377be4d0 100644 --- a/templates/azure/terraform/schemas/basic_set.erb +++ b/templates/azure/terraform/schemas/basic_set.erb @@ -2,11 +2,15 @@ format_str = '%s' case sdk_marshal.sdktype.type_definition when Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object - format_str = 'int(*%s)' + format_str = 'int(%s)' end -%> <% if output_var == 'd' -%> +<% if sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer32Object) || sdk_marshal.sdktype.type_definition.is_a?(Api::Azure::SDKTypeDefinition::Integer64Object) -%> +d.Set("<%= prop_name -%>", <%= format_str % "*#{input_var}" -%>) +<% else -%> d.Set("<%= prop_name -%>", <%= format_str % input_var -%>) +<% end -%> <% elsif property.is_a? Api::Type::Enum -%> <%= output_var -%>["<%= prop_name -%>"] = <%= lines(format_str % "#{input_var}") -%> <% else -%> From 2927bef5e11d17e496796129a2a33de54da9a0d1 Mon Sep 17 00:00:00 2001 From: houkms Date: Wed, 18 Sep 2019 15:52:04 +0800 Subject: [PATCH 136/175] fix the nested input and output property issue --- templates/azure/terraform/sdktypes/property_to_sdkobject.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb index f1bd025c041f..6a2557cfaa54 100644 --- a/templates/azure/terraform/sdktypes/property_to_sdkobject.erb +++ b/templates/azure/terraform/sdktypes/property_to_sdkobject.erb @@ -16,7 +16,7 @@ direct_children << sub_api_path if sub_paths.length > 2 direct_children << child_api_path if sub_paths.length == 2 end - end + end if !prop.output end direct_children.to_a.sort.each do |child_api_path| From cfb567d5f4e4c3df520687cf92bf965d4c8b4f7d Mon Sep 17 00:00:00 2001 From: houkms Date: Tue, 24 Sep 2019 14:07:48 +0800 Subject: [PATCH 137/175] enable property checking customization in test file --- provider/azure/example/example.rb | 4 +++ provider/azure/terraform/example/helpers.rb | 38 +++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/provider/azure/example/example.rb b/provider/azure/example/example.rb index 2e33a08d254a..3fc57e7721d0 100644 --- a/provider/azure/example/example.rb +++ b/provider/azure/example/example.rb @@ -32,6 +32,8 @@ class Example < Api::Object attr_reader :description attr_reader :prerequisites attr_reader :properties + attr_reader :property_check_excludes + attr_reader :property_check_includes def validate super @@ -39,6 +41,8 @@ def validate check :description, type: ::String check :prerequisites, type: ::Array, item_type: ExampleReference check :properties, type: ::Hash, required: true + check :property_check_excludes, type: ::Array, item_type: ::String, required: false + check :property_check_includes, type: ::Array, item_type: ::String, required: false end end end diff --git a/provider/azure/terraform/example/helpers.rb b/provider/azure/terraform/example/helpers.rb index 407473328511..1fd18b3f803b 100644 --- a/provider/azure/terraform/example/helpers.rb +++ b/provider/azure/terraform/example/helpers.rb @@ -31,7 +31,12 @@ def get_example_properties_to_check(example_name, object) .transform_values do |v| v.is_a?(String) && !v.match(/\$\{.+\}/).nil? ? :AttrSet : v end - flatten_example_properties_to_check(example_props, true) + includes = example.property_check_includes + excludes = example.property_check_excludes + flat_properties = flatten_example_properties_to_check(example_props, true) + return include_example_properties_to_check(flat_properties, includes) if includes + return exlcude_example_properties_to_check(flat_properties, excludes) if excludes + return flat_properties end def flatten_example_properties_to_check(properties, has_nested_item) @@ -42,13 +47,13 @@ def flatten_example_properties_to_check(properties, has_nested_item) if pv.is_a?(Hash) flat_properties["#{pn}.%"] = pv.length if !pn.include?('.') pv.each do |key, val| - flat_properties["#{pn}.#{key}"] = val + flat_properties["#{pn}.#{key}"] = val if is_valid_value_for_check(val) has_nested_item = true if val.is_a?(Hash) || val.is_a?(Array) end elsif pv.is_a?(Array) flat_properties["#{pn}.#"] = pv.length pv.each_index do |ind| - flat_properties["#{pn}.#{ind}"] = pv[ind] + flat_properties["#{pn}.#{ind}"] = pv[ind] if is_valid_value_for_check(pv[ind]) has_nested_item = true if pv[ind].is_a?(Hash) || pv[ind].is_a?(Array) end else @@ -57,6 +62,33 @@ def flatten_example_properties_to_check(properties, has_nested_item) end return flatten_example_properties_to_check(flat_properties, has_nested_item) end + + def is_valid_value_for_check(value) + return !value.is_a?(String) || value.nil? || value[0] != '$' + end + + def exlcude_example_properties_to_check(properties_to_check, excludes) + return properties_to_check unless excludes + single_excludes = excludes.select{|elem| elem[-1] != '*'} + recursive_excludes = excludes.select{|elem| elem[-1] == '*'} + properties_to_check.select{|key, val| + in_recursive_excludes = false + recursive_excludes.each{|k| in_recursive_excludes ||= k[0..k.length-2] == key[0..k.length-2]} + !single_excludes.include?(key) && !in_recursive_excludes + } + end + + def include_example_properties_to_check(properties_to_check, includes) + return properties_to_check unless includes + single_includes = includes.select{|elem| elem[-1] != '*'} + recursive_includes = includes.select{|elem| elem[-1] == '*'} + filterd_properties = properties_to_check.select{|key, val| + in_recursive_includes = false + recursive_includes.each{|k| in_recursive_includes ||= k[0..k.length-2] == key[0..k.length-2]} + single_includes.include?(key) || in_recursive_includes + } + return filterd_properties + end end end end From afad9328ef696630dde503af368fdb2a0d3c078c Mon Sep 17 00:00:00 2001 From: houkms Date: Tue, 24 Sep 2019 18:31:07 +0800 Subject: [PATCH 138/175] fix the expand/flatten function redeclaration issue --- provider/azure/terraform/sdk/sdk_marshal_descriptor.rb | 6 ++++-- templates/azure/terraform/resource.erb | 2 ++ templates/azure/terraform/schemas/flatten_set.erb | 2 +- .../sdktypes/datetime_and_duration_field_assign.erb | 2 +- .../azure/terraform/sdktypes/expand_func_field_assign.erb | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb index ab334ac9b789..23308a121c0e 100644 --- a/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb +++ b/provider/azure/terraform/sdk/sdk_marshal_descriptor.rb @@ -37,10 +37,12 @@ def clone(typedef_reference = nil, properties = nil) MarshalDescriptor.new @package, @resource, @queue, sdktype, (properties || @properties) end - def enqueue(property) + def enqueue(property, global_queue) ef_desc = ExpandFlattenDescriptor.new(property, self) exist = @queue.find{|q| q.equals?(ef_desc)} - @queue << ef_desc if exist.nil? + global_exist = global_queue.find{|q| q.equals?(ef_desc)} + @queue << ef_desc if global_exist.nil? + global_queue << ef_desc if global_exist.nil? (exist || ef_desc).func_name end end diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index dc6140dcd2a8..0754c38c9dd2 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -24,6 +24,8 @@ package azurerm azure_client_name = object.azure_sdk_definition.go_client sdk_package = object.azure_sdk_definition.go_client_namespace + $global_expand_queue = Array.new unless defined? $global_expand_queue + $global_flatten_queue = Array.new unless defined? $global_flatten_queue expand_queue = Array.new flatten_queue = Array.new diff --git a/templates/azure/terraform/schemas/flatten_set.erb b/templates/azure/terraform/schemas/flatten_set.erb index bf88b1ae62e4..9266bd0ab544 100644 --- a/templates/azure/terraform/schemas/flatten_set.erb +++ b/templates/azure/terraform/schemas/flatten_set.erb @@ -1,4 +1,4 @@ -<% flatten_func_name = sdk_marshal.enqueue(property) -%> +<% flatten_func_name = sdk_marshal.enqueue(property, $global_flatten_queue) -%> <% if output_var == 'd' -%> if err := d.Set("<%= prop_name -%>", flatten<%= sdk_marshal.resource -%><%= flatten_func_name -%>(<%= input_var -%>)); err != nil { return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) diff --git a/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb b/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb index 3e0129da211e..1ee034a30916 100644 --- a/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb +++ b/templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb @@ -2,7 +2,7 @@ <% if property.is_a?(Api::Azure::Type::ISO8601Duration) -%> utils.String(<%= property.name.camelcase(:lower) -%> <% elsif property.is_a?(Api::Azure::Type::ISO8601DateTime) -%> -<% sdk_marshal.enqueue(property) -%> +<% sdk_marshal.enqueue(property, $global_expand_queue) -%> convertStringToDate(<%= property.name.camelcase(:lower) -%> <% end -%> )<%= ',' if in_structure -%> diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 0e8d38877ce5..6d0ff455b176 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -9,7 +9,7 @@ utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> utils.ExpandKeyValuePairs(<%= property.name.camelcase(:lower) -%> <% else -%> -<% expand_func_name = sdk_marshal.enqueue(property) -%> +<% expand_func_name = sdk_marshal.enqueue(property, $global_expand_queue) -%> expand<%= sdk_marshal.resource -%><%= expand_func_name -%>(<%= property.name.camelcase(:lower) -%> <% end -%> )<%= ',' if in_structure -%> \ No newline at end of file From 3618bfdd40b73455a9bb1ed76a831141ec548e1c Mon Sep 17 00:00:00 2001 From: houkms Date: Thu, 26 Sep 2019 13:11:40 +0800 Subject: [PATCH 139/175] enable enum array for azure_sdk_type_definition --- api/azure/sdk_type_definition.rb | 3 +++ provider/azure/terraform/sdk/helpers.rb | 3 ++- templates/azure/terraform/expand_property_method.erb | 9 +++++++++ .../azure/terraform/flatten_property_method.erb | 12 ++++++++++++ templates/azure/terraform/schemas/primitive.erb | 10 ++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 586b8cdd2429..a687d0a74d7c 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -87,6 +87,9 @@ def validate end end + class EnumArrayObject < EnumObject + end + class ISO8601DurationObject < StringObject end diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index 2da7ea917219..e235df571459 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -46,7 +46,8 @@ def property_to_sdk_field_assignment_template(property, sdk_type) 'templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb' when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, Api::Azure::SDKTypeDefinition::IntegerObject, Api::Azure::SDKTypeDefinition::FloatObject, - Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject + Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject, + Api::Azure::SDKTypeDefinition::EnumArrayObject 'templates/azure/terraform/sdktypes/expand_func_field_assign.erb' when Api::Azure::SDKTypeDefinition::Integer32Object, Api::Azure::SDKTypeDefinition::Integer64Object 'templates/azure/terraform/sdktypes/integer_field_assign.erb' diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index cb09199e3cf0..102a525d2c99 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -121,6 +121,15 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go } return req, nil } +<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::Enum) -%> + results := make([]<%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>, 0) + for _, item := range input { + v := item.(string) + result := <%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>(v) + results = append(results, result) + } + return &results +} <% else -%> <% if property.is_a?(Api::Type::ResourceRef) -%> f, err := <%= build_expand_resource_ref('v.(string)', property) %> diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index f23d878e855a..b6e10b4d9ba3 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -47,6 +47,18 @@ func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= results = append(results, v) } + return results +<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::Enum) -%> + results := make([]interface{}, 0) + if input == nil { + return results + } + + for _, item := range *input { + result := string(item) + results = append(results, result) + } + return results <% elsif property.is_a?(Api::Type::Map) -%> if v == nil { diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 6c77e07b9b2d..7c978794e848 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -98,6 +98,16 @@ <% else # array of basic types -%> Elem: &schema.Schema{ Type: <%= tf_types[property.item_type.class] -%>, +<% if property.item_type.is_a?(Api::Type::Enum) + enum_values = property.item_type.values + sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) +-%> + ValidateFunc: validation.StringInSlice([]string{ +<% enum_values.each do |val| -%> + <%= azure_go_literal((sdk_type.go_enum_const_prefix + val.to_s).to_sym, sdk_package) -%>, +<% end -%> + }, false), +<% end -%> }, <% end -%> <% if property.is_set -%> From ef6eb32a7f099023da3d6fb5c18cdbce7a556175 Mon Sep 17 00:00:00 2001 From: Houk <52267283+houkms@users.noreply.github.com> Date: Tue, 15 Oct 2019 11:49:15 +0800 Subject: [PATCH 140/175] adjust tags's position in schema (#55) --- provider/azure/terraform/helpers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index 5eb0e942cd20..b33068c3ae0f 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -22,10 +22,10 @@ def get_property_value(obj, prop_name, default_value) def order_azure_properties(properties, data_source_input = []) special_props = properties.select{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} - other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || data_source_input.include?(p)} + other_props = properties.reject{|p| p.name == 'name' || p.name == 'location' || p.name == 'resourceGroupName' || p.name == 'resourceGroup' || p.name == 'tags' || data_source_input.include?(p)} sorted_special = special_props.sort_by{|p| p.name == 'location' ? 2 : p.order } sorted_other = data_source_input.empty? ? order_properties(other_props) : other_props.sort_by(&:name) - sorted_special + sorted_other + sorted_special + sorted_other + properties.select{|p| p.name == 'tags'} end end end From ea4c95b638cd9295153dbbffcc123e78df4f41bc Mon Sep 17 00:00:00 2001 From: Houk <52267283+houkms@users.noreply.github.com> Date: Tue, 15 Oct 2019 11:49:31 +0800 Subject: [PATCH 141/175] support new code style for tags in schema (#52) --- templates/azure/terraform/schemas/datasource_tags.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/datasource_tags.erb b/templates/azure/terraform/schemas/datasource_tags.erb index 6b0d8a2e4c16..9cf0afd45d19 100644 --- a/templates/azure/terraform/schemas/datasource_tags.erb +++ b/templates/azure/terraform/schemas/datasource_tags.erb @@ -1 +1 @@ -"<%= property.name.underscore -%>": tagsForDataSourceSchema(), \ No newline at end of file +"<%= property.name.underscore -%>": tags.SchemaDataSource(), \ No newline at end of file From d6c773b32e60710d49e53b4a215a6ecfd27b671d Mon Sep 17 00:00:00 2001 From: Houk <52267283+houkms@users.noreply.github.com> Date: Tue, 15 Oct 2019 11:49:56 +0800 Subject: [PATCH 142/175] using t instead of tags in sub-properties (#49) --- templates/azure/terraform/expand_property_method.erb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 102a525d2c99..dfbcbc5fa70c 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -78,7 +78,8 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go <% nested_properties.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 4)) if !prop.output -%> <% end -%> @@ -92,7 +93,8 @@ func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go v := item.(map[string]interface{}) <% nested_properties.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_marshal.sdktype.type_definitions).go_variable_name -%> -<% output_var = var_name || prop.name.camelcase(:lower) -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> <%= lines(build_schema_property_get('v', output_var, prop, sdk_marshal, 8)) if !prop.output -%> <% end -%> From e2cd280bd1759d08af8a59a82e8657636750fb31 Mon Sep 17 00:00:00 2001 From: Houk <52267283+houkms@users.noreply.github.com> Date: Tue, 15 Oct 2019 11:50:16 +0800 Subject: [PATCH 143/175] support new code style for Tags (#48) --- provider/azure/terraform/helpers.rb | 8 ++++++++ templates/azure/terraform/resource.erb | 3 ++- .../azure/terraform/sdktypes/primitive_schema_assign.erb | 6 ++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/provider/azure/terraform/helpers.rb b/provider/azure/terraform/helpers.rb index b33068c3ae0f..c2d9ddabd274 100644 --- a/provider/azure/terraform/helpers.rb +++ b/provider/azure/terraform/helpers.rb @@ -27,6 +27,14 @@ def order_azure_properties(properties, data_source_input = []) sorted_other = data_source_input.empty? ? order_properties(other_props) : other_props.sort_by(&:name) sorted_special + sorted_other + properties.select{|p| p.name == 'tags'} end + + def is_tags_defined?(sdk_operation) + sdk_operation.response.has_key?('/tags') + end + + def go_field_name_of_tags(sdk_operation) + sdk_operation.response['/tags'].go_field_name + end end end end diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 0754c38c9dd2..442f0fecc3e9 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -183,7 +183,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <%= lines(build_sdk_object_to_property('resp', 'd', sdk_marshal)) -%> - return nil + return <%= is_tags_defined?(sdk_operation) ? "tags.FlattenAndSet(d, resp.#{go_field_name_of_tags(sdk_operation)})" : 'nil' -%> + } <% if !combine_create_update -%> diff --git a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb index ef3eebb8cfe5..71d2e5e00dd3 100644 --- a/templates/azure/terraform/sdktypes/primitive_schema_assign.erb +++ b/templates/azure/terraform/sdktypes/primitive_schema_assign.erb @@ -1,4 +1,6 @@ <% input_var = sdk_marshal.sdktype.type_definition.go_variable_name || input + "." + sdk_marshal.sdktype.type_definition.go_field_name -%> -<% get_properties_matching_sdk_reference(sdk_marshal.properties, sdk_marshal.sdktype.typedef_reference).each do |property| -%> -<%= lines(build_schema_property_set(input_var, output, property, sdk_marshal.clone())) -%> +<% get_properties_matching_sdk_reference(sdk_marshal.properties, sdk_marshal.sdktype.typedef_reference).each do |property| + if !property.is_a?(Api::Azure::Type::Tags) -%> +<%= lines(build_schema_property_set(input_var, output, property, sdk_marshal.clone())) -%> +<% end -%> <% end -%> \ No newline at end of file From 18d511c5da6a3fb2bb0806e4aaa72fc89294b052 Mon Sep 17 00:00:00 2001 From: houkms Date: Tue, 15 Oct 2019 11:23:42 +0800 Subject: [PATCH 144/175] support float array type property --- api/azure/sdk_type_definition.rb | 3 +++ provider/azure/terraform/schema.rb | 1 + provider/azure/terraform/sdk/helpers.rb | 5 ++++- provider/azure/terraform_extension.rb | 1 + templates/azure/terraform/schemas/float_array_set.erb | 7 +++++++ .../azure/terraform/sdktypes/float_array_field_assign.erb | 3 +++ 6 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 templates/azure/terraform/schemas/float_array_set.erb create mode 100644 templates/azure/terraform/sdktypes/float_array_field_assign.erb diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 69c27552f3e8..014ccb359679 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -74,6 +74,9 @@ class Integer64ArrayObject < SDKTypeDefinition class FloatObject < SDKTypeDefinition end + class FloatArrayObject < FloatObject + end + class StringObject < SDKTypeDefinition end diff --git a/provider/azure/terraform/schema.rb b/provider/azure/terraform/schema.rb index df2171e5d398..184c440bffcc 100644 --- a/provider/azure/terraform/schema.rb +++ b/provider/azure/terraform/schema.rb @@ -128,6 +128,7 @@ def schema_property_set_template(property) return 'templates/azure/terraform/schemas/string_array_set.erb' if property.is_a?(Api::Type::Array) && (property.item_type.is_a?(Api::Type::String) || property.item_type == "Api::Type::String" || property.item_type == "Api::Azure::Type::ResourceReference") return 'templates/azure/terraform/schemas/integer_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type == "Api::Type::Integer" + return 'templates/azure/terraform/schemas/float_array_set.erb' if property.is_a?(Api::Type::Array) && property.item_type == "Api::Type::Double" return 'templates/azure/terraform/schemas/key_value_pairs_set.erb' if property.is_a?(Api::Type::KeyValuePairs) 'templates/azure/terraform/schemas/flatten_set.erb' else diff --git a/provider/azure/terraform/sdk/helpers.rb b/provider/azure/terraform/sdk/helpers.rb index e235df571459..8e3787c5b940 100644 --- a/provider/azure/terraform/sdk/helpers.rb +++ b/provider/azure/terraform/sdk/helpers.rb @@ -42,6 +42,8 @@ def property_to_sdk_field_assignment_template(property, sdk_type) case sdk_type when Api::Azure::SDKTypeDefinition::Integer32ArrayObject, Api::Azure::SDKTypeDefinition::Integer64ArrayObject 'templates/azure/terraform/sdktypes/integer_array_field_assign.erb' + when Api::Azure::SDKTypeDefinition::FloatArrayObject + 'templates/azure/terraform/sdktypes/float_array_field_assign.erb' when Api::Azure::SDKTypeDefinition::ISO8601DateTimeObject, Api::Azure::SDKTypeDefinition::ISO8601DurationObject 'templates/azure/terraform/sdktypes/datetime_and_duration_field_assign.erb' when Api::Azure::SDKTypeDefinition::BooleanObject, Api::Azure::SDKTypeDefinition::StringObject, @@ -70,7 +72,8 @@ def property_to_schema_assignment_template(property, sdk_operation, api_path) Api::Azure::SDKTypeDefinition::Integer64Object, Api::Azure::SDKTypeDefinition::FloatObject, Api::Azure::SDKTypeDefinition::StringArrayObject, Api::Azure::SDKTypeDefinition::StringMapObject, Api::Azure::SDKTypeDefinition::ISO8601DateTimeObject, Api::Azure::SDKTypeDefinition::ISO8601DurationObject, - Api::Azure::SDKTypeDefinition::Integer32ArrayObject, Api::Azure::SDKTypeDefinition::Integer64ArrayObject + Api::Azure::SDKTypeDefinition::Integer32ArrayObject, Api::Azure::SDKTypeDefinition::Integer64ArrayObject, + Api::Azure::SDKTypeDefinition::FloatArrayObject 'templates/azure/terraform/sdktypes/primitive_schema_assign.erb' when Api::Azure::SDKTypeDefinition::EnumObject 'templates/azure/terraform/sdktypes/enum_schema_assign.erb' diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index fecb07a8d409..ce0b03461132 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -52,6 +52,7 @@ def azure_tf_types(map) map[Api::Azure::Type::ISO8601Duration] = 'schema.TypeString' map['Api::Azure::Type::ResourceReference'] = 'schema.TypeString' map['Api::Type::Integer'] = 'schema.TypeInt' + map['Api::Type::Double'] = 'schema.TypeFloat' map end diff --git a/templates/azure/terraform/schemas/float_array_set.erb b/templates/azure/terraform/schemas/float_array_set.erb new file mode 100644 index 000000000000..69b3d2532aba --- /dev/null +++ b/templates/azure/terraform/schemas/float_array_set.erb @@ -0,0 +1,7 @@ +<% if output_var == 'd' -%> +if err := d.Set("<%= prop_name -%>", utils.FlattenFloat64Slice(<%= input_var -%>)); err != nil { + return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) +} +<% else -%> +<%= output_var -%>["<%= prop_name -%>"] = utils.FlattenFloat64Slice(<%= input_var -%>) +<% end -%> diff --git a/templates/azure/terraform/sdktypes/float_array_field_assign.erb b/templates/azure/terraform/sdktypes/float_array_field_assign.erb new file mode 100644 index 000000000000..3ab87586aa8a --- /dev/null +++ b/templates/azure/terraform/sdktypes/float_array_field_assign.erb @@ -0,0 +1,3 @@ +<%= sdk_marshal.sdktype.go_field_name -%><%= in_structure ? ': ' : ' = ' -%> +utils.ExpandFloat64Slice(<%= property.name.camelcase(:lower) -%> +)<%= ',' if in_structure -%> From de38a49e3df43bbdb9ec27c0d1502df2ba431f8e Mon Sep 17 00:00:00 2001 From: houkms Date: Thu, 17 Oct 2019 16:53:20 +0800 Subject: [PATCH 145/175] code style adjustment when handling resource import --- templates/azure/terraform/resource.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 442f0fecc3e9..d6326f423cd4 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -100,14 +100,14 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% end -%> if features.ShouldResourcesBeImported() && d.IsNewResource() { - resp, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> + existing, err := <%= lines(build_sdk_func_invocation(object.azure_sdk_definition.read)) -%> if err != nil { - if !utils.ResponseWasNotFound(resp.Response) { + if !utils.ResponseWasNotFound(existing.Response) { return <%= lines(build_errorf_with_resource_name("Error checking for present of existing %s", true, object.azure_sdk_definition.read, properties, object)) -%> } } - if !utils.ResponseWasNotFound(resp.Response) { - return tf.ImportAsExistsError("<%= terraform_name -%>", *resp.ID) + if existing.ID != nil && *existing.ID != "" { + return tf.ImportAsExistsError("<%= terraform_name -%>", *existing.ID) } } From d8afc4be135da4bad108296d3c128e59527cdc51 Mon Sep 17 00:00:00 2001 From: houkms Date: Thu, 17 Oct 2019 12:00:16 +0800 Subject: [PATCH 146/175] fix issue in enum_array as output --- templates/azure/terraform/schemas/primitive.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index 7c978794e848..ab12816d1528 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -98,7 +98,7 @@ <% else # array of basic types -%> Elem: &schema.Schema{ Type: <%= tf_types[property.item_type.class] -%>, -<% if property.item_type.is_a?(Api::Type::Enum) +<% if property.item_type.is_a?(Api::Type::Enum) && property.validation.nil? && !property.output enum_values = property.item_type.values sdk_type = get_sdk_typedef_by_references(property.azure_sdk_references, object.azure_sdk_definition.create.request) -%> From 9a45dd3e2e3e00202a88e6fb54d10e535503653a Mon Sep 17 00:00:00 2001 From: magodo Date: Fri, 8 Nov 2019 13:00:22 +0800 Subject: [PATCH 147/175] SDKTypeDefinitionOverride support sublcass with concrete type definition Previously all overriden attribute under `request/response` is of `SDKTypeDefinitionOverride` type. However, sometimes the overriden field's type contain some special attribute, which might need the capability to be overriden, then you will need to export this field as `attribute` in `SDKTypeDefinitionOverride` (otherwise, you will end up with errros complaining your override has extraneous instance variable). This might work at first, however, when this kind of request increase, your `SDKTypeDefinitionOverride` will end up to be a mess. So I choose to inherit `SDKTypeDefinitionOverride` and define concrete SDK Type's override class (the same way as concrete SDK type against `SDKTypeDefinition`). Once you need to export some field to be overridable, you just export them in the concrete type override class. And furthermore, you need to define the `merge_overrides!` in concrete type class (not the override class), so that when merging overriden to overridee class, your exported field will got merged. This change extend the syntax in `terraform.yaml/ansible.yaml` in way that you can specify the concrete type for fields under `request`/`response` (e.g. you will have to specify the type in above example). On the otherhand, this change should hopefully has no impact to existing override yamls (so no change is needed for existing ones). --- api/azure/sdk_type_definition.rb | 5 ++ api/azure/sdk_type_definition_override.rb | 56 +++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 014ccb359679..31e9f7a083eb 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -89,6 +89,11 @@ def validate check :go_enum_type_name, type: ::String check :go_enum_const_prefix, type: ::String, default: '' end + + def merge_overrides!(overrides) + @go_enum_type_name = overrides.go_enum_type_name unless overrides.go_enum_type_name.nil? + @go_enum_const_prefix = overrides.go_enum_const_prefix unless overrides.go_enum_const_prefix.nil? + end end class EnumArrayObject < EnumObject diff --git a/api/azure/sdk_type_definition_override.rb b/api/azure/sdk_type_definition_override.rb index c74451660c37..946d9ad5ad25 100644 --- a/api/azure/sdk_type_definition_override.rb +++ b/api/azure/sdk_type_definition_override.rb @@ -22,6 +22,62 @@ def validate super check :remove, type: :boolean, default: false end + + class BooleanObjectOverride < SDKTypeDefinitionOverride + end + + class IntegerObjectOverride < SDKTypeDefinitionOverride + end + + class Integer32ObjectOverride < SDKTypeDefinitionOverride + end + + class Integer64ObjectOverride < SDKTypeDefinitionOverride + end + + class Integer32ArrayObjectOverride < SDKTypeDefinitionOverride + end + + class Integer64ArrayObjectOverride < SDKTypeDefinitionOverride + end + + class FloatObjectOverride < SDKTypeDefinitionOverride + end + + class StringObjectOverride < SDKTypeDefinitionOverride + end + + class EnumObjectOverride < SDKTypeDefinitionOverride + attr_reader :go_enum_type_name + attr_reader :go_enum_const_prefix + + def validate + super + check :go_enum_type_name, type: ::String + check :go_enum_const_prefix, type: ::String, default: '' + end + end + + class EnumArrayObjectOverride < EnumObjectOverride + end + + class ISO8601DurationObjectOverride < StringObjectOverride + end + + class ISO8601DateTimeObjectOverride < SDKTypeDefinitionOverride + end + + class ComplexObjectOverride < SDKTypeDefinitionOverride + end + + class StringArrayObjectOverride < SDKTypeDefinitionOverride + end + + class ComplexArrayObjectOverride < ComplexObjectOverride + end + + class StringMapObjectOverride < SDKTypeDefinitionOverride + end end end end From 51c45dbffd1b7407f8e64254ec907533651d89f7 Mon Sep 17 00:00:00 2001 From: magodo Date: Fri, 8 Nov 2019 17:01:07 +0800 Subject: [PATCH 148/175] Update api/azure/sdk_type_definition.rb Co-Authored-By: Houk <52267283+houkms@users.noreply.github.com> --- api/azure/sdk_type_definition.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 31e9f7a083eb..3da006510b1b 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -91,6 +91,7 @@ def validate end def merge_overrides!(overrides) + super @go_enum_type_name = overrides.go_enum_type_name unless overrides.go_enum_type_name.nil? @go_enum_const_prefix = overrides.go_enum_const_prefix unless overrides.go_enum_const_prefix.nil? end From 7ada62ae19ab1c8775426fbf1927e05581d33741 Mon Sep 17 00:00:00 2001 From: magodo Date: Sat, 9 Nov 2019 19:52:28 +0800 Subject: [PATCH 149/175] Update api/azure/sdk_type_definition.rb Co-Authored-By: Houk <52267283+houkms@users.noreply.github.com> --- api/azure/sdk_type_definition.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index 3da006510b1b..d5e9d32c7f50 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -91,7 +91,7 @@ def validate end def merge_overrides!(overrides) - super + super @go_enum_type_name = overrides.go_enum_type_name unless overrides.go_enum_type_name.nil? @go_enum_const_prefix = overrides.go_enum_const_prefix unless overrides.go_enum_const_prefix.nil? end From a15ccfbc940286ac01edbdda22c2d82f687a8e90 Mon Sep 17 00:00:00 2001 From: magodo Date: Sun, 10 Nov 2019 12:18:09 +0800 Subject: [PATCH 150/175] Add prop option to compact e/f func name Introduce a new property option: `compact_ef_func_name` to compact expand/flatten function name. E/F func name is constrcuted as: `resource_name` + `go_sdk_type_name`. In some cases the `go_sdk_type_name` might use `resource_name` as prefix, which in most case is redundent (cause without which, there is no name conflict inside that go package). So as to make tf reviewer happy, we can turn that option on. --- provider/azure/terraform/property_override.rb | 2 ++ provider/azure/terraform_extension.rb | 12 ++++++++++++ templates/azure/terraform/expand_property_method.erb | 6 +++--- .../azure/terraform/flatten_property_method.erb | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index f36d0d9245a7..f5adb7e1d9f7 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -28,6 +28,7 @@ def self.attributes custom_schema_get custom_schema_set custom_sdkfield_assign + compact_ef_func_name ]) end @@ -43,6 +44,7 @@ def validate check :custom_schema_get, type: ::String check :custom_schema_set, type: ::String check :custom_sdkfield_assign, type: ::String + check :compact_ef_func_name, {type: :boolean, default: false} end end diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index ce0b03461132..eb0ab88332d7 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -113,6 +113,18 @@ def compile_datasource(data) data.generate('templates/azure/terraform/datasource.html.markdown.erb', filepath, self) end + def build_ef_func_name(resource_name, type_name, compact: false) + result = resource_name + type_name + # compact resource_name and type_name with potential overlapping + if compact + (0...type_name.length).each do |idx| + if resource_name.end_with? type_name[0..idx] + result = resource_name + type_name[idx + 1..-1] + end + end + end + result + end end end end diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index dfbcbc5fa70c..04e0dce96dd1 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -23,7 +23,7 @@ func convertStringToDate(input interface{}) *date.Time { return &result } <% elsif property.is_a?(Api::Type::Map) -%> -func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { +func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { if v == nil { return map[string]interface{}{}, nil } @@ -52,7 +52,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in <%# lines(build_azure_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> -func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { +func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { if v == nil { return map[string]string{}, nil } @@ -63,7 +63,7 @@ func expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%>(v in return m, nil } <% elsif tf_types.include?(property.class) -%> -func expand<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { +func expand<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, compact: property.compact_ef_func_name) -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% if !property.nested_properties.empty? nested_properties = property.nested_properties diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index b6e10b4d9ba3..8463117639f7 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -22,7 +22,7 @@ property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= sdk_marshal.resource -%><%= descriptor.func_name -%>(input *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { +func flatten<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, compact: property.compact_ef_func_name) -%>(input *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> if input == nil { return make([]interface{}, 0) From 872973eef8bef7a3ee263911551689ebaa3b0478 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 12 Nov 2019 15:31:52 +0800 Subject: [PATCH 151/175] also modify func name on caller side --- templates/azure/terraform/schemas/flatten_set.erb | 4 ++-- .../azure/terraform/sdktypes/expand_func_field_assign.erb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/azure/terraform/schemas/flatten_set.erb b/templates/azure/terraform/schemas/flatten_set.erb index 9266bd0ab544..87d98aec38c3 100644 --- a/templates/azure/terraform/schemas/flatten_set.erb +++ b/templates/azure/terraform/schemas/flatten_set.erb @@ -1,8 +1,8 @@ <% flatten_func_name = sdk_marshal.enqueue(property, $global_flatten_queue) -%> <% if output_var == 'd' -%> -if err := d.Set("<%= prop_name -%>", flatten<%= sdk_marshal.resource -%><%= flatten_func_name -%>(<%= input_var -%>)); err != nil { +if err := d.Set("<%= prop_name -%>", flatten<%= build_ef_func_name(sdk_marshal.resource, flatten_func_name, compact: property.compact_ef_func_name) -%>(<%= input_var -%>)); err != nil { return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) } <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = flatten<%= sdk_marshal.resource -%><%= flatten_func_name -%>(<%= input_var -%>) +<%= output_var -%>["<%= prop_name -%>"] = flatten<%= build_ef_func_name(sdk_marshal.resource, flatten_func_name, compact: property.compact_ef_func_name) -%>(<%= input_var -%>) <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 6d0ff455b176..5ee865492c72 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -10,6 +10,6 @@ utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> utils.ExpandKeyValuePairs(<%= property.name.camelcase(:lower) -%> <% else -%> <% expand_func_name = sdk_marshal.enqueue(property, $global_expand_queue) -%> -expand<%= sdk_marshal.resource -%><%= expand_func_name -%>(<%= property.name.camelcase(:lower) -%> +expand<%= build_ef_func_name(sdk_marshal.resource, expand_func_name, compact: property.compact_ef_func_name) -%>(<%= property.name.camelcase(:lower) -%> <% end -%> )<%= ',' if in_structure -%> \ No newline at end of file From 206d33362e9e219d3d7fb1c78543baf8aed4e348 Mon Sep 17 00:00:00 2001 From: magodo Date: Wed, 13 Nov 2019 11:11:28 +0800 Subject: [PATCH 152/175] cover more missing parts --- templates/azure/terraform/expand_property_method.erb | 2 +- templates/azure/terraform/flatten_property_method.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 04e0dce96dd1..42ec77eba3f9 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -34,7 +34,7 @@ func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(prope <% property.value_type.nested_properties.each do |prop| -%> <% next if prop.name == property.key_name -%> - transformed<%= titlelize_property(prop) -%>, err := expand<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) + transformed<%= titlelize_property(prop) -%>, err := expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) if err != nil { return nil, err } diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index 8463117639f7..24d55c1fedf4 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -71,7 +71,7 @@ func flatten<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, c transformed = append(transformed, map[string]interface{}{ "<%= property.key_name -%>": k, <% property.value_type.properties.each do |prop| -%> - "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= sdk_marshal.resource -%><%= titlelize_property(property) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), + "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), <% end -%> }) } From 3839e851e0ff6cc4f49c6b9098c8e0845d057dc1 Mon Sep 17 00:00:00 2001 From: magodo Date: Wed, 13 Nov 2019 11:29:30 +0800 Subject: [PATCH 153/175] Provide custom ef name instead of compacting Instead of compacting resource_name and go__type_name, allow user to specify a custom ef func name. --- provider/azure/terraform/property_override.rb | 4 ++-- provider/azure/terraform_extension.rb | 13 ------------- .../azure/terraform/expand_property_method.erb | 8 ++++---- .../azure/terraform/flatten_property_method.erb | 4 ++-- templates/azure/terraform/schemas/flatten_set.erb | 4 ++-- .../terraform/sdktypes/expand_func_field_assign.erb | 2 +- 6 files changed, 11 insertions(+), 24 deletions(-) diff --git a/provider/azure/terraform/property_override.rb b/provider/azure/terraform/property_override.rb index f5adb7e1d9f7..dbd4d481eeea 100644 --- a/provider/azure/terraform/property_override.rb +++ b/provider/azure/terraform/property_override.rb @@ -28,7 +28,7 @@ def self.attributes custom_schema_get custom_schema_set custom_sdkfield_assign - compact_ef_func_name + custom_ef_func_name ]) end @@ -44,7 +44,7 @@ def validate check :custom_schema_get, type: ::String check :custom_schema_set, type: ::String check :custom_sdkfield_assign, type: ::String - check :compact_ef_func_name, {type: :boolean, default: false} + check :custom_ef_func_name, type: ::String end end diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index eb0ab88332d7..ad58843b49f0 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -112,19 +112,6 @@ def compile_datasource(data) filepath = File.join(target_folder, "#{name}.html.markdown") data.generate('templates/azure/terraform/datasource.html.markdown.erb', filepath, self) end - - def build_ef_func_name(resource_name, type_name, compact: false) - result = resource_name + type_name - # compact resource_name and type_name with potential overlapping - if compact - (0...type_name.length).each do |idx| - if resource_name.end_with? type_name[0..idx] - result = resource_name + type_name[idx + 1..-1] - end - end - end - result - end end end end diff --git a/templates/azure/terraform/expand_property_method.erb b/templates/azure/terraform/expand_property_method.erb index 42ec77eba3f9..20ce0e50604b 100644 --- a/templates/azure/terraform/expand_property_method.erb +++ b/templates/azure/terraform/expand_property_method.erb @@ -23,7 +23,7 @@ func convertStringToDate(input interface{}) *date.Time { return &result } <% elsif property.is_a?(Api::Type::Map) -%> -func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { +func expand<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+titlelize_property(property) : property.custom_ef_func_name -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]interface{}, error) { if v == nil { return map[string]interface{}{}, nil } @@ -34,7 +34,7 @@ func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(prope <% property.value_type.nested_properties.each do |prop| -%> <% next if prop.name == property.key_name -%> - transformed<%= titlelize_property(prop) -%>, err := expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) + transformed<%= titlelize_property(prop) -%>, err := expand<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+titlelize_property(property) : property.custom_ef_func_name -%><%= titlelize_property(prop) -%>(original["<%= Google::StringUtils.underscore(prop.name) -%>"], d, config) if err != nil { return nil, err } @@ -52,7 +52,7 @@ func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(prope <%# lines(build_azure_expand_method(sdk_marshal.resource + titlelize_property(property), prop), 1) -%> <% end -%> <% elsif property.is_a?(Api::Type::KeyValuePairs) -%> -func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { +func expand<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+titlelize_property(property) : property.custom_ef_func_name -%>(v interface{}, d *schema.ResourceData, config *Config) (map[string]string, error) { if v == nil { return map[string]string{}, nil } @@ -63,7 +63,7 @@ func expand<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(prope return m, nil } <% elsif tf_types.include?(property.class) -%> -func expand<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, compact: property.compact_ef_func_name) -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { +func expand<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+descriptor.func_name : property.custom_ef_func_name -%>(input <%= go_type(property) -%>) *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%> { <% if !property.nested_properties.empty? nested_properties = property.nested_properties diff --git a/templates/azure/terraform/flatten_property_method.erb b/templates/azure/terraform/flatten_property_method.erb index 24d55c1fedf4..17461782f151 100644 --- a/templates/azure/terraform/flatten_property_method.erb +++ b/templates/azure/terraform/flatten_property_method.erb @@ -22,7 +22,7 @@ property: property)) -%> <% else -%> <% if tf_types.include?(property.class) -%> -func flatten<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, compact: property.compact_ef_func_name) -%>(input *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { +func flatten<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+descriptor.func_name : property.custom_ef_func_name -%>(input *<%= '[]' if property.is_a?(Api::Type::Array) -%><%= sdk_marshal.package -%>.<%= sdk_marshal.sdktype.go_type_name -%>) []interface{} { <% if property.is_a?(Api::Type::NestedObject) -%> if input == nil { return make([]interface{}, 0) @@ -71,7 +71,7 @@ func flatten<%= build_ef_func_name(sdk_marshal.resource, descriptor.func_name, c transformed = append(transformed, map[string]interface{}{ "<%= property.key_name -%>": k, <% property.value_type.properties.each do |prop| -%> - "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= build_ef_func_name(sdk_marshal.resource, titlelize_property(property), compact: property.compact_ef_func_name) -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), + "<%= Google::StringUtils.underscore(prop.name) -%>": flatten<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+titlelize_property(property) : property.custom_ef_func_name -%><%= titlelize_property(prop) -%>(original["<%= prop.api_name -%>"]), <% end -%> }) } diff --git a/templates/azure/terraform/schemas/flatten_set.erb b/templates/azure/terraform/schemas/flatten_set.erb index 87d98aec38c3..5c74aed6fd99 100644 --- a/templates/azure/terraform/schemas/flatten_set.erb +++ b/templates/azure/terraform/schemas/flatten_set.erb @@ -1,8 +1,8 @@ <% flatten_func_name = sdk_marshal.enqueue(property, $global_flatten_queue) -%> <% if output_var == 'd' -%> -if err := d.Set("<%= prop_name -%>", flatten<%= build_ef_func_name(sdk_marshal.resource, flatten_func_name, compact: property.compact_ef_func_name) -%>(<%= input_var -%>)); err != nil { +if err := d.Set("<%= prop_name -%>", flatten<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+flatten_func_name : property.custom_ef_func_name -%>(<%= input_var -%>)); err != nil { return fmt.Errorf("Error setting `<%= prop_name -%>`: %+v", err) } <% else -%> -<%= output_var -%>["<%= prop_name -%>"] = flatten<%= build_ef_func_name(sdk_marshal.resource, flatten_func_name, compact: property.compact_ef_func_name) -%>(<%= input_var -%>) +<%= output_var -%>["<%= prop_name -%>"] = flatten<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+flatten_func_name : property.custom_ef_func_name -%>(<%= input_var -%>) <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb index 5ee865492c72..727c7254be2a 100644 --- a/templates/azure/terraform/sdktypes/expand_func_field_assign.erb +++ b/templates/azure/terraform/sdktypes/expand_func_field_assign.erb @@ -10,6 +10,6 @@ utils.ExpandStringSlice(<%= property.name.camelcase(:lower) -%> utils.ExpandKeyValuePairs(<%= property.name.camelcase(:lower) -%> <% else -%> <% expand_func_name = sdk_marshal.enqueue(property, $global_expand_queue) -%> -expand<%= build_ef_func_name(sdk_marshal.resource, expand_func_name, compact: property.compact_ef_func_name) -%>(<%= property.name.camelcase(:lower) -%> +expand<%= property.custom_ef_func_name.nil? ? sdk_marshal.resource+expand_func_name : property.custom_ef_func_name -%>(<%= property.name.camelcase(:lower) -%> <% end -%> )<%= ',' if in_structure -%> \ No newline at end of file From ce4ff580240f750ea3108ee041616a6ab2612a62 Mon Sep 17 00:00:00 2001 From: magodo Date: Fri, 15 Nov 2019 14:28:08 +0800 Subject: [PATCH 154/175] Fix bug after opting specific override typing If the override sdk type def is not type specific, then we should not tackle with the type specific part in merge method. --- api/azure/sdk_type_definition.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/azure/sdk_type_definition.rb b/api/azure/sdk_type_definition.rb index d5e9d32c7f50..8651d96d1294 100644 --- a/api/azure/sdk_type_definition.rb +++ b/api/azure/sdk_type_definition.rb @@ -92,6 +92,11 @@ def validate def merge_overrides!(overrides) super + # `overrides` is instance of either SDKTypeDefinitionOverride or + # SDKTypeDefinitionOverride::EnumObjectOverride. We only merge type specific + # attribute for the latter case. + return unless overrides.instance_of? Api::Azure::SDKTypeDefinitionOverride::EnumObjectOverride + @go_enum_type_name = overrides.go_enum_type_name unless overrides.go_enum_type_name.nil? @go_enum_const_prefix = overrides.go_enum_const_prefix unless overrides.go_enum_const_prefix.nil? end From f0d72d4b117145cf5e2f4f73795e2cb2489abce3 Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 18 Nov 2019 15:15:56 +0800 Subject: [PATCH 155/175] Specify erb filename so as to debug template E.g. rubymine needs that for debugging template. --- compile/core.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/compile/core.rb b/compile/core.rb index 9bd1f7c7cbcc..78d220407120 100644 --- a/compile/core.rb +++ b/compile/core.rb @@ -169,7 +169,7 @@ def to_yaml(obj, options = {}) # Refer to Compile::Core.compile for full details about the compilation # process. def compile_file(ctx, source) - compile_string(ctx, File.read(source)) + compile_string(ctx, File.read(source), filename: source) rescue StandardError => e puts "Error compiling file: #{source}" raise e @@ -232,11 +232,13 @@ def lines_before(code, number = 0) # Compiles an ERB template using the data from a key-value pair. # The key-value pair may be a Hash or a Binding - def compile_string(ctx, source) + def compile_string(ctx, source, filename: nil) + erb = ERB.new(source, trim_mode: '->') + erb.filename = filename if ctx.is_a? Binding - ERB.new(source, trim_mode: '->').result(ctx).split("\n") + erb.result(ctx).split("\n") elsif ctx.is_a? Hash - ERB.new(source, trim_mode: '->').result( + erb.result( OpenStruct.new(ctx).instance_eval { binding.of_caller(1) } ).split("\n") else From 3bca7b685e4317d94a10c5116d5359b4819a4aa2 Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 18 Nov 2019 15:18:00 +0800 Subject: [PATCH 156/175] Enable yaml alias in YAML.safe_load Yaml anchor, alias is helpful to DRY. E.g. for batchaccount api.yaml, we can anchor sdk def for `resourceGroup` and `accountName` and alias that at CRUD request. For the alias's name, magic module already support private field to skip yaml validation, in other word, magic module already has some mechanism to work around extraneous field checking. We can use that mechanism to name our aliases, starts with '__'. --- google/yaml_validator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/yaml_validator.rb b/google/yaml_validator.rb index 9de70fdcec67..1ed198a4f634 100644 --- a/google/yaml_validator.rb +++ b/google/yaml_validator.rb @@ -24,7 +24,7 @@ def parse(content) # TODO(nelsonjr): Allow specifying which symbols to restrict it further. # But it requires inspecting all configuration files for symbol sources, # such as Enum values. Leaving it as a nice-to-have for the future. - YAML.safe_load(content, allowed_classes) + YAML.safe_load(content, allowed_classes, aliases: true) end def allowed_classes From 31f0d2d60665764fb624aa7111fafadee149fa38 Mon Sep 17 00:00:00 2001 From: magodo Date: Wed, 20 Nov 2019 11:13:38 +0800 Subject: [PATCH 157/175] Filter out `location` from updatable_properties Since `location` is always set to be force new, so we should skip it in update function. Previously if sdk defined `location` as one of update request fields, the generated code will end up with using an undefined variable of location during sdk to property part in update function. --- templates/azure/terraform/resource.erb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index d6326f423cd4..0378cd144041 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -12,6 +12,7 @@ package azurerm settable_properties = properties.reject{ |v| v.output && !v.is_a?(Api::Type::Fingerprint) }.reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} + .reject { |p| p.name == "location" } # location is always force new in terraform output_properties = properties.reject{|p| p.name == 'id'} # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager api_name_lower = String.new(product_ns) @@ -194,12 +195,10 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res ctx := meta.(*ArmClient).StopContext <% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> -<% if prop.name != "location" -%> -<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> -<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> -<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> -<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> -<% end -%> +<% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> +<% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> +<% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> +<%= lines(build_schema_property_get('d', output_var, prop, sdk_marshal, 4)) -%> <% end -%> <%= sdk_operation.request['/'].go_variable_name -%> := <%= sdk_package -%>.<%= sdk_operation.request['/'].go_type_name -%>{ From ed19aa743f43f067e3bcff898a046bfc9d6177a6 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 3 Dec 2019 09:34:44 +0800 Subject: [PATCH 158/175] Use timeouts.ForXXX to create context Terraform 2.0 will support customized timeout for each resource's each operation. The `timeouts` subpackage provides instruments to wrap the specified timeout to construct context (if any). --- templates/azure/terraform/datasource.erb | 3 ++- templates/azure/terraform/resource.erb | 14 +++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index df1896742dfc..300767198991 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -32,7 +32,8 @@ func dataSource<%= resource_name -%>() *schema.Resource { func dataSource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(object.azure_sdk_definition.go_client) -%> - ctx := meta.(*ArmClient).StopContext + ctx, cancel := timeouts.ForRead(meta.(*ArmClient).StopContext, d) + defer cancel() <% input_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 0378cd144041..bda458c805ce 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -92,7 +92,8 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff <% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, expand_queue, sdktype, settable_properties -%> func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx := meta.(*ArmClient).StopContext + ctx, cancel := timeouts.<%= combine_create_update ? "ForCreateUpdate" : "ForCreate"-%>(meta.(*ArmClient).StopContext, d) + defer cancel() <% settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> @@ -166,7 +167,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, output_properties -%> func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx := meta.(*ArmClient).StopContext + ctx, cancel := timeouts.ForRead(meta.(*ArmClient).StopContext, d) + defer cancel() <%= lines(build_azure_id_parser(object.azure_sdk_definition.read, object)) -%> @@ -192,9 +194,10 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% sdk_operation = object.azure_sdk_definition.update -%> func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx := meta.(*ArmClient).StopContext + ctx, cancel := timeouts.ForUpdate(meta.(*ArmClient).StopContext, d) + defer cancel() -<% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> + <% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_operation.request).go_variable_name -%> <% special_known_name = (prop.name == 'tags' ? 't' : nil) -%> <% output_var = var_name || special_known_name || prop.name.camelcase(:lower) -%> @@ -230,7 +233,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% sdk_operation = object.azure_sdk_definition.delete -%> func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx := meta.(*ArmClient).StopContext + ctx, cancel := timeouts.ForDelete(meta.(*ArmClient).StopContext, d) + defer cancel() <% if object.mutex -%> lockName, err := replaceVars(d, config, "<%= object.mutex -%>") From e447013e68eeb36094455dc347b4fa60d585ce9a Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 3 Dec 2019 14:02:32 +0800 Subject: [PATCH 159/175] add subcategory header to document template --- templates/azure/terraform/datasource.html.markdown.erb | 1 + templates/azure/terraform/resource.html.markdown.erb | 1 + 2 files changed, 2 insertions(+) diff --git a/templates/azure/terraform/datasource.html.markdown.erb b/templates/azure/terraform/datasource.html.markdown.erb index 7730046def2e..d16542363f80 100644 --- a/templates/azure/terraform/datasource.html.markdown.erb +++ b/templates/azure/terraform/datasource.html.markdown.erb @@ -9,6 +9,7 @@ -%> --- <%= lines(autogen_notice :yaml) -%> +subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" sidebar_current: "docs-azurerm-datasource-<%= resource_name.gsub("_", "-") -%>" diff --git a/templates/azure/terraform/resource.html.markdown.erb b/templates/azure/terraform/resource.html.markdown.erb index 63574e98a90c..04d0fab163d9 100644 --- a/templates/azure/terraform/resource.html.markdown.erb +++ b/templates/azure/terraform/resource.html.markdown.erb @@ -27,6 +27,7 @@ -%> --- <%= lines(autogen_notice :yaml) -%> +subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" sidebar_current: "docs-azurerm-resource-<%= resource_name.gsub("_", "-") -%>" From 9d3f4acdbc100fa072c27ca2a13b1cd1f6531265 Mon Sep 17 00:00:00 2001 From: magodo Date: Wed, 4 Dec 2019 10:40:14 +0800 Subject: [PATCH 160/175] Search example consider foder struct by autorest.cli --- provider/azure/core.rb | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/provider/azure/core.rb b/provider/azure/core.rb index 7045cd63754d..9fa1ba678739 100644 --- a/provider/azure/core.rb +++ b/provider/azure/core.rb @@ -22,15 +22,37 @@ def get_example_by_reference(reference) end def get_example_by_names(example_name, product_name = nil) - spec_dir = File.dirname(@config.config_file) - product_name ||= File.basename(spec_dir) - example_yaml = File.join(File.dirname(spec_dir), product_name, 'examples', @provider, "#{example_name}.yaml") + resource_dir = get_resource_dir(File.dirname(@config.config_file)) + resource_dir = File.join(File.dirname(resource_dir), product_name) unless product_name.nil? + spec_dir = get_spec_dir(resource_dir) + example_yaml = File.join(spec_dir, 'examples', @provider, "#{example_name}.yaml") example = Google::YamlValidator.parse(File.read(example_yaml)) raise "#{example_yaml}(#{example.class}) is not Provider::Azure::Example" unless example.is_a?(Provider::Azure::Example) example.validate example end + # The folder structure generated by autorest.cli is different than the magic-module-spec folder + # structure, where autorest.cli has one more subdirectory named after `package-YY-MM-DD` for each + # resource, which contains the content otherwise had been placed directly under the resource_dir + # in magic-module-spec. + # + # Given a `config_dir` and return the `resource_dir` taking *package-xxx* subdirectory + # into consideration. + def get_resource_dir(config_dir) + return File.dirname(config_dir) if /^package-[\d-]+$/ =~ File.basename(config_dir) + + config_dir + end + + # Given a `resource_dir` and return the `config_dir` taking *package-xxx* subdirectory + # into consideration. + # NOTE: currently we assume there is at most only one subdirectory. + def get_spec_dir(resource_dir) + potential_subdir = Dir.glob(File.join(resource_dir, 'package-[0-9-]*'))[0] + potential_subdir.nil? ? resource_dir : potential_subdir + end + def get_custom_template_path(template_path) return nil if template_path.nil? spec_dir = File.dirname(@config.config_file) From f51a6eb1e31768d627d5fbf12cbecdeead98f167 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 17 Dec 2019 12:46:18 +0800 Subject: [PATCH 161/175] don't set Default for output-only property --- templates/azure/terraform/schemas/primitive.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/primitive.erb b/templates/azure/terraform/schemas/primitive.erb index ab12816d1528..cd66a1bc6d43 100644 --- a/templates/azure/terraform/schemas/primitive.erb +++ b/templates/azure/terraform/schemas/primitive.erb @@ -143,7 +143,7 @@ <% if property.sensitive -%> Sensitive: true, <% end -%> -<% unless property.default_value.nil? || !data_source_input.empty? -%> +<% unless property.output || property.default_value.nil? || !data_source_input.empty? -%> <% if property.is_a?(Api::Type::Enum) -%> Default: <%= azure_go_literal((sdk_type.go_enum_const_prefix + property.default_value.to_s).to_sym, sdk_package) -%>, <% elsif property.is_a?(Api::Azure::Type::BooleanEnum) -%> From e3c8ba70bc64a4dace048d3245a9b38b7fc3317c Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 17 Dec 2019 16:43:49 +0800 Subject: [PATCH 162/175] when searching folder form example, considering suffix of "-preview" --- provider/azure/core.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/azure/core.rb b/provider/azure/core.rb index 9fa1ba678739..841bd4a336c9 100644 --- a/provider/azure/core.rb +++ b/provider/azure/core.rb @@ -40,7 +40,7 @@ def get_example_by_names(example_name, product_name = nil) # Given a `config_dir` and return the `resource_dir` taking *package-xxx* subdirectory # into consideration. def get_resource_dir(config_dir) - return File.dirname(config_dir) if /^package-[\d-]+$/ =~ File.basename(config_dir) + return File.dirname(config_dir) if /^package-[\d-]+(-preview)?$/ =~ File.basename(config_dir) config_dir end From 0c49dcaf8cf9fe66db4c74cfd51ffd31e0b2c9bd Mon Sep 17 00:00:00 2001 From: magodo Date: Wed, 18 Dec 2019 10:15:25 +0800 Subject: [PATCH 163/175] disable the comment at header --- templates/azure/terraform/datasource.erb | 2 +- templates/azure/terraform/datasource.html.markdown.erb | 2 +- templates/azure/terraform/datasource_test.go.erb | 2 +- templates/azure/terraform/resource.erb | 2 +- templates/azure/terraform/resource.html.markdown.erb | 2 +- templates/azure/terraform/test_file.go.erb | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index 300767198991..5a20cf120556 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -1,4 +1,4 @@ -<%= lines(autogen_notice :go) -%> +<%# lines(autogen_notice :go) -%> package azurerm diff --git a/templates/azure/terraform/datasource.html.markdown.erb b/templates/azure/terraform/datasource.html.markdown.erb index d16542363f80..41ac9e2a4d34 100644 --- a/templates/azure/terraform/datasource.html.markdown.erb +++ b/templates/azure/terraform/datasource.html.markdown.erb @@ -8,7 +8,7 @@ output_properties = properties.select{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).nil?} -%> --- -<%= lines(autogen_notice :yaml) -%> +<%# lines(autogen_notice :yaml) -%> subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" diff --git a/templates/azure/terraform/datasource_test.go.erb b/templates/azure/terraform/datasource_test.go.erb index d0ed0d4a12d7..cd0931560e3e 100644 --- a/templates/azure/terraform/datasource_test.go.erb +++ b/templates/azure/terraform/datasource_test.go.erb @@ -1,4 +1,4 @@ -<%= lines(autogen_notice :go) -%> +<%# lines(autogen_notice :go) -%> package azurerm diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index bda458c805ce..3bd37c6bdd4d 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -1,4 +1,4 @@ -<%= lines(autogen_notice :go) -%> +<%# lines(autogen_notice :go) -%> package azurerm diff --git a/templates/azure/terraform/resource.html.markdown.erb b/templates/azure/terraform/resource.html.markdown.erb index 04d0fab163d9..595c25dc449d 100644 --- a/templates/azure/terraform/resource.html.markdown.erb +++ b/templates/azure/terraform/resource.html.markdown.erb @@ -26,7 +26,7 @@ properties = object.all_user_properties.reject{|p| get_property_value(p, 'hide_from_schema', false)} -%> --- -<%= lines(autogen_notice :yaml) -%> +<%# lines(autogen_notice :yaml) -%> subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index f0a576293798..08637ff54b98 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -1,4 +1,4 @@ -<%= lines(autogen_notice :go) -%> +<%# lines(autogen_notice :go) -%> package azurerm From efdfb45508e473d9ee6615417b8c563632eac433 Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 23 Dec 2019 14:12:34 +0800 Subject: [PATCH 164/175] follow new client get scheme --- provider/core.rb | 2 +- templates/azure/terraform/resource.erb | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/provider/core.rb b/provider/core.rb index 605b08eabfa1..33e4d952e200 100644 --- a/provider/core.rb +++ b/provider/core.rb @@ -101,7 +101,7 @@ def generate(template, path, provider) # Files are often generated in parallel. # We can use thread-local variables to ensure that autogen checking # stays specific to the file each thred represents. - raise "#{path} missing autogen" unless Thread.current[:autogen] + raise "#{path} missing autogen" unless Thread.current[:autogen] unless $target_is_azure old_file_chmod_mode = File.stat(template).mode FileUtils.chmod(old_file_chmod_mode, path) diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 3bd37c6bdd4d..569752a402c0 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -15,9 +15,8 @@ package azurerm .reject { |p| p.name == "location" } # location is always force new in terraform output_properties = properties.reject{|p| p.name == 'id'} # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager - api_name_lower = String.new(product_ns) - api_name_lower[0] = api_name_lower[0].downcase - api_client_name = api_name_lower.downcase + provider_name = object.api_name + provider_client_name = object.azure_sdk_definition.go_client -%> <% resource_name = "Arm" + object.name @@ -91,8 +90,8 @@ func resource<%= resource_name -%><%= prop.name.camelize(:upper) -%>SetStyleDiff <% sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, true -%> <% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, expand_queue, sdktype, settable_properties -%> func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx, cancel := timeouts.<%= combine_create_update ? "ForCreateUpdate" : "ForCreate"-%>(meta.(*ArmClient).StopContext, d) + client := meta.(*clients.Client).<%= provider_name -%>.<%= provider_client_name %> + ctx, cancel := timeouts.<%= combine_create_update ? "ForCreateUpdate" : "ForCreate"-%>(meta.(*clients.Client).StopContext, d) defer cancel() <% settable_properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_operation.request).start_with?("/")}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> @@ -166,8 +165,8 @@ func resource<%= resource_name -%><%= create_func_name_postfix -%>(d *schema.Res <% sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, false -%> <% sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, output_properties -%> func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx, cancel := timeouts.ForRead(meta.(*ArmClient).StopContext, d) + client := meta.(*clients.Client).<%= provider_name -%>.<%= provider_client_name %> + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() <%= lines(build_azure_id_parser(object.azure_sdk_definition.read, object)) -%> @@ -193,8 +192,8 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) <% if !combine_create_update -%> <% sdk_operation = object.azure_sdk_definition.update -%> func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx, cancel := timeouts.ForUpdate(meta.(*ArmClient).StopContext, d) + client := meta.(*clients.Client).<%= provider_name -%>.<%= provider_client_name %> + ctx, cancel := timeouts.ForUpdate(meta.(*clients.Client).StopContext, d) defer cancel() <% updatable_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> @@ -232,8 +231,8 @@ func resource<%= resource_name -%><%= update_func_name_postfix -%>(d *schema.Res <% sdk_operation = object.azure_sdk_definition.delete -%> func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= lines(azure_client_name) -%> - ctx, cancel := timeouts.ForDelete(meta.(*ArmClient).StopContext, d) + client := meta.(*clients.Client).<%= provider_name -%>.<%= provider_client_name %> + ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() <% if object.mutex -%> From 7824d7c06a802001dc5538418aed38b1a4dd7ae9 Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 23 Dec 2019 14:14:18 +0800 Subject: [PATCH 165/175] narrow down settable properties to those appears in sdk type definition --- templates/azure/terraform/resource.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 569752a402c0..d42a0c8a263c 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -9,7 +9,9 @@ package azurerm schema_properties = properties.reject{|p| p.name == 'id' || get_property_value(p, 'hide_from_schema', false)} # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. - settable_properties = properties.reject{ |v| v.output && !v.is_a?(Api::Type::Fingerprint) }.reject(&:url_param_only) + settable_properties = properties.reject{|p| get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.create.request).nil?} + .reject{|v| v.output && !v.is_a?(Api::Type::Fingerprint) } + .reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} .reject { |p| p.name == "location" } # location is always force new in terraform From 1053f82078c7699f247fda85bbf96d3cbcc7d5f8 Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 23 Dec 2019 14:31:30 +0800 Subject: [PATCH 166/175] follow hashicorp test refactor --- .../azure/terraform/example/sub_template.rb | 2 +- .../azure/terraform/datasource_test.go.erb | 5 ++--- templates/azure/terraform/test_file.go.erb | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index d1f1f7daa6f1..fc0e250b746b 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -129,7 +129,7 @@ def initialize(type) when :AccLocation @variable_name = @parameter_name = "location" @go_type = "string" - @create_expression = "testLocation()" + @create_expression = "acceptance.Location()" @format_string = "%s" @declare_order = 3 end diff --git a/templates/azure/terraform/datasource_test.go.erb b/templates/azure/terraform/datasource_test.go.erb index cd0931560e3e..d5c928e7e744 100644 --- a/templates/azure/terraform/datasource_test.go.erb +++ b/templates/azure/terraform/datasource_test.go.erb @@ -13,7 +13,6 @@ import ( <% resource_name = object.name terraform_name = "azurerm_" + object.name.underscore - azure_client_name = object.azure_sdk_definition.go_client sdk_operation = object.azure_sdk_definition.read properties = object.all_user_properties @@ -37,8 +36,8 @@ func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing. <% end -%> resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, Steps: []resource.TestStep{ <% test.steps.each do |step| -%> <% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index 08637ff54b98..f9159a4a9bc7 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -16,9 +16,10 @@ import ( <% resource_name = "AzureRM" + object.name terraform_name = "azurerm_" + object.name.underscore - azure_client_name = object.azure_sdk_definition.go_client properties = object.all_user_properties contains_acctests = object.respond_to?(:acctests) && !object.acctests.nil? && !object.acctests.empty? + provider_name = object.api_name + provider_client_name = object.azure_sdk_definition.go_client -%> <% @@ -37,8 +38,8 @@ func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { <% end -%> resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, CheckDestroy: testCheck<%= resource_name -%>Destroy, Steps: []resource.TestStep{ <% test.steps.each do |step| -%> @@ -81,16 +82,16 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec <%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> - client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> + client := acceptance.AzureProvider.Meta().(*clients.Client).<% provider_name -%>.<%= provider_client_name -%> - ctx := testAccProvider.Meta().(*ArmClient).StopContext + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { if utils.ResponseWasNotFound(resp.Response) { return <%= build_errorf_with_resource_name("Bad: %s does not exist", false, object.azure_sdk_definition.delete, properties, object) -%> } - return fmt.Errorf("Bad: Get on <%= azure_client_name -%>: %+v", err) + return fmt.Errorf("Bad: Get on <%= provider_client_name -%>: %+v", err) } return nil @@ -98,9 +99,9 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec } func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { - client := testAccProvider.Meta().(*ArmClient).<%= azure_client_name -%> + client := acceptance.AzureProvider.Meta().(*clients.Client).<% provider_name -%>.<%= provider_client_name -%> - ctx := testAccProvider.Meta().(*ArmClient).StopContext + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext for _, rs := range s.RootModule().Resources { if rs.Type != "<%= terraform_name -%>" { @@ -111,7 +112,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Get on <%= azure_client_name -%>: %+v", err) + return fmt.Errorf("Bad: Get on <%= provider_client_name -%>: %+v", err) } } From 4fc4b82df6660fc704e4f54794d66ad3ab91b56d Mon Sep 17 00:00:00 2001 From: magodo Date: Mon, 23 Dec 2019 17:20:56 +0800 Subject: [PATCH 167/175] follow new client get scheme for datasource --- templates/azure/terraform/datasource.erb | 7 +++++-- templates/azure/terraform/resource.erb | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index 5a20cf120556..e1ed6d602518 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -14,6 +14,9 @@ package azurerm flatten_queue = Array.new sdktype = Provider::Azure::Terraform::SDK::TypeDefinitionDescriptor.new sdk_operation, false sdk_marshal = Provider::Azure::Terraform::SDK::MarshalDescriptor.new sdk_package, resource_name, flatten_queue, sdktype, schema_properties + + provider_name = object.api_name + provider_client_name = object.azure_sdk_definition.go_client -%> func dataSource<%= resource_name -%>() *schema.Resource { @@ -31,8 +34,8 @@ func dataSource<%= resource_name -%>() *schema.Resource { } func dataSource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).<%= lines(object.azure_sdk_definition.go_client) -%> - ctx, cancel := timeouts.ForRead(meta.(*ArmClient).StopContext, d) + client := meta.(*clients.Client).<%= provider_name -%>.<%= provider_client_name %> + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() <% input_properties.sort_by{|p| [p.order, p.name]}.each do |prop| -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index d42a0c8a263c..181b19533e0e 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -16,14 +16,13 @@ package azurerm updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} .reject { |p| p.name == "location" } # location is always force new in terraform output_properties = properties.reject{|p| p.name == 'id'} - # Handwritten TF Operation objects will be shaped like accessContextManager while the Google Go Client will have a name like accesscontextmanager + provider_name = object.api_name provider_client_name = object.azure_sdk_definition.go_client -%> <% resource_name = "Arm" + object.name terraform_name = "azurerm_" + object.name.underscore - azure_client_name = object.azure_sdk_definition.go_client sdk_package = object.azure_sdk_definition.go_client_namespace $global_expand_queue = Array.new unless defined? $global_expand_queue From f79080b0e559f406b340b16dcb9dfc2d525bbe97 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 24 Dec 2019 09:28:18 +0800 Subject: [PATCH 168/175] put generated files to internal/services/ folder --- provider/azure/terraform_extension.rb | 33 +++++++++---------- templates/azure/terraform/datasource.erb | 1 - .../azure/terraform/datasource_test.go.erb | 1 - templates/azure/terraform/resource.erb | 1 - templates/azure/terraform/test_file.go.erb | 5 ++- 5 files changed, 18 insertions(+), 23 deletions(-) diff --git a/provider/azure/terraform_extension.rb b/provider/azure/terraform_extension.rb index ad58843b49f0..276202785b02 100644 --- a/provider/azure/terraform_extension.rb +++ b/provider/azure/terraform_extension.rb @@ -57,11 +57,11 @@ def azure_tf_types(map) end def azure_generate_resource(data) - dir = "azurerm" - target_folder = File.join(data.output_folder, dir) + rp_name = data.object.api_name.downcase + target_folder = File.join(data.output_folder, 'azurerm', 'internal', 'services', rp_name) + FileUtils.mkpath target_folder name = data.object.name.underscore - product_name = data.product.name.underscore filepath = File.join(target_folder, "resource_arm_#{name}.go") data.generate('templates/azure/terraform/resource.erb', filepath, self) @@ -74,18 +74,17 @@ def azure_generate_documentation(data) FileUtils.mkpath target_folder name = data.object.name.underscore - product_name = data.product.name.underscore filepath = File.join(target_folder, "#{name}.html.markdown") data.generate('templates/azure/terraform/resource.html.markdown.erb', filepath, self) end def azure_generate_resource_tests(data) - dir = "azurerm" - target_folder = File.join(data.output_folder, dir) + rp_name = data.object.api_name.downcase + target_folder = File.join(data.output_folder, 'azurerm', 'internal', 'services', rp_name, 'tests') + FileUtils.mkpath target_folder name = data.object.name.underscore - product_name = data.product.name.underscore filepath = File.join(target_folder, "resource_arm_#{name}_test.go") data.product = data.product.name @@ -94,22 +93,22 @@ def azure_generate_resource_tests(data) end def compile_datasource(data) - dir = 'azurerm' - target_folder = File.join(data.output_folder, dir) - FileUtils.mkpath target_folder - name = data.object.name.underscore - product_name = data.product.name.underscore + rp_name = data.object.api_name.downcase - filepath = File.join(target_folder, "data_source_#{name}.go") + datasource_folder = File.join(data.output_folder, 'azurerm', 'internal', 'services', rp_name) + FileUtils.mkpath datasource_folder + filepath = File.join(datasource_folder, "data_source_#{name}.go") data.generate('templates/azure/terraform/datasource.erb', filepath, self) - filepath = File.join(target_folder, "data_source_#{name}_test.go") + datasource_test_folder = File.join(datasource_folder, 'tests') + FileUtils.mkpath datasource_test_folder + filepath = File.join(datasource_test_folder, "data_source_#{name}_test.go") data.generate('templates/azure/terraform/datasource_test.go.erb', filepath, self) - target_folder = File.join(data.output_folder, 'website', 'docs', 'd') - FileUtils.mkpath target_folder - filepath = File.join(target_folder, "#{name}.html.markdown") + datasource_doc_folder = File.join(data.output_folder, 'website', 'docs', 'd') + FileUtils.mkpath datasource_doc_folder + filepath = File.join(datasource_doc_folder, "#{name}.html.markdown") data.generate('templates/azure/terraform/datasource.html.markdown.erb', filepath, self) end end diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index e1ed6d602518..e7d5a7853c31 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -1,5 +1,4 @@ <%# lines(autogen_notice :go) -%> - package azurerm <% diff --git a/templates/azure/terraform/datasource_test.go.erb b/templates/azure/terraform/datasource_test.go.erb index d5c928e7e744..d0e885cc8ac8 100644 --- a/templates/azure/terraform/datasource_test.go.erb +++ b/templates/azure/terraform/datasource_test.go.erb @@ -1,5 +1,4 @@ <%# lines(autogen_notice :go) -%> - package azurerm import ( diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 181b19533e0e..5da0a72f2e9d 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -1,5 +1,4 @@ <%# lines(autogen_notice :go) -%> - package azurerm <%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index f9159a4a9bc7..7a363d614f57 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -1,5 +1,4 @@ <%# lines(autogen_notice :go) -%> - package azurerm import ( @@ -82,7 +81,7 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec <%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> - client := acceptance.AzureProvider.Meta().(*clients.Client).<% provider_name -%>.<%= provider_client_name -%> + client := acceptance.AzureProvider.Meta().(*clients.Client).<%= provider_name -%>.<%= provider_client_name -%> ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext @@ -99,7 +98,7 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec } func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { - client := acceptance.AzureProvider.Meta().(*clients.Client).<% provider_name -%>.<%= provider_client_name -%> + client := acceptance.AzureProvider.Meta().(*clients.Client).<%= provider_name -%>.<%= provider_client_name -%> ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext From d2691fe4c5497169e8bb051dad6acf9cef2869e2 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 24 Dec 2019 16:27:09 +0800 Subject: [PATCH 169/175] testcase impl. change (conform to hashicorp refactor) --- .../azure/terraform/example/sub_template.rb | 4 +-- .../azure/terraform/datasource_test.go.erb | 17 ++++------- templates/azure/terraform/test_file.go.erb | 28 ++++++------------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/provider/azure/terraform/example/sub_template.rb b/provider/azure/terraform/example/sub_template.rb index fc0e250b746b..7843923937ed 100644 --- a/provider/azure/terraform/example/sub_template.rb +++ b/provider/azure/terraform/example/sub_template.rb @@ -109,7 +109,7 @@ def initialize(type) @variable_name = "ri" @parameter_name = "rInt" @go_type = "int" - @create_expression = "tf.AccRandTimeInt()" + @create_expression = "data.RandomInteger" @format_string = "%d" @declare_order = 0 when :AccStorageAccount @@ -129,7 +129,7 @@ def initialize(type) when :AccLocation @variable_name = @parameter_name = "location" @go_type = "string" - @create_expression = "acceptance.Location()" + @create_expression = "data.Locations.Primary" @format_string = "%s" @declare_order = 3 end diff --git a/templates/azure/terraform/datasource_test.go.erb b/templates/azure/terraform/datasource_test.go.erb index d0e885cc8ac8..716f0094fd39 100644 --- a/templates/azure/terraform/datasource_test.go.erb +++ b/templates/azure/terraform/datasource_test.go.erb @@ -29,10 +29,7 @@ import ( end -%> func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing.T) { - dataSourceName := "data.<%= terraform_name -%>.test" -<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).each do |param| -%> - <%= param.variable_name -%> := <%= lines(param.create_expression) -%> -<% end -%> + data := acceptance.BuildTestData(t, "<%= terraform_name -%>", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -42,13 +39,13 @@ func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing. <% hcl_params = test_hcls[step][:random_vars].map(&:variable_name).uniq -%> <% props_to_check = get_example_properties_to_check(step, object) -%> { - Config: testAccDataSource<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), + Config: testAccDataSource<%= resource_name -%>_<%= step -%>(data), Check: resource.ComposeTestCheckFunc( <% props_to_check.each do |propName, propValue| -%> <% if propValue == :AttrSet -%> - resource.TestCheckResourceAttrSet(dataSourceName, "<%= propName -%>"), + resource.TestCheckResourceAttrSet(data.ResourceName, "<%= propName -%>"), <% else -%> - resource.TestCheckResourceAttr(dataSourceName, "<%= propName -%>", "<%= propValue -%>"), + resource.TestCheckResourceAttr(data.ResourceName, "<%= propName -%>", "<%= propValue -%>"), <% end -%> <% end -%> ), @@ -63,11 +60,9 @@ func TestAccDataSourceAzureRM<%= resource_name -%>_<%= test.name -%>(t *testing. <% if object.respond_to? :acctests test_hcls.each do |name, test_hcl| - uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).map{|p| "#{p.parameter_name} #{p.go_type}"} - hcl_params = test_hcl[:random_vars].map(&:parameter_name).uniq -%> -func testAccDataSource<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { - config := testAccAzureRM<%= resource_name -%>_<%= name -%>(<%= hcl_params.join(", ") -%>) +func testAccDataSource<%= resource_name -%>_<%= name -%>(data acceptance.TestData) string { + config := testAccAzureRM<%= resource_name -%>_<%= name -%>(data) return fmt.Sprintf(` %s diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index 7a363d614f57..7dca0b5b8da6 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -31,44 +31,32 @@ import ( end -%> func TestAcc<%= resource_name -%>_<%= test.name -%>(t *testing.T) { - resourceName := "<%= terraform_name -%>.test" -<% test.steps.map{|step| test_hcls[step][:random_vars]}.flatten.uniq(&:variable_name).sort_by(&:declare_order).each do |param| -%> - <%= param.variable_name -%> := <%= lines(param.create_expression) -%> -<% end -%> - + data := acceptance.BuildTestData(t, "<%= terraform_name -%>", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, Providers: acceptance.SupportedProviders, CheckDestroy: testCheck<%= resource_name -%>Destroy, Steps: []resource.TestStep{ <% test.steps.each do |step| -%> -<% hcl_params = test_hcls[step][:random_vars].uniq(&:variable_name).sort_by(&:declare_order).map(&:variable_name) -%> <% props_to_check = get_example_properties_to_check(step, object) -%> { - Config: testAcc<%= resource_name -%>_<%= step -%>(<%= hcl_params.join(", ") -%>), + Config: testAcc<%= resource_name -%>_<%= step -%>(data), Check: resource.ComposeTestCheckFunc( - testCheck<%= resource_name -%>Exists(resourceName), + testCheck<%= resource_name -%>Exists(data.ResourceName), <% props_to_check.each do |propName, propValue| -%> <% if propValue == :AttrSet -%> - resource.TestCheckResourceAttrSet(resourceName, "<%= propName -%>"), + resource.TestCheckResourceAttrSet(data.ResourceName, "<%= propName -%>"), <% else -%> - resource.TestCheckResourceAttr(resourceName, "<%= propName -%>", "<%= propValue -%>"), + resource.TestCheckResourceAttr(data.ResourceName, "<%= propName -%>", "<%= propValue -%>"), <% end -%> <% end -%> ), }, <% end -%> -<% if test.steps.count == 1 -%> - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, -<% end -%> + data.ImportStep(), }, }) } - <% end -%> <% end -%> @@ -126,10 +114,10 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { test_hcls.each do |name, test_hcl| uniq_params = test_hcl[:random_vars].uniq(&:parameter_name).sort_by(&:declare_order).map{|p| "#{p.parameter_name} #{p.go_type}"} -%> -func testAcc<%= resource_name -%>_<%= name -%>(<%= uniq_params.join(", ") -%>) string { +func testAcc<%= resource_name -%>_<%= name -%>(data acceptance.TestData) string { return fmt.Sprintf(` <%= lines(test_hcl[:hcl]) -%> -`, <%= test_hcl[:random_vars].map(&:parameter_name).join(", ") -%>) +`, <%= test_hcl[:random_vars].map(&:create_expression).join(", ") -%>) } <% From 6afa17fe4620ad77a211ab09dfe11a7fa267975d Mon Sep 17 00:00:00 2001 From: magodo Date: Thu, 26 Dec 2019 14:02:25 +0800 Subject: [PATCH 170/175] chagne package name according to new file layout --- templates/azure/terraform/datasource.erb | 3 +-- templates/azure/terraform/resource.erb | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index e7d5a7853c31..df0b964300f6 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -1,6 +1,4 @@ <%# lines(autogen_notice :go) -%> -package azurerm - <% resource_name = "Arm" + object.name sdk_package = object.azure_sdk_definition.go_client_namespace @@ -17,6 +15,7 @@ package azurerm provider_name = object.api_name provider_client_name = object.azure_sdk_definition.go_client -%> +package <%= provider_name.downcase -%> func dataSource<%= resource_name -%>() *schema.Resource { return &schema.Resource{ diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 5da0a72f2e9d..c39228bcbe8b 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -1,24 +1,24 @@ <%# lines(autogen_notice :go) -%> -package azurerm - -<%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> - <% properties = object.all_user_properties schema_properties = properties.reject{|p| p.name == 'id' || get_property_value(p, 'hide_from_schema', false)} # Fingerprints aren't *really* settable properties, but they behave like one. At Create, they have no value but they # can just be read in anyways, and after a Read they will need to be set in every Update. settable_properties = properties.reject{|p| get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.create.request).nil?} - .reject{|v| v.output && !v.is_a?(Api::Type::Fingerprint) } - .reject(&:url_param_only) + .reject{|v| v.output && !v.is_a?(Api::Type::Fingerprint) } + .reject(&:url_param_only) # PUT needs parameters like `name` to be set in the resource body, but we don't want to send them in PATCH updatable_properties = settable_properties.reject{|p| !object.azure_sdk_definition.update.nil? && get_applicable_reference(p.azure_sdk_references, object.azure_sdk_definition.update.request).nil?} - .reject { |p| p.name == "location" } # location is always force new in terraform + .reject { |p| p.name == "location" } # location is always force new in terraform output_properties = properties.reject{|p| p.name == 'id'} provider_name = object.api_name provider_client_name = object.azure_sdk_definition.go_client -%> +package <%= provider_name.downcase -%> + +<%= lines(compile(object.custom_code.constants)) if object.custom_code.constants -%> + <% resource_name = "Arm" + object.name terraform_name = "azurerm_" + object.name.underscore From 3360e5a7c323bf4ce5e1ac74b591ffc61f7371a7 Mon Sep 17 00:00:00 2001 From: magodo Date: Sun, 29 Dec 2019 10:29:01 +0800 Subject: [PATCH 171/175] add default timeout for d/r --- templates/azure/terraform/datasource.erb | 4 ++++ templates/azure/terraform/resource.erb | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/templates/azure/terraform/datasource.erb b/templates/azure/terraform/datasource.erb index df0b964300f6..9e794373a58a 100644 --- a/templates/azure/terraform/datasource.erb +++ b/templates/azure/terraform/datasource.erb @@ -21,6 +21,10 @@ func dataSource<%= resource_name -%>() *schema.Resource { return &schema.Resource{ Read: dataSource<%= resource_name -%>Read, + Timeouts: &schema.ResourceTimeout{ + Read: schema.DefaultTimeout(5 * time.Minute), + }, + Schema: map[string]*schema.Schema{<% # This block will remove the line-ending here -%> <% order_azure_properties(schema_properties, input_properties).each do |prop| -%> <%= lines_before(build_azure_schema_property(prop, object, 12, input_properties)) -%> diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index c39228bcbe8b..6df2a2a99320 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -56,6 +56,13 @@ func resource<%= resource_name -%>() *schema.Resource { State: schema.ImportStatePassthrough, }, + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Read: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + <% unless object.async.nil? -%> Timeouts: &schema.ResourceTimeout { Create: schema.DefaultTimeout(<%= object.async.operation.timeouts.insert_sec -%> * time.Second), From cfb9b01faf3e67299bd5e98326d1189ee3aa2270 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 31 Dec 2019 16:58:30 +0800 Subject: [PATCH 172/175] resource group name case sensitive --- templates/azure/terraform/schemas/resource_group_name.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/azure/terraform/schemas/resource_group_name.erb b/templates/azure/terraform/schemas/resource_group_name.erb index 56d8341c09f0..e37ee7bc80c7 100644 --- a/templates/azure/terraform/schemas/resource_group_name.erb +++ b/templates/azure/terraform/schemas/resource_group_name.erb @@ -1 +1 @@ -"<%= prop_name -%>": azure.SchemaResourceGroupNameDiffSuppress(), \ No newline at end of file +"<%= prop_name -%>": azure.SchemaResourceGroupName(), \ No newline at end of file From 5a863f06c68ac29b9b40933f8128b7cbebd48430 Mon Sep 17 00:00:00 2001 From: magodo Date: Thu, 9 Jan 2020 09:59:39 +0800 Subject: [PATCH 173/175] remove `sidebar_current` from gen doc --- templates/azure/terraform/datasource.html.markdown.erb | 1 - templates/azure/terraform/resource.html.markdown.erb | 1 - 2 files changed, 2 deletions(-) diff --git a/templates/azure/terraform/datasource.html.markdown.erb b/templates/azure/terraform/datasource.html.markdown.erb index 41ac9e2a4d34..b9532d91ca0b 100644 --- a/templates/azure/terraform/datasource.html.markdown.erb +++ b/templates/azure/terraform/datasource.html.markdown.erb @@ -12,7 +12,6 @@ subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" -sidebar_current: "docs-azurerm-datasource-<%= resource_name.gsub("_", "-") -%>" description: |- Gets information about an existing <%= lines(object.name.titlecase) -%> --- diff --git a/templates/azure/terraform/resource.html.markdown.erb b/templates/azure/terraform/resource.html.markdown.erb index 595c25dc449d..83449205d26c 100644 --- a/templates/azure/terraform/resource.html.markdown.erb +++ b/templates/azure/terraform/resource.html.markdown.erb @@ -30,7 +30,6 @@ subcategory: "" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_<%= resource_name -%>" -sidebar_current: "docs-azurerm-resource-<%= resource_name.gsub("_", "-") -%>" description: |- <%= indent(object.description.first_sentence, 2) %> --- From 5f976c2ba4279fd3ed38e086bf9ab2ece4dfee60 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 21 Jan 2020 10:48:21 +0800 Subject: [PATCH 174/175] Support custom parseID function Terraform azure provider currently introduce custom parseID function, which is to replace previous `azure.ParseAzureResourceID()`. Furthermore, this is used at `Importer` to validate importing ID and in acctest. --- provider/azure/terraform/acctest/sub_template.rb | 5 +++-- .../azure/terraform/acctest/parameters_from_schema.erb | 6 +++++- templates/azure/terraform/resource.erb | 9 ++++++--- templates/azure/terraform/sdk/azure_id_parser.erb | 4 ++-- templates/azure/terraform/test_file.go.erb | 4 ++-- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb index b54ab9ee6464..587001c8084f 100644 --- a/provider/azure/terraform/acctest/sub_template.rb +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -17,11 +17,12 @@ module Terraform module AccTest module SubTemplate - def build_acctest_parameters_from_schema(sdk_op_def, properties, indentation = 8) + def build_acctest_parameters_from_schema(sdk_op_def, properties, object, indentation = 8) compile_template 'templates/azure/terraform/acctest/parameters_from_schema.erb', indentation: indentation, sdk_op_def: sdk_op_def, - properties: properties + properties: properties, + object: object, end end diff --git a/templates/azure/terraform/acctest/parameters_from_schema.erb b/templates/azure/terraform/acctest/parameters_from_schema.erb index 5350fce0b7de..320f17616371 100644 --- a/templates/azure/terraform/acctest/parameters_from_schema.erb +++ b/templates/azure/terraform/acctest/parameters_from_schema.erb @@ -1,4 +1,8 @@ +id, err := parse.<%= object.name -%>ID(rs.Primary.ID) +if err != nil { + return err +} <% properties.reject{|p| get_applicable_reference(p.azure_sdk_references, sdk_op_def.request).nil?}.sort_by{|p| [p.order, p.name]}.each do |prop| -%> <% var_name = get_sdk_typedef_by_references(prop.azure_sdk_references, sdk_op_def.request).go_variable_name -%> -<%= var_name -%> := rs.Primary.Attributes["<%= prop.name.underscore -%>"] +<%= var_name -%> := id.<%= var_name.capitalize -%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/resource.erb b/templates/azure/terraform/resource.erb index 6df2a2a99320..632bae9fc0f0 100644 --- a/templates/azure/terraform/resource.erb +++ b/templates/azure/terraform/resource.erb @@ -34,6 +34,8 @@ package <%= provider_name.downcase -%> update_func_name_postfix = (combine_create_update ? "CreateUpdate" : "Update") -%> +import azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema" + func resource<%= resource_name -%>() *schema.Resource { return &schema.Resource{ Create: resource<%= resource_name -%><%= create_func_name_postfix -%>, @@ -52,9 +54,10 @@ func resource<%= resource_name -%>() *schema.Resource { ), <% end -%> - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, + Importer: &azSchema.ValidateResourceIDPriorToImport(func(id string) error { + _, err := parse.<%= object.name -%>ID(id) + return err + }) Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(30 * time.Minute), diff --git a/templates/azure/terraform/sdk/azure_id_parser.erb b/templates/azure/terraform/sdk/azure_id_parser.erb index 65841a1acf64..f75f0f895dd1 100644 --- a/templates/azure/terraform/sdk/azure_id_parser.erb +++ b/templates/azure/terraform/sdk/azure_id_parser.erb @@ -1,8 +1,8 @@ -id, err := azure.ParseAzureResourceID(d.Id()) +id, err := parse.<%= object.name -%>ID(d.Id()) if err != nil { return err } <% sdk_op_def.request.reject {|k, v| v.id_portion.nil?}.each_value do |param| -%> -<%= param.go_variable_name -%> := id.<%= param.id_portion == "resourceGroups" ? "ResourceGroup" : "Path[\"#{param.id_portion}\"]" -%> +<%= param.go_variable_name -%> := id.<%= param.go_variable_name.capitalize-%> <% end -%> \ No newline at end of file diff --git a/templates/azure/terraform/test_file.go.erb b/templates/azure/terraform/test_file.go.erb index 7dca0b5b8da6..47304a502202 100644 --- a/templates/azure/terraform/test_file.go.erb +++ b/templates/azure/terraform/test_file.go.erb @@ -67,7 +67,7 @@ func testCheck<%= resource_name -%>Exists(resourceName string) resource.TestChec return fmt.Errorf("<%= object.name.titlecase -%> not found: %s", resourceName) } -<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object)) -%> client := acceptance.AzureProvider.Meta().(*clients.Client).<%= provider_name -%>.<%= provider_client_name -%> @@ -95,7 +95,7 @@ func testCheck<%= resource_name -%>Destroy(s *terraform.State) error { continue } -<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties)) -%> +<%= lines(build_acctest_parameters_from_schema(object.azure_sdk_definition.read, properties, object)) -%> if resp, err := <%= build_sdk_func_invocation(object.azure_sdk_definition.read) -%>; err != nil { if !utils.ResponseWasNotFound(resp.Response) { From c0f27b496130284f8017359fde8b4834af837801 Mon Sep 17 00:00:00 2001 From: magodo Date: Tue, 21 Jan 2020 16:16:52 +0800 Subject: [PATCH 175/175] typo --- provider/azure/terraform/acctest/sub_template.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/provider/azure/terraform/acctest/sub_template.rb b/provider/azure/terraform/acctest/sub_template.rb index 587001c8084f..c7b88c38929e 100644 --- a/provider/azure/terraform/acctest/sub_template.rb +++ b/provider/azure/terraform/acctest/sub_template.rb @@ -22,9 +22,8 @@ def build_acctest_parameters_from_schema(sdk_op_def, properties, object, indenta indentation: indentation, sdk_op_def: sdk_op_def, properties: properties, - object: object, + object: object end - end end end