Skip to content
60 changes: 58 additions & 2 deletions provider/inspec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
60 changes: 60 additions & 0 deletions templates/inspec/nested_object.erb
Original file line number Diff line number Diff line change
@@ -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
53 changes: 32 additions & 21 deletions templates/inspec/singular_resource.erb
Original file line number Diff line number Diff line change
Expand Up @@ -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? -%>
Expand All @@ -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?
Expand Down