--- /dev/null
+Puppet::Type.newtype(:neutron_subnet) do
+
+ ensurable
+
+ newparam(:name, :namevar => true) do
+ desc 'Symbolic name for the subnet'
+ newvalues(/.*/)
+ end
+
+ newproperty(:id) do
+ desc 'The unique id of the subnet'
+ validate do |v|
+ raise(Puppet::Error, 'This is a read only property')
+ end
+ end
+
+ newproperty(:cidr) do
+ desc 'CIDR representing IP range for this subnet, based on IP version'
+ end
+
+ newproperty(:ip_version) do
+ desc 'The IP version of the CIDR'
+ newvalues('4', '6')
+ end
+
+ newproperty(:allocation_pools, :array_matching => :all) do
+ desc <<-EOT
+ Array of Sub-ranges of cidr available for dynamic allocation to ports.
+ Syntax:["start=IPADDR,end=IPADDR", ...]
+ EOT
+ end
+
+ newproperty(:gateway_ip) do
+ desc <<-EOT
+ The default gateway provided by DHCP to devices in this subnet. If set to
+ '' then no gateway IP address will be provided via DHCP.
+ EOT
+ end
+
+ newproperty(:enable_dhcp) do
+ desc 'Whether DHCP is enabled for this subnet or not.'
+ newvalues(/(t|T)rue/, /(f|F)alse/)
+ munge do |v|
+ v.to_s.capitalize
+ end
+ end
+
+ newproperty(:host_routes, :array_matching => :all) do
+ desc <<-EOT
+ Array of routes that should be used by devices with IPs from this subnet
+ (not including local subnet route).
+ Syntax:["destination=CIDR,nexhop=IP_ADDR", ...]
+ EOT
+ end
+
+ newproperty(:dns_nameservers, :array_matching => :all) do
+ desc <<-EOT
+ 'Array of DNS name servers used by hosts in this subnet.'
+ EOT
+ end
+
+ newproperty(:network_id) do
+ desc 'A uuid identifying the network this subnet is associated with.'
+ end
+
+ newparam(:network_name) do
+ desc 'The name of the network this subnet is associated with.'
+ end
+
+ newparam(:tenant_name) do
+ desc 'The name of the tenant which will own the subnet.'
+ end
+
+ newproperty(:tenant_id) do
+ desc 'A uuid identifying the tenant which will own the subnet.'
+ end
+
+ autorequire(:service) do
+ ['neutron-server']
+ end
+
+ autorequire(:keystone_tenant) do
+ [self[:tenant_name]] if self[:tenant_name]
+ end
+
+ autorequire(:neutron_network) do
+ [self[:network_name]] if self[:network_name]
+ end
+
+ validate do
+ if self[:ensure] != :present
+ return
+ end
+ if ! self[:cidr]
+ raise(Puppet::Error, 'Please provide a valid CIDR')
+ elsif ! (self[:network_id] || self[:network_name])
+ raise(Puppet::Error, <<-EOT
+A value for one of network_name or network_id must be provided.
+EOT
+ )
+ elsif self[:network_id] && self[:network_name]
+ raise(Puppet::Error, <<-EOT
+Please provide a value for only one of network_name and network_id.
+EOT
+ )
+ elsif self[:tenant_id] && self[:tenant_name]
+ raise(Puppet::Error, <<-EOT
+Please provide a value for only one of tenant_name and tenant_id.
+EOT
+ )
+ end
+ end
+
+end