Switch overcloud to software-config

This migrates the overcloud to using OS::Heat::StructuredConfig and
OS::Heat::StructuredDeployment. With those tools, we can decouple
servers from software configuration and begin to deprecate features in
tripleo_heat_merge.

Change-Id: Ice85f0711e90d0fabf1d1bc4698201c4d6758508
This commit is contained in:
Clint Byrum 2014-03-19 15:16:32 -07:00 committed by Robert Collins
parent a830cea3b1
commit be5af1a35e
10 changed files with 415 additions and 619 deletions

View File

@ -11,8 +11,8 @@ overcloud_source_deps = nova-compute-instance.yaml
all: $(generated_templates) all: $(generated_templates)
overcloud.yaml: overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps) overcloud.yaml: overcloud-source.yaml block-storage.yaml swift-deploy.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml nova-compute-config.yaml $(overcloud_source_deps)
python ./tripleo_heat_merge/merge.py --scale NovaCompute=$${COMPUTESCALE:-'1'} --scale SwiftStorage=$${SWIFTSTORAGESCALE='0'} --scale BlockStorage=$${BLOCKSTORAGESCALE='0'} overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml > $@.tmp python ./tripleo_heat_merge/merge.py --scale NovaCompute=$${COMPUTESCALE:-'1'} --scale SwiftStorage=$${SWIFTSTORAGESCALE='0'} --scale BlockStorage=$${BLOCKSTORAGESCALE='0'} overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml swift-deploy.yaml nova-compute-config.yaml > $@.tmp
mv $@.tmp $@ mv $@.tmp $@
overcloud-with-block-storage-nfs.yaml: overcloud-source.yaml block-storage-nfs.yaml nfs-server-source.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps) overcloud-with-block-storage-nfs.yaml: overcloud-source.yaml block-storage-nfs.yaml nfs-server-source.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps)

View File

@ -15,30 +15,6 @@ Parameters:
Type: String Type: String
Default: True Default: True
Resources: Resources:
BlockStorageAccessPolicy:
Type: OS::Heat::AccessPolicy
Properties:
AllowedResources:
- BlockStorage0
- BlockStorage0Config
BlockStorageUser:
Type: AWS::IAM::User
Properties:
Policies: [ { Ref: BlockStorageAccessPolicy } ]
BlockStorage0Key:
Type: AWS::IAM::AccessKey
Properties:
UserName:
Ref: BlockStorageUser
BlockStorage0CompletionCondition:
Type: AWS::CloudFormation::WaitCondition
DependsOn: controller0Config
Properties:
Handle: {Ref: BlockStorage0CompletionHandle}
Count: '1'
Timeout: '1800'
BlockStorage0CompletionHandle:
Type: AWS::CloudFormation::WaitConditionHandle
BlockStorage0: BlockStorage0:
Type: OS::Nova::Server Type: OS::Nova::Server
Properties: Properties:
@ -46,37 +22,24 @@ Resources:
{Ref: BlockStorageImage} {Ref: BlockStorageImage}
flavor: {Ref: OvercloudBlockStorageFlavor} flavor: {Ref: OvercloudBlockStorageFlavor}
key_name: {Ref: KeyName} key_name: {Ref: KeyName}
Metadata: BlockStorage0Deployment:
os-collect-config: Type: OS::Heat::StructuredDeployment
cfn:
access_key_id:
Ref: BlockStorage0Key
secret_access_key:
Fn::GetAtt: [ BlockStorage0Key, SecretAccessKey ]
stack_name: {Ref: 'AWS::StackName'}
path: BlockStorage0Config.Metadata
OpenStack::ImageBuilder::Elements: [ cinder ]
BlockStorage0Config:
Type: AWS::AutoScaling::LaunchConfiguration
Properties: Properties:
InstanceType: '0' server: {Ref: BlockStorage0}
ImageId: '0' config: {Ref: BlockStorageConfig}
Metadata: input_values:
completion-handle: controller_host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
Ref: BlockStorage0CompletionHandle cinder_dsn: {"Fn::Join": ['', ['mysql://cinder:unset@', {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } , '/cinder']]}
os-collect-config: neutron_local_ip: {"Fn::Select": [0, "Fn::Select": [ctlplane, [{"Fn::GetAtt": [BlockStorage0 , networks]}]]]}
cfn: BlockStorageConfig:
access_key_id: Type: OS::Heat::StructuredConfig
Ref: BlockStorage0Key Properties:
secret_access_key: config:
Fn::GetAtt: [ BlockStorage0Key, SecretAccessKey ]
stack_name: {Ref: 'AWS::StackName'}
path: BlockStorage0Config.Metadata
admin-password: {Ref: AdminPassword} admin-password: {Ref: AdminPassword}
keystone: keystone:
host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } host: {get_input: controller_host}
cinder: cinder:
db: {"Fn::Join": ['', ['mysql://cinder:unset@', {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } , '/cinder']]} db: {get_input: cinder_dsn}
volume_size_mb: '5000' volume_size_mb: '5000'
service-password: service-password:
Ref: CinderPassword Ref: CinderPassword
@ -84,21 +47,38 @@ Resources:
Ref: CinderISCSIHelper Ref: CinderISCSIHelper
admin-password: {Ref: AdminPassword} admin-password: {Ref: AdminPassword}
rabbit: rabbit:
host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } host: {get_input: controller_host}
username: {Ref: RabbitUserName} username: {Ref: RabbitUserName}
password: {Ref: RabbitPassword} password: {Ref: RabbitPassword}
interfaces: interfaces:
control: {Ref: NeutronPublicInterface} control: {Ref: NeutronPublicInterface}
neutron: neutron:
ovs: ovs:
local_ip: local_ip: {get_input: neutron_local_ip}
Fn::Select: tenant_network_type: {Ref: NeutronNetworkType}
- 0 enable_tunneling: {Ref: NeutronEnableTunnelling}
- Fn::Select: service-password:
- ctlplane Ref: NeutronPassword
- Fn::GetAtt: config:
- BlockStorage0 keystone:
- networks host: {get_input: controller_host}
cinder:
db: {get_input: cinder_dsn}
volume_size_mb: '5000'
service-password:
Ref: CinderPassword
iscsi-helper:
Ref: CinderISCSIHelper
admin-password: {Ref: AdminPassword}
rabbit:
host: {get_input: controller_host}
username: {Ref: RabbitUserName}
password: {Ref: RabbitPassword}
interfaces:
control: {Ref: NeutronPublicInterface}
neutron:
ovs:
local_ip: { get_input: neutron_local_ip }
tenant_network_type: {Ref: NeutronNetworkType} tenant_network_type: {Ref: NeutronNetworkType}
enable_tunneling: {Ref: NeutronEnableTunnelling} enable_tunneling: {Ref: NeutronEnableTunnelling}
service-password: service-password:

47
nova-compute-config.yaml Normal file
View File

@ -0,0 +1,47 @@
Resources:
NovaComputeConfig:
Type: OS::Heat::StructuredConfig
Properties:
config:
nova:
compute_driver: { get_input: nova_compute_driver }
compute_libvirt_type: { get_input: nova_compute_libvirt_type }
db: {get_input: nova_dsn}
host: {get_input: nova_api_host}
service-password: {get_input: nova_password}
ceilometer:
db: {get_input: ceilometer_dsn}
metering_secret: {get_input: ceilometer_metering_secret}
service-password: {get_input: ceilometer_password}
compute_agent: {get_input: ceilometer_compute_agent}
glance:
host: {get_input: glance_host}
hosts: {get_input: static_hosts}
keystone:
host: {get_input: keystone_host}
neutron:
flat-networks: {get_input: neutron_flat_networks}
host: {get_input: neutron_host}
ovs_db: {get_input: neutron_dsn}
ovs:
local_ip: {get_input: neutron_local_ip}
tenant_network_type: {get_input: neutron_tenant_network_type}
network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
bridge_mappings: {get_input: neutron_bridge_mappings}
enable_tunneling: {get_input: neutron_enable_tunneling}
physical_bridge: {get_input: neutron_physical_bridge}
public_interface: {get_input: neutron_public_interface}
service-password: {get_input: neutron_password}
admin-password: {get_input: admin_password}
rabbit:
host: {get_input: rabbit_host}
username: {get_input: rabbit_user_name}
password: {get_input: rabbit_password}
live-update:
host: {get_input: live_update_host}
username: {get_input: live_update_username}
password: {get_input: live_update_password}
tenant-name: {get_input: live_update_tenant_name}
base_image_id: {get_input: nova_image}
live_update_image_id: {get_input: live_update_compute_image}
completion-signal: {get_input: deploy_signal_id}

View File

@ -114,28 +114,6 @@ Parameters:
Description: The image ID for live-updates to the overcloud compute nodes. Description: The image ID for live-updates to the overcloud compute nodes.
Default: '' Default: ''
Resources: Resources:
ComputeAccessPolicy:
Type: OS::Heat::AccessPolicy
Properties:
AllowedResources: [ NovaCompute0 ]
ComputeUser:
Type: AWS::IAM::User
Properties:
Policies: [ { Ref: ComputeAccessPolicy } ]
NovaCompute0Key:
Type: AWS::IAM::AccessKey
Properties:
UserName:
Ref: ComputeUser
NovaCompute0CompletionCondition:
Type: AWS::CloudFormation::WaitCondition
DependsOn: controller0Config
Properties:
Handle: {Ref: NovaCompute0CompletionHandle}
Count: '1'
Timeout: '1800'
NovaCompute0CompletionHandle:
Type: AWS::CloudFormation::WaitConditionHandle
NovaCompute0: NovaCompute0:
Type: OS::Nova::Server Type: OS::Nova::Server
Properties: Properties:
@ -145,79 +123,43 @@ Resources:
Ref: ImageUpdatePolicy Ref: ImageUpdatePolicy
flavor: {Ref: OvercloudComputeFlavor} flavor: {Ref: OvercloudComputeFlavor}
key_name: {Ref: KeyName} key_name: {Ref: KeyName}
Metadata: user_data_format: SOFTWARE_CONFIG
os-collect-config: NovaCompute0Deploy:
cfn: Type: OS::Heat::StructuredDeployment
access_key_id:
Ref: NovaCompute0Key
secret_access_key:
Fn::GetAtt: [ NovaCompute0Key, SecretAccessKey ]
stack_name: {Ref: 'AWS::StackName'}
path: NovaCompute0Config.Metadata
OpenStack::ImageBuilder::Elements: [ nova-compute ]
NovaCompute0Config:
Type: AWS::AutoScaling::LaunchConfiguration
Properties: Properties:
InstanceType: '0' config: {Ref: NovaComputeConfig}
ImageId: '0' server: {Ref: NovaCompute0}
Metadata: input_values:
completion-handle: nova_compute_driver: {Ref: NovaComputeDriver}
Ref: NovaCompute0CompletionHandle nova_compute_libvirt_type: {Ref: NovaComputeLibvirtType}
os-collect-config: nova_dsn: {Ref: NovaDSN}
cfn: nova_api_host: {Ref: NovaApiHost}
access_key_id: nova_password: {Ref: NovaPassword}
Ref: NovaCompute0Key ceilometer_dsn: {Ref: CeilometerDSN}
secret_access_key: ceilometer_metering_secret: {Ref: CeilometerMeteringSecret}
Fn::GetAtt: [ NovaCompute0Key, SecretAccessKey ] ceilometer_password: {Ref: CeilometerPassword}
stack_name: {Ref: 'AWS::StackName'} ceilometer_compute_agent: {Ref: CeilometerComputeAgent}
path: NovaCompute0Config.Metadata glance_host: {Ref: GlanceHost}
nova: static_hosts: {Ref: StaticHosts}
compute_driver: {Ref: NovaComputeDriver} keystone_host: {Ref: KeystoneHost}
compute_libvirt_type: {Ref: NovaComputeLibvirtType} neutron_flat_networks: {Ref: NeutronFlatNetworks}
db: {Ref: NovaDSN} neutron_host: {Ref: NeutronHost}
host: {Ref: NovaApiHost} neutron_dsn: {Ref: NeutronDSN}
service-password: neutron_local_ip: {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ NovaCompute0, networks ]}]]}
Ref: NovaPassword neutron_tenant_network_type: {Ref: NeutronNetworkType}
ceilometer: neutron_network_vlan_ranges: {Ref: NeutronNetworkVLANRanges}
db: {Ref: CeilometerDSN} neutron_bridge_mappings: {Ref: NeutronBridgeMappings}
metering_secret: {Ref: CeilometerMeteringSecret} neutron_enable_tunneling: {Ref: NeutronEnableTunnelling}
service-password: {Ref: CeilometerPassword} neutron_physical_bridge: {Ref: NeutronPhysicalBridge}
compute_agent: {Ref: CeilometerComputeAgent} neutron_public_interface: {Ref: NeutronPublicInterface}
glance: neutron_password: {Ref: NeutronPassword}
host: {Ref: GlanceHost} admin_password: {Ref: AdminPassword}
hosts: {Ref: StaticHosts} rabbit_host: {Ref: RabbitHost}
keystone: rabbit_username: {Ref: RabbitUserName}
host: {Ref: KeystoneHost} rabbit_password: {Ref: RabbitPassword}
neutron: live_update_host: {Ref: LiveUpdateHost}
flat-networks: {Ref: NeutronFlatNetworks} live_update_username: {Ref: LiveUpdateUserName}
host: {Ref: NeutronHost} live_update_password: {Ref: LiveUpdatePassword}
ovs_db: {Ref: NeutronDSN} live_update_tenant_name: {Ref: LiveUpdateTenantName}
ovs: nova_image: {Ref: NovaImage}
local_ip:
Fn::Select:
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- NovaCompute0
- networks
tenant_network_type: {Ref: NeutronNetworkType}
network_vlan_ranges: {Ref: NeutronNetworkVLANRanges}
bridge_mappings: {Ref: NeutronBridgeMappings}
enable_tunneling: {Ref: NeutronEnableTunnelling}
physical_bridge: {Ref: NeutronPhysicalBridge}
public_interface: {Ref: NeutronPublicInterface}
service-password:
Ref: NeutronPassword
admin-password: {Ref: AdminPassword}
rabbit:
host: {Ref: RabbitHost}
username: {Ref: RabbitUserName}
password: {Ref: RabbitPassword}
live-update:
host: {Ref: LiveUpdateHost}
username: {Ref: LiveUpdateUserName}
password: {Ref: LiveUpdatePassword}
tenant-name: {Ref: LiveUpdateTenantName}
base_image_id: {Ref: NovaImage}
live_update_image_id: {Ref: LiveUpdateComputeImage} live_update_image_id: {Ref: LiveUpdateComputeImage}

View File

@ -181,53 +181,10 @@ Resources:
length: 20 length: 20
salt: salt:
Ref: RabbitCookieSalt Ref: RabbitCookieSalt
AccessPolicy:
Properties:
AllowedResources:
- controller0
- controller0Config
Type: OS::Heat::AccessPolicy
ComputeAccessPolicy:
Properties:
AllowedResources:
- NovaCompute0
- NovaCompute0Config
Type: OS::Heat::AccessPolicy
controller0Key:
Properties:
UserName:
Ref: User
Type: AWS::IAM::AccessKey
controller0CompletionCondition:
Type: AWS::CloudFormation::WaitCondition
DependsOn: controller0Config
Properties:
Handle: {Ref: controller0CompletionHandle}
Count: '1'
Timeout: '1800'
controller0CompletionHandle:
Type: OS::Heat::UpdateWaitConditionHandle
NovaCompute0Key:
Type: FileInclude
Path: nova-compute-instance.yaml
SubKey: Resources.NovaCompute0Key
NovaCompute0CompletionCondition:
Type: FileInclude
Path: nova-compute-instance.yaml
SubKey: Resources.NovaCompute0CompletionCondition
NovaCompute0CompletionHandle:
Type: FileInclude
Path: nova-compute-instance.yaml
SubKey: Resources.NovaCompute0CompletionHandle
ComputeUser:
Properties:
Policies:
- Ref: ComputeAccessPolicy
Type: AWS::IAM::User
NovaCompute0Config: NovaCompute0Config:
Type: FileInclude Type: FileInclude
Path: nova-compute-instance.yaml Path: nova-compute-instance.yaml
SubKey: Resources.NovaCompute0Config SubKey: Resources.NovaCompute0Deploy
Parameters: Parameters:
NovaApiHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } NovaApiHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
KeystoneHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } KeystoneHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
@ -293,23 +250,11 @@ Resources:
Type: FileInclude Type: FileInclude
Path: nova-compute-instance.yaml Path: nova-compute-instance.yaml
SubKey: Resources.NovaCompute0 SubKey: Resources.NovaCompute0
User: controllerConfig:
Type: OS::Heat::StructuredConfig
Properties: Properties:
Policies: config:
- Ref: AccessPolicy completion-signal: {get_input: deploy_signal_id}
Type: AWS::IAM::User
controller0Config:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
ImageId: '0'
InstanceType: '0'
Metadata:
OpenStack::Heat::Stack: {}
OpenStack::ImageBuilder::Elements:
- boot-stack
- heat-cfntools
- heat-localip
- neutron-network-node
admin-password: admin-password:
Ref: AdminPassword Ref: AdminPassword
admin-token: admin-token:
@ -324,28 +269,14 @@ Resources:
Ref: CinderPassword Ref: CinderPassword
iscsi-helper: iscsi-helper:
Ref: CinderISCSIHelper Ref: CinderISCSIHelper
completion-handle:
Ref: controller0CompletionHandle
controller-address: controller-address:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
db-password: unset db-password: unset
glance: glance:
backend: swift backend: swift
db: mysql://glance:unset@localhost/glance db: mysql://glance:unset@localhost/glance
host: host:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
service-password: service-password:
Ref: GlancePassword Ref: GlancePassword
swift-store-user: service:glance swift-store-user: service:glance
@ -363,86 +294,25 @@ Resources:
auth_encryption_key: unset___________ auth_encryption_key: unset___________
db: mysql://heat:unset@localhost/heat db: mysql://heat:unset@localhost/heat
stack_domain_admin_password: {Ref: HeatStackDomainAdminPassword} stack_domain_admin_password: {Ref: HeatStackDomainAdminPassword}
watch_server_url: watch_server_url: {get_input: heat.watch_server_url}
Fn::Join: metadata_server_url: {get_input: heat.metadata_server_url}
- '' waitcondition_server_url: {get_input: heat.waitcondition_server_url}
- - 'http://' hosts: {get_input: hosts}
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
- ':8003'
metadata_server_url:
Fn::Join:
- ''
- - 'http://'
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
- ':8000'
waitcondition_server_url:
Fn::Join:
- ''
- - 'http://'
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
- ':8000/v1/waitcondition'
hosts:
Fn::Join:
- ' '
- - Fn::Select:
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- controller0
- networks
- {Ref: CloudName}
keystone: keystone:
db: mysql://keystone:unset@localhost/keystone db: mysql://keystone:unset@localhost/keystone
host: host:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
mysql: mysql:
innodb_buffer_pool_size: {Ref: MysqlInnodbBufferPoolSize} innodb_buffer_pool_size: {Ref: MysqlInnodbBufferPoolSize}
neutron: neutron:
flat-networks: {Ref: NeutronFlatNetworks} flat-networks: {Ref: NeutronFlatNetworks}
host: host:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- controller0
- networks
metadata_proxy_shared_secret: unset metadata_proxy_shared_secret: unset
ovs: ovs:
enable_tunneling: 'True' enable_tunneling: 'True'
local_ip: local_ip:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- controller0
- networks
bridge_mappings: {Ref: NeutronBridgeMappings} bridge_mappings: {Ref: NeutronBridgeMappings}
public_interface: public_interface:
Ref: NeutronPublicInterface Ref: NeutronPublicInterface
@ -466,36 +336,13 @@ Resources:
default_floating_pool: default_floating_pool:
ext-net ext-net
host: host:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
metadata-proxy: true metadata-proxy: true
service-password: service-password:
Ref: NovaPassword Ref: NovaPassword
os-collect-config:
cfn:
access_key_id:
Ref: controller0Key
path: controller0Config.Metadata
secret_access_key:
Fn::GetAtt:
- controller0Key
- SecretAccessKey
stack_name:
Ref: AWS::StackName
rabbit: rabbit:
host: host:
Fn::Select: get_input: controller_host
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- controller0
- networks
username: username:
Ref: RabbitUserName Ref: RabbitUserName
password: password:
@ -518,18 +365,53 @@ Resources:
Ref: OvercloudControlFlavor Ref: OvercloudControlFlavor
key_name: key_name:
Ref: KeyName Ref: KeyName
Metadata: user_data_format: SOFTWARE_CONFIG
os-collect-config: controller0Deployment:
cfn: Type: OS::Heat::StructuredDeployment
access_key_id: Properties:
Ref: controller0Key config: {Ref: controllerConfig}
path: controller0Config.Metadata server: {Ref: controller0}
secret_access_key: input_values:
Fn::GetAtt: controller_host:
- controller0Key Fn::Select:
- SecretAccessKey - 0
stack_name: - Fn::Select:
Ref: AWS::StackName - ctlplane
- Fn::GetAtt:
- controller0
- networks
heat.watch_server_url:
Fn::Join:
- ''
- - 'http://'
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
- ':8003'
heat.metadata_server_url:
Fn::Join:
- ''
- - 'http://'
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
- ':8000'
heat.waitcondition_server_url:
Fn::Join:
- ''
- - 'http://'
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
- ':8000/v1/waitcondition'
hosts:
Fn::Join:
- ' '
- - {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
- {Ref: CloudName}
controller0SSLDeployment:
Type: OS::Heat::StructuredDeployment
Properties:
config: {Ref: SSLConfig}
server: {Ref: controller0}
signal_transport: NO_SIGNAL
input_values:
ssl_certificate: {Ref: SSLCertificate}
ssl_key: {Ref: SSLKey}
Outputs: Outputs:
KeystoneURL: KeystoneURL:
Description: URL for the Overcloud Keystone service Description: URL for the Overcloud Keystone service

View File

@ -11,14 +11,15 @@ Parameters:
Type: String Type: String
NoEcho: true NoEcho: true
Resources: Resources:
controller0Config: SSLConfig:
Type: AWS::AutoScaling::LaunchConfiguration Type: OS::Heat::StructuredConfig
Metadata: Properties:
config:
stunnel: stunnel:
cert: cert:
Ref: SSLCertificate get_input: ssl_certificate
key: key:
Ref: SSLKey get_input: ssl_key
ports: ports:
- name: 'ec2' - name: 'ec2'
accept: 13773 accept: 13773

45
swift-deploy.yaml Normal file
View File

@ -0,0 +1,45 @@
Description: 'Swift-proxy: OpenStack object storage proxy'
Parameters:
SwiftHashSuffix:
Default: unset
Description: A random string to be used as a salt when hashing to determine mappings in the ring.
Type: String
NoEcho: true
SwiftPassword:
Default: unset
Description: The password for the swift service account, used by the swift proxy services.
Type: String
NoEcho: true
Resources:
controller0Swift:
Type: OS::Heat::StructuredDeployment
Properties:
config: {Ref: SwiftConfig}
server: {Ref: controller0}
signal_transport: NO_SIGNAL
input_values:
swift_hash_suffix: {Ref: SwiftHashSuffix}
swift_password: {Ref: SwiftPassword}
swift_devices:
Fn::Join:
- ', '
- - Fn::Join:
- ''
- - 'r1z1-'
- {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
- ':%PORT%/d1'
- Fn::Join:
- ', '
- Merge::Map:
SwiftStorage0:
Fn::Join:
- ''
- - 'r1z1-'
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- SwiftStorage0
- networks
- ':%PORT%/d1'

View File

@ -1,52 +1,16 @@
Description: 'Swift-common: OpenStack object storage common configurations'
Parameters:
SwiftHashSuffix:
Default: unset
Description: A random string to be used as a salt when hashing to determine mappings in the ring.
Type: String
NoEcho: true
SwiftPassword:
Default: unset
Description: The password for the swift service account, used by the swift proxy services.
Type: String
NoEcho: true
Resources: Resources:
controller0Config: SwiftConfig:
Type: AWS::AutoScaling::LaunchConfiguration Type: OS::Heat::StructuredConfig
Metadata: Properties:
config:
swift: swift:
devices: devices: { get_input: swift_devices }
Fn::Join: hash: { get_input: swift_hash_suffix }
- ', '
- - Fn::Join:
- ''
- - 'r1z1-'
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
- ':%PORT%/d1'
- Fn::Join:
- ', '
- Merge::Map:
SwiftStorage0:
Fn::Join:
- ''
- - 'r1z1-'
- Fn::Select:
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- SwiftStorage0
- networks
- ':%PORT%/d1'
hash:
Ref: SwiftHashSuffix
part-power: 10 part-power: 10
replicas: 1 replicas: 1
service-password: service-password: { get_input: swift_password }
Ref: SwiftPassword neutron:
enable_tunnelling: {Ref: NeutronEnableTunnelling}
tenant_network_type: {Ref: NeutronNetworkType}
ovs:
local_ip: { get_input: neutron_local_ip }

View File

@ -15,30 +15,6 @@ Parameters:
Type: String Type: String
Default: True Default: True
Resources: Resources:
SwiftStorageAccessPolicy:
Type: OS::Heat::AccessPolicy
Properties:
AllowedResources:
- SwiftStorage0
- SwiftStorage0Config
SwiftStorageUser:
Type: AWS::IAM::User
Properties:
Policies: [ { Ref: SwiftStorageAccessPolicy } ]
SwiftStorage0Key:
Type: AWS::IAM::AccessKey
Properties:
UserName:
Ref: SwiftStorageUser
SwiftStorage0CompletionCondition:
Type: AWS::CloudFormation::WaitCondition
DependsOn: controller0Config
Properties:
Handle: {Ref: SwiftStorage0CompletionHandle}
Count: '1'
Timeout: '1800'
SwiftStorage0CompletionHandle:
Type: AWS::CloudFormation::WaitConditionHandle
SwiftStorage0: SwiftStorage0:
Type: OS::Nova::Server Type: OS::Nova::Server
Properties: Properties:
@ -46,65 +22,24 @@ Resources:
{Ref: SwiftStorageImage} {Ref: SwiftStorageImage}
flavor: {Ref: OvercloudSwiftStorageFlavor} flavor: {Ref: OvercloudSwiftStorageFlavor}
key_name: {Ref: KeyName} key_name: {Ref: KeyName}
Metadata: SwiftStorage0Deploy:
os-collect-config: Type: OS::Heat::StructuredDeployment
cfn:
access_key_id:
Ref: SwiftStorage0Key
secret_access_key:
Fn::GetAtt: [ SwiftStorage0Key, SecretAccessKey ]
stack_name: {Ref: 'AWS::StackName'}
path: SwiftStorage0Config.Metadata
OpenStack::ImageBuilder::Elements: [ swift ]
SwiftStorage0Config:
Type: AWS::AutoScaling::LaunchConfiguration
Properties: Properties:
InstanceType: '0' server: {Ref: SwiftStorage0}
ImageId: '0' config: {Ref: SwiftConfig}
Metadata: input_values:
completion-handle: neutron_local_ip: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [SwiftStorage0, networks]} ]} ] }
Ref: SwiftStorage0CompletionHandle swift_devices:
os-collect-config:
cfn:
access_key_id:
Ref: SwiftStorage0Key
secret_access_key:
Fn::GetAtt: [ SwiftStorage0Key, SecretAccessKey ]
stack_name: {Ref: 'AWS::StackName'}
path: SwiftStorage0Config.Metadata
admin-password: {Ref: AdminPassword}
neutron:
ovs:
local_ip:
Fn::Select:
- 0
- Fn::Select:
- ctlplane
- Fn::GetAtt:
- SwiftStorage0
- networks
tenant_network_type: {Ref: NeutronNetworkType}
enable_tunneling: {Ref: NeutronEnableTunnelling}
service-password:
Ref: NeutronPassword
swift:
devices:
Fn::Join: Fn::Join:
- ', ' - ', '
- - Fn::Join: - - Fn::Join:
- '' - ''
- - 'r1z1-' - - 'r1z1-'
- Fn::Select: - {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
- 0
- Fn::Select:
- 'ctlplane'
- Fn::GetAtt:
- controller0
- networks
- ':%PORT%/d1' - ':%PORT%/d1'
- Fn::Join: - Fn::Join:
- ', ' - ', '
- Merge::Map: Merge::Map:
SwiftStorage0: SwiftStorage0:
Fn::Join: Fn::Join:
- '' - ''
@ -117,9 +52,3 @@ Resources:
- SwiftStorage0 - SwiftStorage0
- networks - networks
- ':%PORT%/d1' - ':%PORT%/d1'
hash:
Ref: SwiftHashSuffix
part-power: 10
replicas: 1
service-password:
Ref: SwiftPassword

View File

@ -292,6 +292,10 @@ def merge(templates, master_role=None, slave_roles=None,
errors.append('Role %s metadata key %s conflicts.' % errors.append('Role %s metadata key %s conflicts.' %
(role, m)) (role, m))
continue continue
role_res = end_template['Resources'][role]
if role_res['Type'] == 'OS::Heat::StructuredConfig':
end_template['Resources'][role]['Properties']['config'][m] = mbody
else:
end_template['Resources'][role]['Metadata'][m] = mbody end_template['Resources'][role]['Metadata'][m] = mbody
continue continue
if 'Resources' not in end_template: if 'Resources' not in end_template:
@ -315,6 +319,8 @@ def merge(templates, master_role=None, slave_roles=None,
include_content = resolve_params(include_content, include_content = resolve_params(include_content,
replace_param, replace_param,
replace_value) replace_value)
if 'Resources' not in end_template:
end_template['Resources'] = {}
end_template['Resources'][r] = include_content end_template['Resources'][r] = include_content
else: else:
if r in end_template.get('Resources', {}): if r in end_template.get('Resources', {}):