Modify generic role template to support custom networks

Render all per-network resources and interfaces via j2 to enable
future support for custom networks via network_data.yaml

Note this doesn't enable custom networks for the built-in roles
as we skip j2 rendering for them, this will be resolved by converting
them to use the generic role template instead of the hard-coded
ones listed in the j2_excludes.yaml.

Depends-On: I18fa3829ff38ac200550d8e36bbe334c0005da22
Change-Id: I49565f9389f3ec9aef4861e23a3bed64a85501e6
Partially-Implements: blueprint composable-networks
This commit is contained in:
Steven Hardy 2017-06-01 11:25:06 +01:00
parent d61d11daba
commit 566a40b148
2 changed files with 38 additions and 123 deletions

View File

@ -263,81 +263,32 @@ resources:
RoleUserData:
type: OS::TripleO::{{role.name}}::NodeUserData
ExternalPort:
type: OS::TripleO::{{role.name}}::Ports::ExternalPort
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
InternalApiPort:
type: OS::TripleO::{{role.name}}::Ports::InternalApiPort
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
StoragePort:
type: OS::TripleO::{{role.name}}::Ports::StoragePort
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
StorageMgmtPort:
type: OS::TripleO::{{role.name}}::Ports::StorageMgmtPort
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
TenantPort:
type: OS::TripleO::{{role.name}}::Ports::TenantPort
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
ManagementPort:
type: OS::TripleO::{{role.name}}::Ports::ManagementPort
{%- for network in networks %}
{{network.name}}Port:
type: OS::TripleO::{{role.name}}::Ports::{{network.name}}Port
properties:
ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
IPPool: {get_param: {{role.name}}IPs}
NodeIndex: {get_param: NodeIndex}
{%- endfor %}
NetworkConfig:
type: OS::TripleO::{{role.name}}::Net::SoftwareConfig
properties:
ControlPlaneIp: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
{%- for network in networks %}
{{network.name}}IpSubnet: {get_attr: [{{network.name}}Port, ip_subnet]}
{%- endfor %}
NetIpMap:
type: OS::TripleO::Network::Ports::NetIpMap
properties:
ControlPlaneIp: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
{%- for network in networks %}
{{network.name}}Ip: {get_attr: [{{network.name}}Port, ip_address]}
{{network.name}}IpSubnet: {get_attr: [{{network.name}}Port, ip_subnet]}
{{network.name}}IpUri: {get_attr: [{{network.name}}Port, ip_address_uri]}
{%- endfor %}
NetHostMap:
type: OS::Heat::Value
@ -593,41 +544,27 @@ outputs:
hostname_map:
description: Mapping of network names to hostnames
value:
external: {get_attr: [NetHostMap, value, external, fqdn]}
internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
storage: {get_attr: [NetHostMap, value, storage, fqdn]}
storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
management: {get_attr: [NetHostMap, value, management, fqdn]}
{%- for network in networks %}
{{network.name_lower|default(network.name.lower())}}: {get_attr: [NetHostMap, value, {{network.name_lower|default(network.name.lower()) }}, fqdn]}
{%- endfor %}
ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
hosts_entry:
value:
str_replace:
template: |
PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
TENANTIP TENANTHOST.DOMAIN TENANTHOST
MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
{%- for network in networks %}
{{network.name}}IP {{network.name}}HOST.DOMAIN {{network.name}}HOST
{%- endfor %}
CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
params:
PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role.name}}HostnameResolveNetwork]}]}
DOMAIN: {get_param: CloudDomain}
PRIMARYHOST: {get_attr: [{{role.name}}, name]}
EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
STORAGEIP: {get_attr: [StoragePort, ip_address]}
STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
TENANTIP: {get_attr: [TenantPort, ip_address]}
TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
{%- for network in networks %}
{{network.name}}IP: {get_attr: [{{network.name}}Port, ip_address]}
{{network.name}}HOST: {get_attr: [NetHostMap, value, {{network.name_lower|default(network.name.lower())}}, short]}
{%- endfor %}
CTLPLANEIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
known_hosts_entry:
@ -635,29 +572,18 @@ outputs:
value:
str_replace:
template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
{%- for network in networks %}
{{network.name}}IP,{{network.name}}HOST.DOMAIN,{{network.name}}HOST,\
{%- endfor %}
CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
params:
PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role.name}}HostnameResolveNetwork]}]}
DOMAIN: {get_param: CloudDomain}
PRIMARYHOST: {get_attr: [{{role.name}}, name]}
EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
STORAGEIP: {get_attr: [StoragePort, ip_address]}
STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
TENANTIP: {get_attr: [TenantPort, ip_address]}
TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
{%- for network in networks %}
{{network.name}}IP: {get_attr: [{{network.name}}Port, ip_address]}
{{network.name}}HOST: {get_attr: [NetHostMap, value, {{network.name_lower|default(network.name.lower())}}, short]}
{%- endfor %}
CTLPLANEIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
@ -666,24 +592,11 @@ CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
value:
{get_resource: {{role.name}}}
condition: server_not_blacklisted
external_ip_address:
description: IP address of the server in the external network
value: {get_attr: [ExternalPort, ip_address]}
internal_api_ip_address:
description: IP address of the server in the internal_api network
value: {get_attr: [InternalApiPort, ip_address]}
storage_ip_address:
description: IP address of the server in the storage network
value: {get_attr: [StoragePort, ip_address]}
storage_mgmt_ip_address:
description: IP address of the server in the storage_mgmt network
value: {get_attr: [StorageMgmtPort, ip_address]}
tenant_ip_address:
description: IP address of the server in the tenant network
value: {get_attr: [TenantPort, ip_address]}
management_ip_address:
description: IP address of the server in the management network
value: {get_attr: [ManagementPort, ip_address]}
os_collect_config:
description: The os-collect-config configuration associated with this server resource
value: {get_attr: [{{role.name}}, os_collect_config]}
{%- for network in networks %}
{{network.name_lower|default(network.name.lower())}}_ip_address:
description: IP address of the server in the {{network.name}} network
value: {get_attr: [{{network.name}}Port, ip_address]}
{%- endfor %}

View File

@ -146,13 +146,15 @@ def process_templates(template_path, role_data_path, output_dir,
out_f_path = os.path.join(out_dir, out_f)
if not (out_f_path in excl_templates):
if '{{role.name}}' in template_data:
j2_data = {'role': r_map[role]}
j2_data = {'role': r_map[role],
'networks': network_data}
_j2_render_to_file(template_data, j2_data,
out_f_path, overwrite)
else:
# Backwards compatibility with templates
# that specify {{role}} vs {{role.name}}
j2_data = {'role': role}
j2_data = {'role': role,
'networks': network_data}
# (dprince) For the undercloud installer we
# don'twant to have heat check nova/glance
# API's