diff --git a/provider/inspec.rb b/provider/inspec.rb index 5c309a87d08a..ac6e7ab631a8 100644 --- a/provider/inspec.rb +++ b/provider/inspec.rb @@ -54,6 +54,14 @@ def generate_resource(data) ) end + # Returns the url that this object can be retrieved from + # based off of the self link + def url(object) + url = object.self_link_url[1] + return url.join('') if url.is_a?(Array) + url.split("\n").join('') + end + # TODO? def generate_resource_tests(data) end @@ -65,8 +73,56 @@ def generate_typed_array(data, prop) end def emit_resourceref_object(data) end - def emit_nested_object(data) end - def generate_network_datas(data, object) end + + def emit_nested_object(data) + target = if data[:emit_array] + data[:property].item_type.property_file + else + data[:property].property_file + end + { + source: File.join('templates', 'inspec', 'nested_object.erb'), + target: "libraries/#{target}.rb", + overrides: emit_nested_object_overrides(data) + } + end + + def emit_nested_object_overrides(data) + data.clone.merge( + api_name: data[:api_name].camelize(:upper), + object_type: data[:obj_name].camelize(:upper), + product_ns: data[:product_name].camelize(:upper), + class_name: if data[:emit_array] + data[:property].item_type.property_class.last + else + data[:property].property_class.last + end + ) + end + + def primitive? (property) + return property.is_a?(::Api::Type::Primitive) || (property.is_a?(Api::Type::Array) && !property.item_type.is_a?(::Api::Type::NestedObject)) + end + + def resource_ref? (property) + return property.is_a?(::Api::Type::ResourceRef) + end + + def typed_array? (property) + return property.is_a?(::Api::Type::Array) + end + + def nested_object? (property) + return property.is_a?(::Api::Type::NestedObject) + end + + def generate_requires(properties, requires = []) + nested_props = properties.select{ |type| nested_object?(type) } + requires.concat(properties.reject{ |type| primitive?(type) || resource_ref?(type) || nested_object?(type) }.collect(&:requires)) + requires.concat(nested_props.map{|nested_prop| generate_requires(nested_prop.properties) } ) + requires.concat(nested_props.map{|nested_prop| nested_prop.property_file }) + requires + end end end diff --git a/templates/inspec/nested_object.erb b/templates/inspec/nested_object.erb new file mode 100644 index 000000000000..ed5e4280b978 --- /dev/null +++ b/templates/inspec/nested_object.erb @@ -0,0 +1,60 @@ +<%# 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. +-%> +<%= compile('templates/license.erb') -%> + +<%= lines(autogen_notice :ruby) -%> + +module Google + module <%= product_ns %> + module Property + class <%= class_name -%> + +<% if !nested_properties.empty? -%> +<% nested_properties.each do |prop| -%> + attr_reader :<%= prop.out_name %> +<% end # nested_properties.each -%> + +<% end # if !nested_properties.empty? -%> + + def initialize(args = nil) + return nil if args.nil? +<% nested_properties.each do |prop| -%> +<% + if primitive?(prop) + init = "args['#{prop.api_name}']" + elsif typed_array?(prop) + init = "#{prop.property_type}.parse(args['#{prop.api_name}'])" + else + init = "#{prop.property_type}.new(args['#{prop.api_name}'])" + end + parse_code = "@#{prop.out_name} = #{init}" +-%> +<%= lines(indent(parse_code, 10)) -%> +<% end # nested_properties.each -%> + end + end + +<% if emit_array -%> + class <%= class_name %>Array + def self.parse(value) + return if value.nil? + return <%= class_name %>.new(value) unless value.is_a?(::Array) + value.map { |v| <%= class_name %>.new(v) } + end + end +<% end #if emit_array -%> + end + end +end \ No newline at end of file diff --git a/templates/inspec/singular_resource.erb b/templates/inspec/singular_resource.erb index 8251616a6796..1a8056d7daa3 100644 --- a/templates/inspec/singular_resource.erb +++ b/templates/inspec/singular_resource.erb @@ -16,39 +16,34 @@ <%= lines(autogen_notice :ruby) -%> +<% + require 'google/string_utils' + + inside_indent = 8 + + requires = generate_requires(object.all_user_properties) + requires << 'inspec/resource' + requires << 'google/hash_utils' +-%> +<%= lines(emit_requires(requires)) -%> + # A provider to manage <%= @api.name -%> resources. -<%= lines(indent( - emit_rubocop(binding, :class, - ['Google', @api.prefix.upcase, object.name].join('::'), - :disabled), - 4)) -%> class <%= object.name -%> < Inspec.resource(1) name 'google_<%= product_ns.downcase -%>_<%= object.name.downcase -%>' desc '<%= object.name -%>' supports platform: 'gcp-mm' -<% object.properties.reject(&:input).each do |prop| -%> +<% object.properties.each do |prop| -%> <%= "attr_reader :#{prop.out_name}" -%> <% end -%> - -<% -base = "'#{object.self_link_url[0].join}'" -url = object.self_link_url[1] -if url.is_a?(Array) - url = url.join('') -else - url = url.split("\n").join('') -end -url = "'#{url}'" --%> def base - <%= base %> + '<%= object.self_link_url[0].join %>' end def url - <%= url %> + '<%= url(object) %>' end <% if object.self_link_query.nil? -%> @@ -65,8 +60,24 @@ url = "'#{url}'" end <% end # object.self_link_query.nil? -%> - # TODO - def parse end + def parse + <% + fetch_code = object.properties.map do |prop| + name = prop.out_name + + if primitive?(prop) || resource_ref?(prop) + init = "@fetched['#{prop.api_name}']" + elsif typed_array?(prop) + init = "#{prop.property_type}.parse(@fetched['#{prop.api_name}'])" + else + init = "#{prop.property_type}.new(@fetched['#{prop.api_name}'])" + end + + assignment = "@#{name} = #{init}" + end +-%> +<%= lines(indent(fetch_code, 4)) -%> + end def exists? !@fetched.nil?