heat_template_version: ocata description: 'OpenStack swift storage node configured by Puppet' parameters: OvercloudSwiftStorageFlavor: description: Flavor for Swift storage nodes to request when deploying. default: baremetal type: string constraints: - custom_constraint: nova.flavor SwiftStorageImage: default: overcloud-full type: string constraints: - custom_constraint: glance.image KeyName: default: default description: Name of an existing Nova key pair to enable SSH access to the instances type: string UpdateIdentifier: default: '' type: string description: > Setting to a previously unused value during stack-update will trigger package update on all nodes ServiceNetMap: default: {} description: Mapping of service_name -> network name. Typically set via parameter_defaults in the resource registry. type: json EndpointMap: default: {} description: Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry. type: json Hostname: type: string default: '' # Defaults to Heat created hostname HostnameMap: type: json default: {} description: Optional mapping to override hostnames ExtraConfig: default: {} description: | Additional hiera configuration to inject into the cluster. Note that ObjectStorageExtraConfig takes precedence over ExtraConfig. type: json ObjectStorageExtraConfig: default: {} description: | Role specific additional hiera configuration to inject into the cluster. type: json SwiftStorageIPs: default: {} type: json NetworkDeploymentActions: type: comma_delimited_list description: > Heat action when to apply network configuration changes default: ['CREATE'] SoftwareConfigTransport: default: POLL_SERVER_CFN description: | How the server should receive the metadata required for software configuration. type: string constraints: - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE] CloudDomain: default: 'localdomain' type: string description: > The DNS domain used for the hosts. This should match the dhcp_domain configured in the Undercloud neutron. Defaults to localdomain. SwiftStorageServerMetadata: default: {} description: > Extra properties or metadata passed to Nova for the created nodes in the overcloud. It's accessible via the Nova metadata API. This option is role-specific and is merged with the values given to the ServerMetadata parameter. type: json ServerMetadata: default: {} description: > Extra properties or metadata passed to Nova for the created nodes in the overcloud. It's accessible via the Nova metadata API. This applies to all roles and is merged with a role-specific metadata parameter. type: json ObjectStorageSchedulerHints: type: json description: Optional scheduler hints to pass to nova default: {} NodeIndex: type: number default: 0 ServiceConfigSettings: type: json default: {} ServiceNames: type: comma_delimited_list default: [] MonitoringSubscriptions: type: comma_delimited_list default: [] ServiceMetadataSettings: type: json default: {} ConfigCommand: type: string description: Command which will be run whenever configuration data changes default: os-refresh-config --timeout 14400 UpgradeInitCommand: type: string description: | Command or script snippet to run on all overcloud nodes to initialize the upgrade process. E.g. a repository switch. default: '' UpgradeInitCommonCommand: type: string description: | Common commands required by the upgrades process. This should not normally be modified by the operator and is set and unset in the major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml environment files. default: '' resources: SwiftStorage: type: OS::Nova::Server metadata: os-collect-config: command: {get_param: ConfigCommand} properties: image: {get_param: SwiftStorageImage} flavor: {get_param: OvercloudSwiftStorageFlavor} key_name: {get_param: KeyName} networks: - network: ctlplane user_data_format: SOFTWARE_CONFIG user_data: {get_resource: UserData} name: str_replace: template: {get_param: Hostname} params: {get_param: HostnameMap} software_config_transport: {get_param: SoftwareConfigTransport} metadata: map_merge: - {get_param: ServerMetadata} - {get_param: SwiftStorageServerMetadata} - {get_param: ServiceMetadataSettings} scheduler_hints: {get_param: ObjectStorageSchedulerHints} # Combine the NodeAdminUserData and NodeUserData mime archives UserData: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: NodeAdminUserData} type: multipart - config: {get_resource: NodeUserData} type: multipart - config: {get_resource: RoleUserData} type: multipart # Creates the "heat-admin" user if configured via the environment # Should return a OS::Heat::MultipartMime reference via OS::stack_id NodeAdminUserData: type: OS::TripleO::NodeAdminUserData # For optional operator additional userdata # Should return a OS::Heat::MultipartMime reference via OS::stack_id NodeUserData: type: OS::TripleO::NodeUserData # For optional operator role-specific userdata # Should return a OS::Heat::MultipartMime reference via OS::stack_id RoleUserData: type: OS::TripleO::ObjectStorage::NodeUserData ExternalPort: type: OS::TripleO::SwiftStorage::Ports::ExternalPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} InternalApiPort: type: OS::TripleO::SwiftStorage::Ports::InternalApiPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} StoragePort: type: OS::TripleO::SwiftStorage::Ports::StoragePort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} StorageMgmtPort: type: OS::TripleO::SwiftStorage::Ports::StorageMgmtPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} TenantPort: type: OS::TripleO::SwiftStorage::Ports::TenantPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} ManagementPort: type: OS::TripleO::SwiftStorage::Ports::ManagementPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} IPPool: {get_param: SwiftStorageIPs} NodeIndex: {get_param: NodeIndex} NetworkConfig: type: OS::TripleO::ObjectStorage::Net::SoftwareConfig properties: ControlPlaneIp: {get_attr: [SwiftStorage, 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]} NetIpMap: type: OS::TripleO::Network::Ports::NetIpMap properties: ControlPlaneIp: {get_attr: [SwiftStorage, 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]} NetHostMap: type: OS::Heat::Value properties: type: json value: external: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - external - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - external internal_api: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - internalapi - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - internalapi storage: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - storage - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - storage storage_mgmt: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - storagemgmt - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - storagemgmt tenant: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - tenant - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - tenant management: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - management - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - management ctlplane: fqdn: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - ctlplane - {get_param: CloudDomain} short: list_join: - '.' - - {get_attr: [SwiftStorage, name]} - ctlplane PreNetworkConfig: type: OS::TripleO::ObjectStorage::PreNetworkConfig properties: server: {get_resource: SwiftStorage} NetworkDeployment: type: OS::TripleO::SoftwareDeployment depends_on: PreNetworkConfig properties: name: NetworkDeployment config: {get_resource: NetworkConfig} server: {get_resource: SwiftStorage} actions: {get_param: NetworkDeploymentActions} SwiftStorageUpgradeInitConfig: type: OS::Heat::SoftwareConfig properties: group: script config: list_join: - '' - - "#!/bin/bash\n\n" - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n" - get_param: UpgradeInitCommand - get_param: UpgradeInitCommonCommand # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first SwiftStorageUpgradeInitDeployment: type: OS::Heat::SoftwareDeployment depends_on: NetworkDeployment properties: name: SwiftStorageUpgradeInitDeployment server: {get_resource: SwiftStorage} config: {get_resource: SwiftStorageUpgradeInitConfig} SwiftStorageHieraConfig: type: OS::Heat::StructuredConfig properties: group: hiera config: hierarchy: - '"%{::uuid}"' - heat_config_%{::deploy_config_name} - object_extraconfig - extraconfig - service_names - service_configs - object - bootstrap_node # provided by allNodesConfig - all_nodes # provided by allNodesConfig - vip_data # provided by allNodesConfig - '"%{::osfamily}"' merge_behavior: deeper datafiles: service_names: service_names: {get_param: ServiceNames} sensu::subscriptions: {get_param: MonitoringSubscriptions} service_configs: map_replace: - {get_param: ServiceConfigSettings} - values: {get_attr: [NetIpMap, net_ip_map]} object_extraconfig: {get_param: ObjectStorageExtraConfig} extraconfig: {get_param: ExtraConfig} object: tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade} fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]} fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]} fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]} fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]} fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]} fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]} SwiftStorageHieraDeploy: type: OS::Heat::StructuredDeployment depends_on: SwiftStorageUpgradeInitDeployment properties: name: SwiftStorageHieraDeploy server: {get_resource: SwiftStorage} config: {get_resource: SwiftStorageHieraConfig} input_values: enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]} # Resource for site-specific injection of root certificate NodeTLSCAData: depends_on: SwiftStorageHieraDeploy type: OS::TripleO::NodeTLSCAData properties: server: {get_resource: SwiftStorage} # Hook for site-specific additional pre-deployment config, # applying to all nodes, e.g node registration/unregistration NodeExtraConfig: depends_on: NodeTLSCAData type: OS::TripleO::NodeExtraConfig properties: server: {get_resource: SwiftStorage} UpdateConfig: type: OS::TripleO::Tasks::PackageUpdate UpdateDeployment: type: OS::Heat::SoftwareDeployment depends_on: NetworkDeployment properties: config: {get_resource: UpdateConfig} server: {get_resource: SwiftStorage} input_values: update_identifier: get_param: UpdateIdentifier SshHostPubKey: type: OS::TripleO::Ssh::HostPubKey depends_on: SwiftStorageHieraDeploy properties: server: {get_resource: SwiftStorage} outputs: ip_address: description: IP address of the server in the ctlplane network value: {get_attr: [SwiftStorage, networks, ctlplane, 0]} hostname: description: Hostname of the server value: {get_attr: [SwiftStorage, name]} 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]} 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 CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST params: PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ObjectStorageHostnameResolveNetwork]}]} DOMAIN: {get_param: CloudDomain} PRIMARYHOST: {get_attr: [SwiftStorage, 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]} CTLPLANEIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]} known_hosts_entry: description: Entry for ssh known hosts 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,\ CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY" params: PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ObjectStorageHostnameResolveNetwork]}]} DOMAIN: {get_param: CloudDomain} PRIMARYHOST: {get_attr: [SwiftStorage, 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]} CTLPLANEIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]} HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]} nova_server_resource: description: Heat resource handle for the swift storage server value: {get_resource: SwiftStorage} 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]}