heat_template_version: 2015-04-30 description: 'Common Swift Storage Configuration' parameters: ExtraConfig: default: {} description: | Additional configuration to inject into the cluster. The JSON should have the following structure: {"FILEKEY": {"config": [{"section": "SECTIONNAME", "values": [{"option": "OPTIONNAME", "value": "VALUENAME" } ] } ] } } For instance: {"nova": {"config": [{"section": "default", "values": [{"option": "force_config_drive", "value": "always" } ] }, {"section": "cells", "values": [{"option": "driver", "value": "nova.cells.rpc_driver.CellsRPCDriver" } ] } ] } } type: json Flavor: description: Flavor for Swift storage nodes to request when deploying. type: string constraints: - custom_constraint: nova.flavor HashSuffix: default: unset description: A random string to be used as a salt when hashing to determine mappings in the ring. hidden: true type: string Image: default: overcloud-swift-storage type: string KeyName: default: default description: Name of an existing EC2 KeyPair to enable SSH access to the instances type: string MountCheck: default: 'false' description: Value of mount_check in Swift account/container/object -server.conf type: boolean MinPartHours: type: number default: 1 description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance. PartPower: default: 10 description: Partition Power to use when building Swift rings type: number Replicas: type: number default: 3 description: How many replicas to use in the swift rings. SnmpdReadonlyUserName: default: ro_snmp_user description: The user name for SNMPd with readonly rights running on all Overcloud nodes type: string SnmpdReadonlyUserPassword: default: unset description: The user password for SNMPd with readonly rights running on all Overcloud nodes type: string hidden: true resources: SwiftConfig: type: OS::Heat::StructuredConfig properties: group: os-apply-config config: snmpd: export_MIB: UCD-SNMP-MIB readonly_user_name: {get_input: snmpd_readonly_user_name} readonly_user_password: {get_input: snmpd_readonly_user_password} swift: hash: { get_input: swift_hash_suffix } part-power: { get_input: swift_part_power } min-part-hours: { get_input: swift_min_part_hours } mount-check: { get_input: swift_mount_check } replicas: {get_input: swift_replicas } neutron: ovs: local_ip: { get_input: neutron_local_ip } SwiftStorage: type: OS::Nova::Server properties: image: {get_param: Image} flavor: {get_param: Flavor} key_name: {get_param: KeyName} networks: - network: ctlplane user_data_format: SOFTWARE_CONFIG user_data: {get_resource: NodeUserData} NodeUserData: type: OS::TripleO::NodeUserData InternalApiPort: type: OS::TripleO::SwiftStorage::Ports::InternalApiPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} StoragePort: type: OS::TripleO::SwiftStorage::Ports::StoragePort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} StorageMgmtPort: type: OS::TripleO::SwiftStorage::Ports::StorageMgmtPort properties: ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} NetworkConfig: type: OS::TripleO::ObjectStorage::Net::SoftwareConfig properties: InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]} StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]} StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]} NetworkDeployment: type: OS::TripleO::SoftwareDeployment properties: config: {get_resource: NetworkConfig} server: {get_resource: SwiftStorage} SwiftStorageDeploy: type: OS::Heat::StructuredDeployment properties: server: {get_resource: SwiftStorage} config: {get_resource: SwiftConfig} signal_transport: NO_SIGNAL input_values: neutron_local_ip: {get_attr: [SwiftStorage, networks, ctlplane, 0]} snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName} snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword} swift_hash_suffix: {get_param: HashSuffix} swift_mount_check: {get_param: MountCheck} swift_min_part_hours: {get_param: MinPartHours} swift_part_power: {get_param: PartPower} swift_replicas: { get_param: Replicas} outputs: hosts_entry: value: str_replace: template: "IP HOST" params: IP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} HOST: {get_attr: [SwiftStorage, name]} nova_server_resource: description: Heat resource handle for the swift storage server value: {get_resource: SwiftStorage} swift_device: description: Swift device formatted for swift-ring-builder value: str_replace: template: 'r1z1-IP:%PORT%/d1' params: IP: {get_attr: [SwiftStorage, networks, ctlplane, 0]} 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]}