summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Baker <sbaker@redhat.com>2015-12-15 08:55:00 +1300
committerSteve Baker <sbaker@redhat.com>2016-03-07 13:01:40 +1300
commit55f6324cf79aca151d76f9baa0fbb37cfb1c72fb (patch)
treec5470d8379ce5cb2ad9f6df7fca4c584bf4a05b6
parent53356991337f0ee0d86f1f051883c26dfa40f55c (diff)
downloadheat-55f6324cf79aca151d76f9baa0fbb37cfb1c72fb.tar.gz
Build list of enabled os-collect-config collectors
When changing the software_config_transport for an existing server, os-collect-config will continue using the data from the old transport which will become increasingly stale and will sometimes mask values from the new transport. The default list of collectors in os-collect-config is: heat_local, ec2, cfn, heat, request, local, zaqar This change explicitly enables these collectors: ec2, <current transport>, local ``ec2`` is the nova metadata service, so should always be enabled. ``local`` allows local file overrides - this is generally unused but is enabled for users who choose to use it for additional config data, or to override the heat provided data. ``heat_local`` is only used on the first run of an unconfigured os-collect-config for bootstrapping its own config file, so it can and should be disabled for subsequent polling. Change-Id: I9cdb057212c7a4404f6966a55cde9eab5ad86759 Closes-Bug: #1523676 (cherry picked from commit 5d1762fec6a7d3f2eaa5f7e4e7ac048e77843cb0)
-rw-r--r--heat/engine/resources/openstack/nova/server.py30
-rw-r--r--heat/tests/nova/test_server.py24
2 files changed, 42 insertions, 12 deletions
diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py
index 0b263b73d..6aa9c24f4 100644
--- a/heat/engine/resources/openstack/nova/server.py
+++ b/heat/engine/resources/openstack/nova/server.py
@@ -555,6 +555,9 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
meta['deployments'] = meta.get('deployments', [])
meta['os-collect-config'] = meta.get('os-collect-config', {})
occ = meta['os-collect-config']
+ collectors = ['ec2']
+ occ['collectors'] = collectors
+
# set existing values to None to override any boot-time config
occ_keys = ('heat', 'zaqar', 'cfn', 'request')
for occ_key in occ_keys:
@@ -572,21 +575,18 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
'project_id': self.stack.stack_user_project_id,
'stack_id': self.stack.identifier().stack_path(),
'resource_name': self.name}})
+ collectors.append('heat')
elif self.transport_zaqar_message(props):
queue_id = self.physical_resource_name()
self.data_set('metadata_queue_id', queue_id)
- zaqar_plugin = self.client_plugin('zaqar')
- zaqar = zaqar_plugin.create_for_tenant(
- self.stack.stack_user_project_id)
- queue = zaqar.queue(queue_id)
- queue.post({'body': meta, 'ttl': zaqar_plugin.DEFAULT_TTL})
occ.update({'zaqar': {
'user_id': self._get_user_id(),
'password': self.password,
'auth_url': self.context.auth_url,
'project_id': self.stack.stack_user_project_id,
'queue_id': queue_id}})
+ collectors.append('zaqar')
elif self.transport_poll_server_cfn(props):
occ.update({'cfn': {
@@ -595,6 +595,7 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
'secret_access_key': self.secret_key,
'stack_name': self.stack.name,
'path': '%s.Metadata' % self.name}})
+ collectors.append('cfn')
elif self.transport_poll_temp_url(props):
container = self.physical_resource_name()
@@ -611,13 +612,28 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
self.data_set('metadata_put_url', put_url)
self.data_set('metadata_object_name', object_name)
+ collectors.append('request')
occ.update({'request': {
'metadata_url': url}})
- self.client('swift').put_object(
- container, object_name, jsonutils.dumps(meta))
+ collectors.append('local')
self.metadata_set(meta)
+ # push replacement polling config to any existing push-based sources
+ queue_id = self.data().get('metadata_queue_id')
+ if queue_id:
+ zaqar_plugin = self.client_plugin('zaqar')
+ zaqar = zaqar_plugin.create_for_tenant(
+ self.stack.stack_user_project_id, self._user_token())
+ queue = zaqar.queue(queue_id)
+ queue.post({'body': meta, 'ttl': zaqar_plugin.DEFAULT_TTL})
+
+ object_name = self.data().get('metadata_object_name')
+ if object_name:
+ container = self.physical_resource_name()
+ self.client('swift').put_object(
+ container, object_name, jsonutils.dumps(meta))
+
def _register_access_key(self):
'''
Access is limited to this resource, which created the keypair
diff --git a/heat/tests/nova/test_server.py b/heat/tests/nova/test_server.py
index 251b74185..eb7caed5a 100644
--- a/heat/tests/nova/test_server.py
+++ b/heat/tests/nova/test_server.py
@@ -747,7 +747,8 @@ class ServersTest(common.HeatTestCase):
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'software_config_s'
- }
+ },
+ 'collectors': ['ec2', 'cfn', 'local']
},
'deployments': []
}, server.metadata_get())
@@ -765,6 +766,7 @@ class ServersTest(common.HeatTestCase):
'secret_access_key': '8901',
'stack_name': 'software_config_s'
},
+ 'collectors': ['ec2', 'cfn', 'local'],
'polling_interval': 10
},
'deployments': []
@@ -826,7 +828,8 @@ class ServersTest(common.HeatTestCase):
'resource_name': 'WebServer',
'stack_id': 'software_config_s/%s' % stack.id,
'user_id': '1234'
- }
+ },
+ 'collectors': ['ec2', 'heat', 'local']
},
'deployments': []
}, server.metadata_get())
@@ -845,6 +848,7 @@ class ServersTest(common.HeatTestCase):
'stack_id': 'software_config_s/%s' % stack.id,
'user_id': '1234'
},
+ 'collectors': ['ec2', 'heat', 'local'],
'polling_interval': 10
},
'deployments': []
@@ -906,6 +910,8 @@ class ServersTest(common.HeatTestCase):
server.physical_resource_name(), object_name)
self.assertEqual(test_path, urlparse.urlparse(metadata_put_url).path)
self.assertEqual(test_path, urlparse.urlparse(metadata_url).path)
+ sc.put_object.assert_called_once_with(
+ container_name, object_name, jsonutils.dumps(md))
sc.head_container.return_value = {'x-container-object-count': '0'}
server._delete_temp_url()
@@ -924,7 +930,8 @@ class ServersTest(common.HeatTestCase):
'os-collect-config': {
'request': {
'metadata_url': metadata_url
- }
+ },
+ 'collectors': ['ec2', 'request', 'local']
},
'deployments': []
}, server.metadata_get())
@@ -939,6 +946,7 @@ class ServersTest(common.HeatTestCase):
'request': {
'metadata_url': metadata_url
},
+ 'collectors': ['ec2', 'request', 'local'],
'polling_interval': 10
},
'deployments': []
@@ -1014,7 +1022,8 @@ class ServersTest(common.HeatTestCase):
'auth_url': 'http://server.test:5000/v2.0',
'project_id': '8888',
'queue_id': queue_id
- }
+ },
+ 'collectors': ['ec2', 'zaqar', 'local']
},
'deployments': []
}, server.metadata_get())
@@ -1031,6 +1040,7 @@ class ServersTest(common.HeatTestCase):
'project_id': '8888',
'queue_id': queue_id
},
+ 'collectors': ['ec2', 'zaqar', 'local'],
'polling_interval': 10
},
'deployments': []
@@ -1602,7 +1612,8 @@ class ServersTest(common.HeatTestCase):
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
- }
+ },
+ 'collectors': ['ec2', 'cfn', 'local']
},
'deployments': []}
self.assertEqual(expected_md, server.metadata_get())
@@ -1636,6 +1647,7 @@ class ServersTest(common.HeatTestCase):
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
},
+ 'collectors': ['ec2', 'cfn', 'local'],
'polling_interval': 10
},
'deployments': []}
@@ -1669,6 +1681,7 @@ class ServersTest(common.HeatTestCase):
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
},
+ 'collectors': ['ec2', 'cfn', 'local'],
'polling_interval': 10
},
'deployments': []}
@@ -1711,6 +1724,7 @@ class ServersTest(common.HeatTestCase):
'request': {
'metadata_url': 'the_url',
},
+ 'collectors': ['ec2', 'request', 'local'],
'polling_interval': 10
},
'deployments': []}