Load local IP using separate post-boot Metadata.
authorClint Byrum <clint@fewbar.com>
Wed, 31 Jul 2013 21:13:36 +0000 (14:13 -0700)
committerClint Byrum <clint@fewbar.com>
Thu, 15 Aug 2013 03:27:58 +0000 (20:27 -0700)
Previously we could not feed the IP of an instance into its own
Metadata because of circular dependency problems. 0.0.0.0 was used
with the heat-localip element to work around this problem. This
caused problems though, as heat-localip would edit the source local
heat metadata, which would make cfn-hup and/or os-collect-config think
that the Metadata had changed, causing it to restart everything every
time we query the Metadata, which was about every five minutes.

Now we can just query this inert LaunchConfiguration resource to get
its' Metadata once it is ready. This resource will only change when
legitimate things are changed in the stack, and so we won't restart
everything every five minutes anymore. Note that when the native Heat
DSL lands, the OS::Heat::SoftwareConfig resource is meant for exactly
this purpose.

After this is merged we no longer need the heat-localip element.

Fixes bug #1202322

Change-Id: Id06323ba43203570eeebfa5b3d03fa56c16c0c10

overcloud-source.yaml
undercloud-vm.yaml

index 88e21f0..cb385ed 100644 (file)
@@ -34,6 +34,7 @@ Resources:
     Properties:
       AllowedResources:
       - notcompute
+      - notcomputeConfig
     Type: OS::Heat::AccessPolicy
   ComputeAccessPolicy:
     Properties:
@@ -78,7 +79,11 @@ Resources:
       Policies:
       - Ref: AccessPolicy
     Type: AWS::IAM::User
-  notcompute:
+  notcomputeConfig:
+    Type: AWS::AutoScaling::LaunchConfiguration
+    Properties:
+      ImageId: '0'
+      InstanceType: '0'
     Metadata:
       OpenStack::Heat::Stack: {}
       Openstack::ImageBuilder::Elements:
@@ -91,16 +96,22 @@ Resources:
       cinder:
         db: mysql://cinder:unset@localhost/cinder
         volume_size_mb: '5000'
-      controller-address: 0.0.0.0
+      controller-address:
+        Fn::GetAtt:
+          - notcompute
+          - PrivateIp
       db-password: unset
       glance:
         db: mysql://glance:unset@localhost/glance
-        host: 0.0.0.0
+        host:
+          Fn::GetAtt:
+            - notcompute
+            - PrivateIp
       os-collect-config:
         cfn:
           access_key_id:
             Ref: Key
-          path: notcompute.Metadata
+          path: notcomputeConfig.Metadata
           secret_access_key:
             Fn::GetAtt:
             - Key
@@ -113,33 +124,71 @@ Resources:
         admin_user: heat
         auth_encryption_key: unset___________
         db: mysql://heat:unset@localhost/heat
-        heat_watch_server_url: http://0.0.0.0:8003
-        metadata_server_url: http://0.0.0.0:8000
-        waitcondition_server_url: http://0.0.0.0:8000/v1/waitcondition
+        heat_watch_server_url:
+          Fn::Join:
+            - ''
+            - - 'http://'
+              - Fn::GetAtt:
+                  - notcompute
+                  - PrivateIp
+              - ':8003'
+        metadata_server_url:
+          Fn::Join:
+            - ''
+            - - 'http://'
+              - Fn::GetAtt:
+                  - notcompute
+                  - PrivateIp
+              - ':8000'
+        waitcondition_server_url:
+          Fn::Join:
+            - ''
+            - - 'http://'
+              - Fn::GetAtt:
+                  - notcompute
+                  - PrivateIp
+              - ':8000/v1/waitcondition'
       interfaces:
         control: eth0
       keystone:
         db: mysql://keystone:unset@localhost/keystone
-        host: 0.0.0.0
+        host:
+          Fn::GetAtt:
+            - notcompute
+            - PrivateIp
       nova:
         compute_driver: libvirt.LibvirtDriver
         db: mysql://nova:unset@localhost/nova
-        host: 0.0.0.0
+        host:
+          Fn::GetAtt:
+            - notcompute
+            - PrivateIp
         metadata-proxy: true
       neutron:
-        host: 0.0.0.0
+        host:
+          Fn::GetAtt:
+            - notcompute
+            - PrivateIp
         metadata_proxy_shared_secret: unset
         ovs:
           enable_tunneling: 'True'
-          local_ip: 0.0.0.0
+          local_ip:
+            Fn::GetAtt:
+              - notcompute
+              - PrivateIp
           public_interface: eth0
           physical_bridge: br-ex
           tenant_network_type: gre
         ovs_db: mysql://neutron:unset@localhost/ovs_neutron?charset=utf8
       rabbit:
-        host: 0.0.0.0
+        host:
+          Fn::GetAtt:
+            - notcompute
+            - PrivateIp
         password: guest
       service-password: unset
+  notcompute:
+    Type: AWS::EC2::Instance
     Properties:
       ImageId:
         Ref: notcomputeImage
@@ -147,4 +196,15 @@ Resources:
         Ref: InstanceType
       KeyName:
         Ref: KeyName
-    Type: AWS::EC2::Instance
+    Metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            Ref: Key
+          path: notcomputeConfig.Metadata
+          secret_access_key:
+            Fn::GetAtt:
+            - Key
+            - SecretAccessKey
+          stack_name:
+            Ref: AWS::StackName
index b68c0e5..5fbe51f 100644 (file)
@@ -20,7 +20,7 @@ Resources:
   AccessPolicy:
     Properties:
       AllowedResources:
-      - notcompute
+      - notcomputeConfig
     Type: OS::Heat::AccessPolicy
   Key:
     Properties:
@@ -32,13 +32,20 @@ Resources:
       Policies:
       - Ref: AccessPolicy
     Type: AWS::IAM::User
-  notcompute:
+  notcomputeConfig:
+    Type: AWS::AutoScaling::LaunchConfiguration
+    Properties:
+      ImageId: '0'
+      InstanceType: foo
     Metadata:
       OpenStack::Heat::Stack: {}
       Openstack::ImageBuilder::Elements: [ boot-stack, heat-cfntools, neutron-network-node ]
       admin-password: unset
       admin-token: unset
-      controller-address: 0.0.0.0
+      controller-address:
+        Fn::GetAtt:
+          - notcompute
+          - PrivateIp
       cinder:
         db: mysql://cinder:unset@localhost/cinder
         volume_size_mb: '5000'
@@ -52,14 +59,29 @@ Resources:
         admin_user: heat
         auth_encryption_key: unset___________
         db: mysql://heat:unset@localhost/heat
-        heat_watch_server_url: http://0.0.0.0:8003
-        metadata_server_url: http://0.0.0.0:8000
-        waitcondition_server_url: http://0.0.0.0:8000/v1/waitcondition
+        heat_watch_server_url:
+          Fn::Join:
+            - ''
+            - - http://
+              - {"Fn::GetAtt": [ notcompute, PrivateIp ]}
+              - ":8003"
+        metadata_server_url:
+          Fn::Join:
+            - ''
+            - - http://
+              - {"Fn::GetAtt": [ notcompute, PrivateIp ]}
+              - ":8000"
+        waitcondition_server_url:
+          Fn::Join:
+            - ''
+            - - http://
+              - {"Fn::GetAtt": [ notcompute, PrivateIp ]}
+              - ":8000/v1/waitcondition"
       os-collect-config:
         cfn:
           access_key_id:
             Ref: Key
-          path: Resources.notcompute
+          path: notcomputeConfig.Metadata
           secret_access_key:
             Fn::GetAtt:
             - Key
@@ -110,6 +132,8 @@ Resources:
         store_user: unset
         store_key: unset
       service-password: unset
+  notcompute:
+    Type: AWS::EC2::Instance
     Properties:
       ImageId:
         Ref: Image
@@ -118,3 +142,15 @@ Resources:
       KeyName:
         Ref: KeyName
     Type: AWS::EC2::Instance
+    Metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            Ref: Key
+          path: notcomputeConfig.Metadata
+          secret_access_key:
+            Fn::GetAtt:
+            - Key
+            - SecretAccessKey
+          stack_name:
+            Ref: AWS::StackName