Drop os-apply-config. No longer maintained.
Change-Id: I29e2a8f1b0c66f3cf88f40244d6da49f3d7420be
This commit is contained in:
parent
3ec35a3f2f
commit
5a6907f2b8
@ -15,8 +15,7 @@ Features
|
|||||||
The ability to deploy a multi-node, role based OpenStack deployment using
|
The ability to deploy a multi-node, role based OpenStack deployment using
|
||||||
OpenStack Heat. Notable features include:
|
OpenStack Heat. Notable features include:
|
||||||
|
|
||||||
* Choice of deployment/configuration tooling: puppet, os-apply-config, and
|
* Choice of deployment/configuration tooling: puppet, (soon) docker
|
||||||
(soon) docker
|
|
||||||
|
|
||||||
* Role based deployment: roles for the controller, compute, ceph, swift,
|
* Role based deployment: roles for the controller, compute, ceph, swift,
|
||||||
and cinder storage
|
and cinder storage
|
||||||
@ -43,11 +42,5 @@ A description of the directory layout in TripleO Heat Templates.
|
|||||||
* puppet: templates mostly driven by configuration with puppet. To use these
|
* puppet: templates mostly driven by configuration with puppet. To use these
|
||||||
templates you can use the overcloud-resource-registry-puppet.yaml.
|
templates you can use the overcloud-resource-registry-puppet.yaml.
|
||||||
|
|
||||||
* os-apply-config: templates mostly driven by configuration w/
|
|
||||||
os-collect-config and bash based
|
|
||||||
elements (which use the Heat os-apply-config group).
|
|
||||||
These will soon be deprecated and are no longer part
|
|
||||||
of the upstream CI testing efforts.
|
|
||||||
|
|
||||||
* validation-scripts: validation scripts useful to all deployment
|
* validation-scripts: validation scripts useful to all deployment
|
||||||
configurations
|
configurations
|
||||||
|
@ -1,93 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'All Nodes Config'
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
compute_hosts:
|
|
||||||
type: comma_delimited_list
|
|
||||||
controller_hosts:
|
|
||||||
type: comma_delimited_list
|
|
||||||
controller_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
block_storage_hosts:
|
|
||||||
type: comma_delimited_list
|
|
||||||
object_storage_hosts:
|
|
||||||
type: comma_delimited_list
|
|
||||||
ceph_storage_hosts:
|
|
||||||
type: comma_delimited_list
|
|
||||||
controller_names:
|
|
||||||
type: comma_delimited_list
|
|
||||||
rabbit_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
mongo_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
redis_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
memcache_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
mysql_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
horizon_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
heat_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
swift_proxy_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
ceilometer_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
nova_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
nova_metadata_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
glance_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
glance_registry_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
cinder_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
neutron_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
keystone_public_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
keystone_admin_api_node_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
allNodesConfigImpl:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
config:
|
|
||||||
completion-signal: {get_input: deploy_signal_id}
|
|
||||||
hosts:
|
|
||||||
list_join:
|
|
||||||
- "\n"
|
|
||||||
- - list_join:
|
|
||||||
- "\n"
|
|
||||||
- {get_param: compute_hosts}
|
|
||||||
- list_join:
|
|
||||||
- "\n"
|
|
||||||
- {get_param: controller_hosts}
|
|
||||||
- list_join:
|
|
||||||
- "\n"
|
|
||||||
- {get_param: block_storage_hosts}
|
|
||||||
- list_join:
|
|
||||||
- "\n"
|
|
||||||
- {get_param: object_storage_hosts}
|
|
||||||
- list_join:
|
|
||||||
- "\n"
|
|
||||||
- {get_param: ceph_storage_hosts}
|
|
||||||
rabbit:
|
|
||||||
nodes:
|
|
||||||
list_join:
|
|
||||||
- ','
|
|
||||||
- {get_param: controller_names}
|
|
||||||
sysctl:
|
|
||||||
net.ipv4.tcp_keepalive_time: 5
|
|
||||||
net.ipv4.tcp_keepalive_probes: 5
|
|
||||||
net.ipv4.tcp_keepalive_intvl: 1
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
config_id:
|
|
||||||
description: The ID of the allNodesConfigImpl resource.
|
|
||||||
value:
|
|
||||||
{get_resource: allNodesConfigImpl}
|
|
@ -1,69 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Ceph Cluster config data'
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
ceph_storage_count:
|
|
||||||
default: 0
|
|
||||||
type: number
|
|
||||||
description: Number of Ceph storage nodes. Used to enable/disable managed Ceph installation.
|
|
||||||
ceph_external_mon_ips:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: List of external Ceph Mon host IPs.
|
|
||||||
ceph_client_key:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: Ceph key used to create the client user keyring.
|
|
||||||
ceph_fsid:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
ceph_admin_key:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
ceph_mon_key:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
ceph_mon_names:
|
|
||||||
type: comma_delimited_list
|
|
||||||
ceph_mon_ips:
|
|
||||||
type: comma_delimited_list
|
|
||||||
NovaRbdPoolName:
|
|
||||||
default: vms
|
|
||||||
type: string
|
|
||||||
CinderRbdPoolName:
|
|
||||||
default: volumes
|
|
||||||
type: string
|
|
||||||
GlanceRbdPoolName:
|
|
||||||
default: images
|
|
||||||
type: string
|
|
||||||
CephClientUserName:
|
|
||||||
default: openstack
|
|
||||||
type: string
|
|
||||||
|
|
||||||
resources:
|
|
||||||
CephClusterConfigImpl:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
ceph_cluster:
|
|
||||||
mon_initial_members:
|
|
||||||
list_join:
|
|
||||||
- ','
|
|
||||||
- {get_param: ceph_mon_names}
|
|
||||||
mon_host:
|
|
||||||
list_join:
|
|
||||||
- ','
|
|
||||||
- {get_param: ceph_mon_ips}
|
|
||||||
fsid: {get_param: ceph_fsid}
|
|
||||||
admin_key: {get_param: ceph_admin_key}
|
|
||||||
mon_key: {get_param: ceph_mon_key}
|
|
||||||
# We would need a dedicated key for OSD bootstrap
|
|
||||||
bootstrap_osd_key: {get_param: ceph_mon_key}
|
|
||||||
osds: '{"/srv/data": {}}'
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
config_id:
|
|
||||||
description: The ID of the CephClusterConfigImpl resource.
|
|
||||||
value:
|
|
||||||
{get_resource: CephClusterConfigImpl}
|
|
@ -1,21 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Ceph Storage Post Deployment'
|
|
||||||
# NOTE: this is a noop for os-apply-config style deployments because
|
|
||||||
# post deployment ordering is controlled by tripleo-image-elements
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
servers:
|
|
||||||
type: json
|
|
||||||
NodeConfigIdentifiers:
|
|
||||||
type: json
|
|
||||||
description: Value which changes if the node configuration may need to be re-applied
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
# Note, this should come last, so use depends_on to ensure
|
|
||||||
# this is created after any other resources.
|
|
||||||
ExtraConfig:
|
|
||||||
type: OS::TripleO::NodeExtraConfigPost
|
|
||||||
properties:
|
|
||||||
servers: {get_param: servers}
|
|
||||||
|
|
@ -1,172 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Common Ceph Storage Configuration'
|
|
||||||
parameters:
|
|
||||||
Image:
|
|
||||||
type: string
|
|
||||||
default: overcloud-ceph-storage
|
|
||||||
KeyName:
|
|
||||||
default: default
|
|
||||||
description: Name of an existing EC2 KeyPair to enable SSH access to the instances
|
|
||||||
type: string
|
|
||||||
Flavor:
|
|
||||||
default: baremetal
|
|
||||||
description: Flavor for block storage nodes to request when deploying.
|
|
||||||
type: string
|
|
||||||
CephClusterFSID:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: The Ceph cluster FSID. Must be a UUID.
|
|
||||||
CephMonKey:
|
|
||||||
default: ''
|
|
||||||
description: The Ceph monitors key. Can be created with ceph-authtool --gen-print-key.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
CephAdminKey:
|
|
||||||
default: ''
|
|
||||||
description: The Ceph admin client key. Can be created with ceph-authtool --gen-print-key.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
CephMonitors:
|
|
||||||
default: ''
|
|
||||||
description: The list of ip/names to use as Ceph monitors
|
|
||||||
type: json
|
|
||||||
ServiceNetMap:
|
|
||||||
default: {}
|
|
||||||
description: Mapping of service_name -> network name. Typically set
|
|
||||||
via parameter_defaults in the resource registry.
|
|
||||||
type: json
|
|
||||||
UpdateIdentifier:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: >
|
|
||||||
Setting to a previously unused value during stack-update will trigger
|
|
||||||
package update on all nodes
|
|
||||||
Hostname:
|
|
||||||
type: string
|
|
||||||
default: '' # Defaults to Heat created hostname
|
|
||||||
ExtraConfig:
|
|
||||||
default: {}
|
|
||||||
description: |
|
|
||||||
Additional configuration to inject into the cluster. Note
|
|
||||||
that CephStorageExtraConfig takes precedence over ExtraConfig.
|
|
||||||
type: json
|
|
||||||
CephStorageExtraConfig:
|
|
||||||
default: {}
|
|
||||||
description: |
|
|
||||||
Role specific additional configuration to inject into the cluster.
|
|
||||||
type: json
|
|
||||||
|
|
||||||
|
|
||||||
resources:
|
|
||||||
CephStorage:
|
|
||||||
type: OS::Nova::Server
|
|
||||||
properties:
|
|
||||||
image:
|
|
||||||
{get_param: Image}
|
|
||||||
flavor: {get_param: OvercloudCephStorageFlavor}
|
|
||||||
key_name: {get_param: KeyName}
|
|
||||||
networks:
|
|
||||||
- network: ctlplane
|
|
||||||
user_data_format: SOFTWARE_CONFIG
|
|
||||||
user_data: {get_resource: NodeUserData}
|
|
||||||
name: {get_param: Hostname}
|
|
||||||
|
|
||||||
NodeUserData:
|
|
||||||
type: OS::TripleO::NodeUserData
|
|
||||||
|
|
||||||
StoragePort:
|
|
||||||
type: OS::TripleO::CephStorage::Ports::StoragePort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
StorageMgmtPort:
|
|
||||||
type: OS::TripleO::CephStorage::Ports::StorageMgmtPort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
NetworkConfig:
|
|
||||||
type: OS::TripleO::CephStorage::Net::SoftwareConfig
|
|
||||||
properties:
|
|
||||||
ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
|
|
||||||
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: CephStorage}
|
|
||||||
|
|
||||||
CephStorageDeployment:
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
server: {get_resource: CephStorage}
|
|
||||||
config: {get_resource: CephStorageConfig}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
CephStorageConfig:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
ceph:
|
|
||||||
fsid: {get_param: CephClusterFSID}
|
|
||||||
keyrings:
|
|
||||||
admin:
|
|
||||||
key: {get_param: CephAdminKey}
|
|
||||||
mon_nodes: {get_param: CephMonitors}
|
|
||||||
ControllerCephDeployment:
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
server: {get_resource: Controller}
|
|
||||||
config: {get_resource: ControllerCephConfig}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
ControllerCephConfig:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
cinder:
|
|
||||||
include_ceph_backend: true
|
|
||||||
ceph:
|
|
||||||
fsid: {get_param: CephClusterFSID}
|
|
||||||
keyrings:
|
|
||||||
mon:
|
|
||||||
key: {get_param: CephMonKey}
|
|
||||||
admin:
|
|
||||||
key: {get_param: CephAdminKey}
|
|
||||||
mon_nodes: {get_param: CephMonitors}
|
|
||||||
NovaComputeCephDeployment:
|
|
||||||
depends_on: [ControllerCephDeployment]
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
server: {get_resource: NovaCompute}
|
|
||||||
config: {get_resource: NovaComputeCephConfig}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
NovaComputeCephConfig:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
ceph:
|
|
||||||
fsid: {get_param: CephClusterFSID}
|
|
||||||
keyrings:
|
|
||||||
admin:
|
|
||||||
key: {get_param: CephAdminKey}
|
|
||||||
mon_nodes: {get_param: CephMonitors}
|
|
||||||
outputs:
|
|
||||||
hosts_entry:
|
|
||||||
value:
|
|
||||||
str_replace:
|
|
||||||
template: "IP HOST"
|
|
||||||
params:
|
|
||||||
IP: {get_attr: [CephStorage, networks, ctlplane, 0]}
|
|
||||||
HOST: {get_attr: [CephStorage, name]}
|
|
||||||
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]}
|
|
||||||
config_identifier:
|
|
||||||
description: identifier which changes if the node configuration may need re-applying
|
|
||||||
value: "None - NO_SIGNAL"
|
|
@ -1,21 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Common Block Storage Post Deployment'
|
|
||||||
# NOTE: this is a noop for os-apply-config style deployments because
|
|
||||||
# post deployment ordering is controlled by tripleo-image-elements
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
servers:
|
|
||||||
type: json
|
|
||||||
NodeConfigIdentifiers:
|
|
||||||
type: json
|
|
||||||
description: Value which changes if the node configuration may need to be re-applied
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
# Note, this should come last, so use depends_on to ensure
|
|
||||||
# this is created after any other resources.
|
|
||||||
ExtraConfig:
|
|
||||||
type: OS::TripleO::NodeExtraConfigPost
|
|
||||||
properties:
|
|
||||||
servers: {get_param: servers}
|
|
||||||
|
|
@ -1,234 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Common Block Storage Configuration'
|
|
||||||
parameters:
|
|
||||||
Image:
|
|
||||||
default: overcloud-cinder-volume
|
|
||||||
type: string
|
|
||||||
CinderEnableIscsiBackend:
|
|
||||||
default: true
|
|
||||||
description: Whether to enable or not the Iscsi backend for Cinder
|
|
||||||
type: boolean
|
|
||||||
CinderISCSIHelper:
|
|
||||||
default: tgtadm
|
|
||||||
description: The iSCSI helper to use with cinder.
|
|
||||||
type: string
|
|
||||||
CinderLVMLoopDeviceSize:
|
|
||||||
default: 5000
|
|
||||||
description: The size of the loopback file used by the cinder LVM driver.
|
|
||||||
type: number
|
|
||||||
CinderPassword:
|
|
||||||
default: unset
|
|
||||||
description: The password for the cinder service and db account, used by cinder-api.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
VirtualIP:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
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
|
|
||||||
BlockStorageExtraConfig:
|
|
||||||
default: {}
|
|
||||||
description: |
|
|
||||||
Role specific additional configuration to inject into the cluster.
|
|
||||||
type: json
|
|
||||||
Flavor:
|
|
||||||
description: Flavor for block storage nodes to request when deploying.
|
|
||||||
type: string
|
|
||||||
constraints:
|
|
||||||
- custom_constraint: nova.flavor
|
|
||||||
GlancePort:
|
|
||||||
default: "9292"
|
|
||||||
description: Glance port.
|
|
||||||
type: string
|
|
||||||
GlanceProtocol:
|
|
||||||
default: http
|
|
||||||
description: Protocol to use when connecting to glance, set to https for SSL.
|
|
||||||
type: string
|
|
||||||
KeyName:
|
|
||||||
default: default
|
|
||||||
description: Name of an existing EC2 KeyPair to enable SSH access to the instances
|
|
||||||
type: string
|
|
||||||
RabbitPassword:
|
|
||||||
default: 'guest'
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
RabbitUserName:
|
|
||||||
default: 'guest'
|
|
||||||
type: string
|
|
||||||
RabbitClientUseSSL:
|
|
||||||
default: false
|
|
||||||
description: >
|
|
||||||
Rabbit client subscriber parameter to specify
|
|
||||||
an SSL connection to the RabbitMQ host.
|
|
||||||
type: string
|
|
||||||
RabbitClientPort:
|
|
||||||
default: 5672
|
|
||||||
description: Set rabbit subscriber port, change this if using SSL
|
|
||||||
type: number
|
|
||||||
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
|
|
||||||
UpdateIdentifier:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: >
|
|
||||||
Setting to a previously unused value during stack-update will trigger
|
|
||||||
package update on all nodes
|
|
||||||
Hostname:
|
|
||||||
type: string
|
|
||||||
default: '' # Defaults to Heat created hostname
|
|
||||||
ServiceNetMap:
|
|
||||||
default: {}
|
|
||||||
description: Mapping of service_name -> network name. Typically set
|
|
||||||
via parameter_defaults in the resource registry.
|
|
||||||
type: json
|
|
||||||
GlanceApiVirtualIP:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
MysqlVirtualIP:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
|
|
||||||
resources:
|
|
||||||
BlockStorage:
|
|
||||||
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}
|
|
||||||
name: {get_param: Hostname}
|
|
||||||
|
|
||||||
NodeUserData:
|
|
||||||
type: OS::TripleO::NodeUserData
|
|
||||||
|
|
||||||
InternalApiPort:
|
|
||||||
type: OS::TripleO::BlockStorage::Ports::InternalApiPort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
StoragePort:
|
|
||||||
type: OS::TripleO::BlockStorage::Ports::StoragePort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
StorageMgmtPort:
|
|
||||||
type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
NetworkConfig:
|
|
||||||
type: OS::TripleO::BlockStorage::Net::SoftwareConfig
|
|
||||||
properties:
|
|
||||||
ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
|
|
||||||
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: BlockStorage}
|
|
||||||
|
|
||||||
BlockStorageDeployment:
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
server: {get_resource: BlockStorage}
|
|
||||||
config: {get_resource: BlockStorageConfig}
|
|
||||||
input_values:
|
|
||||||
controller_virtual_ip: {get_param: VirtualIP}
|
|
||||||
cinder_dsn: {list_join: ['', ['mysql://cinder:', {get_param: CinderPassword}, '@', {get_param: VirtualIP} , '/cinder']]}
|
|
||||||
snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
|
|
||||||
snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
BlockStorageConfig:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
keystone:
|
|
||||||
host: {get_input: controller_virtual_ip}
|
|
||||||
cinder:
|
|
||||||
db: {get_input: cinder_dsn}
|
|
||||||
volume_size_mb:
|
|
||||||
get_param: CinderLVMLoopDeviceSize
|
|
||||||
iscsi-helper:
|
|
||||||
get_param: CinderISCSIHelper
|
|
||||||
snmpd:
|
|
||||||
export_MIB: UCD-SNMP-MIB
|
|
||||||
readonly_user_name: {get_input: snmpd_readonly_user_name}
|
|
||||||
readonly_user_password: {get_input: snmpd_readonly_user_password}
|
|
||||||
rabbit:
|
|
||||||
host: {get_input: controller_virtual_ip}
|
|
||||||
username: {get_param: RabbitUserName}
|
|
||||||
password: {get_param: RabbitPassword}
|
|
||||||
glance:
|
|
||||||
host: {get_input: controller_virtual_ip}
|
|
||||||
port: {get_param: GlancePort}
|
|
||||||
outputs:
|
|
||||||
hosts_entry:
|
|
||||||
value:
|
|
||||||
str_replace:
|
|
||||||
template: "IP HOST"
|
|
||||||
params:
|
|
||||||
IP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
|
|
||||||
HOST: {get_attr: [BlockStorage, name]}
|
|
||||||
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]}
|
|
||||||
config_identifier:
|
|
||||||
description: identifier which changes if the node configuration may need re-applying
|
|
||||||
value: "None - NO_SIGNAL"
|
|
@ -1,22 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Compute Post Deployment'
|
|
||||||
# NOTE: this is a noop for os-apply-config style deployments because
|
|
||||||
# post deployment ordering is controlled by tripleo-image-elements
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
servers:
|
|
||||||
type: json
|
|
||||||
NodeConfigIdentifiers:
|
|
||||||
type: json
|
|
||||||
description: Value which changes if the node configuration may need to be re-applied
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
|
|
||||||
# Note, this should come last, so use depends_on to ensure
|
|
||||||
# this is created after any other resources.
|
|
||||||
ExtraConfig:
|
|
||||||
type: OS::TripleO::NodeExtraConfigPost
|
|
||||||
properties:
|
|
||||||
servers: {get_param: servers}
|
|
||||||
|
|
@ -1,569 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
|
|
||||||
description: >
|
|
||||||
OpenStack hypervisor node. Can be wrapped in a ResourceGroup for scaling.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
AdminPassword:
|
|
||||||
default: unset
|
|
||||||
description: The password for the keystone admin account, used for monitoring, querying neutron etc.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
CeilometerComputeAgent:
|
|
||||||
description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
constraints:
|
|
||||||
- allowed_values: ['', Present]
|
|
||||||
CeilometerMeteringSecret:
|
|
||||||
default: unset
|
|
||||||
description: Secret shared by the ceilometer services.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
CeilometerPassword:
|
|
||||||
default: unset
|
|
||||||
description: The password for the ceilometer service account.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
CinderEnableNfsBackend:
|
|
||||||
default: false
|
|
||||||
description: Whether to enable or not the NFS backend for Cinder
|
|
||||||
type: boolean
|
|
||||||
CinderEnableRbdBackend:
|
|
||||||
default: false
|
|
||||||
description: Whether to enable or not the Rbd backend for Cinder
|
|
||||||
type: boolean
|
|
||||||
Debug:
|
|
||||||
default: ''
|
|
||||||
description: Set to True to enable debugging on all services.
|
|
||||||
type: string
|
|
||||||
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 the nova compute node
|
|
||||||
type: string
|
|
||||||
constraints:
|
|
||||||
- custom_constraint: nova.flavor
|
|
||||||
GlanceHost:
|
|
||||||
type: string
|
|
||||||
default: '' # Has to be here because of the ignored empty value bug
|
|
||||||
GlancePort:
|
|
||||||
default: "9292"
|
|
||||||
description: Glance port.
|
|
||||||
type: string
|
|
||||||
GlanceProtocol:
|
|
||||||
default: http
|
|
||||||
description: Protocol to use when connecting to glance, set to https for SSL.
|
|
||||||
type: string
|
|
||||||
Image:
|
|
||||||
type: string
|
|
||||||
default: overcloud-compute
|
|
||||||
constraints:
|
|
||||||
- custom_constraint: glance.image
|
|
||||||
ImageUpdatePolicy:
|
|
||||||
default: 'REBUILD_PRESERVE_EPHEMERAL'
|
|
||||||
description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
|
|
||||||
type: string
|
|
||||||
KeyName:
|
|
||||||
description: Name of an existing EC2 KeyPair to enable SSH access to the instances
|
|
||||||
type: string
|
|
||||||
default: default
|
|
||||||
constraints:
|
|
||||||
- custom_constraint: nova.keypair
|
|
||||||
KeystoneAdminApiVirtualIP:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
KeystonePublicApiVirtualIP:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
NeutronBridgeMappings:
|
|
||||||
description: >
|
|
||||||
The OVS logical->physical bridge mappings to use. See the Neutron
|
|
||||||
documentation for details. Defaults to mapping br-ex - the external
|
|
||||||
bridge on hosts - to a physical name 'datacentre' which can be used
|
|
||||||
to create provider networks (and we use this for the default floating
|
|
||||||
network) - if changing this either use different post-install network
|
|
||||||
scripts or be sure to keep 'datacentre' as a mapping network name.
|
|
||||||
type: string
|
|
||||||
default: "datacentre:br-ex"
|
|
||||||
NeutronEnableTunnelling:
|
|
||||||
type: string
|
|
||||||
default: "True"
|
|
||||||
NeutronEnableL2Pop:
|
|
||||||
type: string
|
|
||||||
description: >
|
|
||||||
Enable/disable the L2 population feature in the Neutron agents.
|
|
||||||
default: "False"
|
|
||||||
NeutronFlatNetworks:
|
|
||||||
type: string
|
|
||||||
default: 'datacentre'
|
|
||||||
description: >
|
|
||||||
If set, flat networks to configure in neutron plugins.
|
|
||||||
NeutronHost:
|
|
||||||
type: string
|
|
||||||
default: '' # Has to be here because of the ignored empty value bug
|
|
||||||
NeutronNetworkType:
|
|
||||||
type: string
|
|
||||||
description: The tenant network type for Neutron, either gre or vxlan.
|
|
||||||
default: 'vxlan'
|
|
||||||
NeutronNetworkVLANRanges:
|
|
||||||
default: 'datacentre'
|
|
||||||
description: >
|
|
||||||
The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
|
|
||||||
Neutron documentation for permitted values. Defaults to permitting any
|
|
||||||
VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
|
|
||||||
type: comma_delimited_list
|
|
||||||
NeutronPassword:
|
|
||||||
default: unset
|
|
||||||
description: The password for the neutron service account, used by neutron agents.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
NeutronPhysicalBridge:
|
|
||||||
default: ''
|
|
||||||
description: An OVS bridge to create for accessing external networks.
|
|
||||||
type: string
|
|
||||||
NeutronPublicInterface:
|
|
||||||
default: nic1
|
|
||||||
description: A port to add to the NeutronPhysicalBridge.
|
|
||||||
type: string
|
|
||||||
NeutronTunnelTypes:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The tunnel types for the Neutron tenant network. To specify multiple
|
|
||||||
values, use a comma separated string, like so: 'gre,vxlan'
|
|
||||||
default: 'vxlan'
|
|
||||||
NeutronTunnelIdRanges:
|
|
||||||
description: |
|
|
||||||
Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
|
|
||||||
of GRE tunnel IDs that are available for tenant network allocation
|
|
||||||
default: ["1:1000", ]
|
|
||||||
type: comma_delimited_list
|
|
||||||
NeutronVniRanges:
|
|
||||||
description: |
|
|
||||||
Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
|
|
||||||
of VXLAN VNI IDs that are available for tenant network allocation
|
|
||||||
default: ["1:1000", ]
|
|
||||||
type: comma_delimited_list
|
|
||||||
NeutronPublicInterfaceRawDevice:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
NeutronDVR:
|
|
||||||
default: 'False'
|
|
||||||
type: string
|
|
||||||
NeutronMetadataProxySharedSecret:
|
|
||||||
default: 'unset'
|
|
||||||
description: Shared secret to prevent spoofing
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
NeutronCorePlugin:
|
|
||||||
default: "ml2"
|
|
||||||
description: |
|
|
||||||
The core plugin for Neutron. The value should be the entrypoint to be loaded
|
|
||||||
from neutron.core_plugins namespace.
|
|
||||||
type: string
|
|
||||||
NeutronServicePlugins:
|
|
||||||
default: "router"
|
|
||||||
description: |
|
|
||||||
Comma-separated list of service plugin entrypoints to be loaded from the
|
|
||||||
neutron.service_plugins namespace.
|
|
||||||
type: comma_delimited_list
|
|
||||||
NeutronTypeDrivers:
|
|
||||||
default: "vxlan,vlan,flat,gre"
|
|
||||||
description: |
|
|
||||||
Comma-separated list of network type driver entrypoints to be loaded.
|
|
||||||
type: comma_delimited_list
|
|
||||||
NeutronMechanismDrivers:
|
|
||||||
default: 'openvswitch'
|
|
||||||
description: |
|
|
||||||
The mechanism drivers for the Neutron tenant network. To specify multiple
|
|
||||||
values, use a comma separated string, like so: 'openvswitch,l2_population'
|
|
||||||
type: string
|
|
||||||
# Not relevant for Computes, should be removed
|
|
||||||
NeutronAllowL3AgentFailover:
|
|
||||||
default: 'True'
|
|
||||||
description: Allow automatic l3-agent failover
|
|
||||||
type: string
|
|
||||||
# Not relevant for Computes, should be removed
|
|
||||||
NeutronL3HA:
|
|
||||||
default: 'False'
|
|
||||||
description: Whether to enable l3-agent HA
|
|
||||||
type: string
|
|
||||||
NeutronAgentMode:
|
|
||||||
default: 'dvr_snat'
|
|
||||||
description: Agent mode for the neutron-l3-agent on the controller hosts
|
|
||||||
type: string
|
|
||||||
NovaApiHost:
|
|
||||||
type: string
|
|
||||||
default: '' # Has to be here because of the ignored empty value bug
|
|
||||||
NovaComputeDriver:
|
|
||||||
type: string
|
|
||||||
default: libvirt.LibvirtDriver
|
|
||||||
NovaComputeExtraConfig:
|
|
||||||
default: {}
|
|
||||||
description: |
|
|
||||||
NovaCompute specific configuration to inject into the cluster. Same
|
|
||||||
structure as ExtraConfig.
|
|
||||||
type: json
|
|
||||||
NovaComputeLibvirtType:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
NovaEnableRbdBackend:
|
|
||||||
default: false
|
|
||||||
description: Whether to enable or not the Rbd backend for Nova
|
|
||||||
type: boolean
|
|
||||||
NovaPassword:
|
|
||||||
default: unset
|
|
||||||
description: The password for the nova service account, used by nova-api.
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
NovaPublicIP:
|
|
||||||
type: string
|
|
||||||
default: '' # Has to be here because of the ignored empty value bug
|
|
||||||
NtpServer:
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
RabbitHost:
|
|
||||||
type: string
|
|
||||||
default: '' # Has to be here because of the ignored empty value bug
|
|
||||||
RabbitPassword:
|
|
||||||
default: guest
|
|
||||||
description: The password for RabbitMQ
|
|
||||||
type: string
|
|
||||||
hidden: true
|
|
||||||
RabbitUserName:
|
|
||||||
default: guest
|
|
||||||
description: The username for RabbitMQ
|
|
||||||
type: string
|
|
||||||
RabbitClientUseSSL:
|
|
||||||
default: false
|
|
||||||
description: >
|
|
||||||
Rabbit client subscriber parameter to specify
|
|
||||||
an SSL connection to the RabbitMQ host.
|
|
||||||
type: string
|
|
||||||
RabbitClientPort:
|
|
||||||
default: 5672
|
|
||||||
description: Set rabbit subscriber port, change this if using SSL
|
|
||||||
type: number
|
|
||||||
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
|
|
||||||
ServiceNetMap:
|
|
||||||
default: {}
|
|
||||||
description: Mapping of service_name -> network name. Typically set
|
|
||||||
via parameter_defaults in the resource registry.
|
|
||||||
type: json
|
|
||||||
UpdateIdentifier:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: >
|
|
||||||
Setting to a previously unused value during stack-update will trigger
|
|
||||||
package update on all nodes
|
|
||||||
Hostname:
|
|
||||||
type: string
|
|
||||||
default: '' # Defaults to Heat created hostname
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
NovaCompute:
|
|
||||||
type: OS::Nova::Server
|
|
||||||
properties:
|
|
||||||
image:
|
|
||||||
{get_param: Image}
|
|
||||||
image_update_policy:
|
|
||||||
get_param: ImageUpdatePolicy
|
|
||||||
flavor: {get_param: Flavor}
|
|
||||||
key_name: {get_param: KeyName}
|
|
||||||
networks:
|
|
||||||
- network: ctlplane
|
|
||||||
user_data_format: SOFTWARE_CONFIG
|
|
||||||
user_data: {get_resource: NodeUserData}
|
|
||||||
name: {get_param: Hostname}
|
|
||||||
|
|
||||||
NodeUserData:
|
|
||||||
type: OS::TripleO::NodeUserData
|
|
||||||
|
|
||||||
InternalApiPort:
|
|
||||||
type: OS::TripleO::Compute::Ports::InternalApiPort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
StoragePort:
|
|
||||||
type: OS::TripleO::Compute::Ports::StoragePort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
TenantPort:
|
|
||||||
type: OS::TripleO::Compute::Ports::TenantPort
|
|
||||||
properties:
|
|
||||||
ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
|
|
||||||
NetworkConfig:
|
|
||||||
type: OS::TripleO::Compute::Net::SoftwareConfig
|
|
||||||
properties:
|
|
||||||
ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
|
|
||||||
StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
|
|
||||||
TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
|
|
||||||
|
|
||||||
NetworkDeployment:
|
|
||||||
type: OS::TripleO::SoftwareDeployment
|
|
||||||
properties:
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
config: {get_resource: NetworkConfig}
|
|
||||||
server: {get_resource: NovaCompute}
|
|
||||||
input_values:
|
|
||||||
bridge_name: {get_param: NeutronPhysicalBridge}
|
|
||||||
interface_name: {get_param: NeutronPublicInterface}
|
|
||||||
|
|
||||||
NovaComputeConfig:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
nova:
|
|
||||||
compute_driver: { get_input: nova_compute_driver }
|
|
||||||
compute_libvirt_type: { get_input: nova_compute_libvirt_type }
|
|
||||||
debug: {get_input: debug}
|
|
||||||
host: {get_input: nova_api_host}
|
|
||||||
public_ip: {get_input: nova_public_ip}
|
|
||||||
service-password: {get_input: nova_password}
|
|
||||||
ceilometer:
|
|
||||||
debug: {get_input: debug}
|
|
||||||
metering_secret: {get_input: ceilometer_metering_secret}
|
|
||||||
service-password: {get_input: ceilometer_password}
|
|
||||||
compute_agent: {get_input: ceilometer_compute_agent}
|
|
||||||
snmpd:
|
|
||||||
export_MIB: UCD-SNMP-MIB
|
|
||||||
readonly_user_name: {get_input: snmpd_readonly_user_name}
|
|
||||||
readonly_user_password: {get_input: snmpd_readonly_user_password}
|
|
||||||
glance:
|
|
||||||
debug: {get_input: debug}
|
|
||||||
host: {get_input: glance_host}
|
|
||||||
port: {get_input: glance_port}
|
|
||||||
protocol: {get_input: glance_protocol}
|
|
||||||
keystone:
|
|
||||||
debug: {get_input: debug}
|
|
||||||
host: {get_input: keystone_host}
|
|
||||||
neutron:
|
|
||||||
debug: {get_input: debug}
|
|
||||||
flat-networks: {get_input: neutron_flat_networks}
|
|
||||||
host: {get_input: neutron_host}
|
|
||||||
router_distributed: {get_input: neutron_router_distributed}
|
|
||||||
agent_mode: {get_input: neutron_agent_mode}
|
|
||||||
ovs_db: {get_input: neutron_dsn}
|
|
||||||
metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
|
|
||||||
core_plugin: {get_input: neutron_core_plugin}
|
|
||||||
service_plugins: {get_input: neutron_service_plugins}
|
|
||||||
type_drivers: {get_input: neutron_type_drivers}
|
|
||||||
mechanism_drivers: {get_input: neutron_mechanism_drivers}
|
|
||||||
allow_automatic_l3agent_failover: {get_input: neutron_allow_l3agent_failover}
|
|
||||||
l3_ha: {get_input: neutron_l3_ha}
|
|
||||||
ovs:
|
|
||||||
local_ip: {get_input: neutron_local_ip}
|
|
||||||
tenant_network_type: {get_input: neutron_tenant_network_type}
|
|
||||||
tunnel_types: {get_input: neutron_tunnel_types}
|
|
||||||
network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
|
|
||||||
tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
|
|
||||||
vni_ranges: {get_input: neutron_vni_ranges}
|
|
||||||
bridge_mappings: {get_input: neutron_bridge_mappings}
|
|
||||||
enable_tunneling: {get_input: neutron_enable_tunneling}
|
|
||||||
l2_population: {get_input: neutron_enable_l2pop}
|
|
||||||
physical_bridge: {get_input: neutron_physical_bridge}
|
|
||||||
public_interface: {get_input: neutron_public_interface}
|
|
||||||
public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
|
|
||||||
service-password: {get_input: neutron_password}
|
|
||||||
admin-password: {get_input: admin_password}
|
|
||||||
rabbit:
|
|
||||||
host: {get_input: rabbit_host}
|
|
||||||
username: {get_input: rabbit_username}
|
|
||||||
password: {get_input: rabbit_password}
|
|
||||||
ntp:
|
|
||||||
servers:
|
|
||||||
- {server: {get_input: ntp_server}}
|
|
||||||
|
|
||||||
NovaComputeDeployment:
|
|
||||||
type: OS::TripleO::SoftwareDeployment
|
|
||||||
properties:
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
config: {get_resource: NovaComputeConfig}
|
|
||||||
server: {get_resource: NovaCompute}
|
|
||||||
input_values:
|
|
||||||
debug: {get_param: Debug}
|
|
||||||
nova_compute_driver: {get_param: NovaComputeDriver}
|
|
||||||
nova_compute_libvirt_type: {get_param: NovaComputeLibvirtType}
|
|
||||||
nova_public_ip: {get_param: NovaPublicIP}
|
|
||||||
nova_api_host: {get_param: NovaApiHost}
|
|
||||||
nova_password: {get_param: NovaPassword}
|
|
||||||
ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
|
|
||||||
ceilometer_password: {get_param: CeilometerPassword}
|
|
||||||
ceilometer_compute_agent: {get_param: CeilometerComputeAgent}
|
|
||||||
snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
|
|
||||||
snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
|
|
||||||
glance_host: {get_param: GlanceHost}
|
|
||||||
glance_port: {get_param: GlancePort}
|
|
||||||
glance_protocol: {get_param: GlanceProtocol}
|
|
||||||
keystone_host: {get_param: KeystonePublicApiVirtualIP}
|
|
||||||
neutron_flat_networks: {get_param: NeutronFlatNetworks}
|
|
||||||
neutron_host: {get_param: NeutronHost}
|
|
||||||
neutron_local_ip: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
neutron_tenant_network_type: {get_param: NeutronNetworkType}
|
|
||||||
neutron_tunnel_types: {get_param: NeutronTunnelTypes}
|
|
||||||
neutron_tunnel_id_ranges:
|
|
||||||
str_replace:
|
|
||||||
template: "['RANGES']"
|
|
||||||
params:
|
|
||||||
RANGES:
|
|
||||||
list_join:
|
|
||||||
- "','"
|
|
||||||
- {get_param: NeutronTunnelIdRanges}
|
|
||||||
neutron_vni_ranges:
|
|
||||||
str_replace:
|
|
||||||
template: "['RANGES']"
|
|
||||||
params:
|
|
||||||
RANGES:
|
|
||||||
list_join:
|
|
||||||
- "','"
|
|
||||||
- {get_param: NeutronVniRanges}
|
|
||||||
neutron_network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
|
|
||||||
neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
|
|
||||||
neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
|
|
||||||
neutron_enable_l2pop: {get_param: NeutronEnableL2Pop}
|
|
||||||
neutron_physical_bridge: {get_param: NeutronPhysicalBridge}
|
|
||||||
neutron_public_interface: {get_param: NeutronPublicInterface}
|
|
||||||
neutron_password: {get_param: NeutronPassword}
|
|
||||||
neutron_agent_mode: {get_param: NeutronAgentMode}
|
|
||||||
neutron_router_distributed: {get_param: NeutronDVR}
|
|
||||||
neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
|
|
||||||
neutron_core_plugin: {get_param: NeutronCorePlugin}
|
|
||||||
neutron_service_plugins:
|
|
||||||
str_replace:
|
|
||||||
template: "['PLUGINS']"
|
|
||||||
params:
|
|
||||||
PLUGINS:
|
|
||||||
list_join:
|
|
||||||
- "','"
|
|
||||||
- {get_param: NeutronServicePlugins}
|
|
||||||
neutron_type_drivers:
|
|
||||||
str_replace:
|
|
||||||
template: "['DRIVERS']"
|
|
||||||
params:
|
|
||||||
DRIVERS:
|
|
||||||
list_join:
|
|
||||||
- "','"
|
|
||||||
- {get_param: NeutronTypeDrivers}
|
|
||||||
neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
|
|
||||||
neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
|
|
||||||
neutron_l3_ha: {get_param: NeutronL3HA}
|
|
||||||
neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
|
|
||||||
admin_password: {get_param: AdminPassword}
|
|
||||||
rabbit_host: {get_param: RabbitHost}
|
|
||||||
rabbit_username: {get_param: RabbitUserName}
|
|
||||||
rabbit_password: {get_param: RabbitPassword}
|
|
||||||
ntp_server: {get_param: NtpServer}
|
|
||||||
|
|
||||||
NovaComputePassthrough:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config: {get_input: passthrough_config}
|
|
||||||
|
|
||||||
NovaComputePassthroughSpecific:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config: {get_input: passthrough_config_specific}
|
|
||||||
|
|
||||||
NovaComputePassthroughDeployment:
|
|
||||||
depends_on: [NovaComputeDeployment]
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
config: {get_resource: NovaComputePassthrough}
|
|
||||||
server: {get_resource: NovaCompute}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
input_values:
|
|
||||||
passthrough_config: {get_param: ExtraConfig}
|
|
||||||
|
|
||||||
NovaComputePassthroughDeploymentSpecific:
|
|
||||||
depends_on: [NovaComputePassthroughDeployment]
|
|
||||||
type: OS::Heat::StructuredDeployment
|
|
||||||
properties:
|
|
||||||
config: {get_resource: NovaComputePassthroughSpecific}
|
|
||||||
server: {get_resource: NovaCompute}
|
|
||||||
signal_transport: NO_SIGNAL
|
|
||||||
input_values:
|
|
||||||
passthrough_config_specific: {get_param: NovaComputeExtraConfig}
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
ip_address:
|
|
||||||
description: IP address of the server in the ctlplane network
|
|
||||||
value: {get_attr: [NovaCompute, 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]}
|
|
||||||
tenant_ip_address:
|
|
||||||
description: IP address of the server in the tenant network
|
|
||||||
value: {get_attr: [TenantPort, ip_address]}
|
|
||||||
hostname:
|
|
||||||
description: Hostname of the server
|
|
||||||
value: {get_attr: [NovaCompute, name]}
|
|
||||||
hosts_entry:
|
|
||||||
description: >
|
|
||||||
Server's IP address and hostname in the /etc/hosts format
|
|
||||||
value:
|
|
||||||
str_replace:
|
|
||||||
template: "IP HOST"
|
|
||||||
params:
|
|
||||||
IP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
|
|
||||||
HOST: {get_attr: [NovaCompute, name]}
|
|
||||||
nova_server_resource:
|
|
||||||
description: Heat resource handle for the Nova compute server
|
|
||||||
value:
|
|
||||||
{get_resource: NovaCompute}
|
|
||||||
config_identifier:
|
|
||||||
description: identifier which changes if the node configuration may need re-applying
|
|
||||||
value: "None - NO_SIGNAL"
|
|
@ -1,20 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Controller Post Deployment'
|
|
||||||
# NOTE: this is a noop for os-apply-config style deployments because
|
|
||||||
# post deployment ordering is controlled by tripleo-image-elements
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
servers:
|
|
||||||
type: json
|
|
||||||
NodeConfigIdentifiers:
|
|
||||||
type: json
|
|
||||||
description: Value which changes if the node configuration may need to be re-applied
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
# Note, this should come last, so use depends_on to ensure
|
|
||||||
# this is created after any other resources.
|
|
||||||
ExtraConfig:
|
|
||||||
type: OS::TripleO::NodeExtraConfigPost
|
|
||||||
properties:
|
|
||||||
servers: {get_param: servers}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,38 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Swift Devices and Proxy Config'
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
controller_swift_devices:
|
|
||||||
type: comma_delimited_list
|
|
||||||
object_store_swift_devices:
|
|
||||||
type: comma_delimited_list
|
|
||||||
controller_swift_proxy_memcaches:
|
|
||||||
type: comma_delimited_list
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
SwiftDevicesAndProxyConfigImpl:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
config:
|
|
||||||
swift:
|
|
||||||
devices:
|
|
||||||
list_join:
|
|
||||||
- ", "
|
|
||||||
- - list_join:
|
|
||||||
- ", "
|
|
||||||
- {get_param: controller_swift_devices}
|
|
||||||
- list_join:
|
|
||||||
- ", "
|
|
||||||
- {get_param: object_store_swift_devices}
|
|
||||||
proxy-memcache:
|
|
||||||
list_join:
|
|
||||||
- ","
|
|
||||||
- {get_param: controller_swift_proxy_memcaches}
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
config_id:
|
|
||||||
description: The ID of the SwiftDevicesAndProxyConfigImpl resource.
|
|
||||||
value:
|
|
||||||
{get_resource: SwiftDevicesAndProxyConfigImpl}
|
|
@ -1,21 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
description: 'Swift Storage Post Deployment'
|
|
||||||
# NOTE: this is a noop for os-apply-config style deployments because
|
|
||||||
# post deployment ordering is controlled by tripleo-image-elements
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
servers:
|
|
||||||
type: json
|
|
||||||
NodeConfigIdentifiers:
|
|
||||||
type: json
|
|
||||||
description: Value which changes if the node configuration may need to be re-applied
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
# Note, this should come last, so use depends_on to ensure
|
|
||||||
# this is created after any other resources.
|
|
||||||
ExtraConfig:
|
|
||||||
type: OS::TripleO::NodeExtraConfigPost
|
|
||||||
properties:
|
|
||||||
servers: {get_param: servers}
|
|
||||||
|
|
@ -1,209 +0,0 @@
|
|||||||
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
|
|
||||||
ObjectStorageExtraConfig:
|
|
||||||
default: {}
|
|
||||||
description: |
|
|
||||||
Role specific additional configuration to inject into the cluster.
|
|
||||||
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
|
|
||||||
UpdateIdentifier:
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
description: >
|
|
||||||
Setting to a previously unused value during stack-update will trigger
|
|
||||||
package update on all nodes
|
|
||||||
Hostname:
|
|
||||||
type: string
|
|
||||||
default: '' # Defaults to Heat created hostname
|
|
||||||
|
|
||||||
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}
|
|
||||||
name: {get_param: Hostname}
|
|
||||||
|
|
||||||
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:
|
|
||||||
ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
|
|
||||||
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]}
|
|
||||||
config_identifier:
|
|
||||||
description: identifier which changes if the node configuration may need re-applying
|
|
||||||
value: "None - NO_SIGNAL"
|
|
@ -1,16 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
|
|
||||||
description: >
|
|
||||||
Configure hieradata for service -> virtual IP mappings.
|
|
||||||
|
|
||||||
resources:
|
|
||||||
VipConfigImpl:
|
|
||||||
type: OS::Heat::StructuredConfig
|
|
||||||
properties:
|
|
||||||
group: os-apply-config
|
|
||||||
# by default does nothing
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
OS::stack_id:
|
|
||||||
description: The VipConfigImpl resource.
|
|
||||||
value: {get_resource: VipConfigImpl}
|
|
Loading…
Reference in New Issue
Block a user