cfn-get-metadata: log metadata to standard output

Add display() method to the Metadata class that prints the metadata to
standard output if the metdata has been successfully retrieved (either
from local cache or from the remote server).

Change-Id: Idf6c1aecf2a5204d7cf7fbf3c8d826f750a72785
Fixes: bug #1183298
This commit is contained in:
Simon Pasquier 2013-05-24 17:10:04 +02:00
parent 16452ffedf
commit 2d00ede1e6
3 changed files with 49 additions and 17 deletions

View File

@ -86,3 +86,4 @@ metadata = Metadata(args.stack_name,
credentials_file=args.credential_file)
metadata.retrieve()
LOG.debug(str(metadata))
metadata.display()

View File

@ -1041,7 +1041,12 @@ class Metadata(object):
meta_str=None,
default_path='/var/lib/heat-cfntools/cfn-init-data',
last_path='/var/cache/heat-cfntools/last_metadata'):
"""Read the metadata from the given filename."""
"""Read the metadata from the given filename or from the remote server.
Returns:
True -- success
False -- error
"""
if meta_str:
self._data = meta_str
else:
@ -1116,9 +1121,16 @@ class Metadata(object):
cf.write(json.dumps(self._metadata))
os.rename(cf.name, last_path)
return True
def __str__(self):
return json.dumps(self._metadata)
def display(self):
if self._metadata is not None:
print str(self)
return
def _is_valid_metadata(self):
"""Should find the AWS::CloudFormation::Init json key."""
is_valid = self._metadata and \

View File

@ -528,17 +528,16 @@ class TestMetadataRetrieve(testtools.TestCase):
default_file.flush()
self.assertThat(default_file.name, ttm.FileContains(md_str))
md.retrieve(
default_path=default_file.name,
last_path=self.last_file)
self.assertTrue(
md.retrieve(default_path=default_file.name,
last_path=self.last_file))
self.assertThat(self.last_file, ttm.FileContains(md_str))
self.assertThat(md_data, ttm.Equals(md._metadata))
md = cfn_helper.Metadata('teststack', None)
md.retrieve(
default_path=default_file.name,
last_path=self.last_file)
self.assertTrue(md.retrieve(default_path=default_file.name,
last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
def test_metadata_retrieve_none(self):
@ -546,11 +545,17 @@ class TestMetadataRetrieve(testtools.TestCase):
md = cfn_helper.Metadata('teststack', None)
default_file = os.path.join(self.tdir.path, 'default_file')
md.retrieve(
default_path=default_file,
last_path=self.last_file)
self.assertFalse(md.retrieve(default_path=default_file,
last_path=self.last_file))
self.assertIsNone(md._metadata)
displayed = self.useFixture(fixtures.StringStream('stdout'))
fake_stdout = displayed.stream
self.useFixture(fixtures.MonkeyPatch('sys.stdout', fake_stdout))
md.display()
fake_stdout.flush()
self.assertEqual(displayed.getDetails()['stdout'].as_text(), "")
def test_metadata_retrieve_passed(self):
md_data = {"AWS::CloudFormation::Init": {"config": {"files": {
@ -558,14 +563,26 @@ class TestMetadataRetrieve(testtools.TestCase):
md_str = json.dumps(md_data)
md = cfn_helper.Metadata('teststack', None)
md.retrieve(meta_str=md_str, last_path=self.last_file)
self.assertTrue(md.retrieve(meta_str=md_str,
last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
md = cfn_helper.Metadata('teststack', None)
md.retrieve(meta_str=md_data, last_path=self.last_file)
self.assertTrue(md.retrieve(meta_str=md_data,
last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
self.assertEqual(md_str, str(md))
displayed = self.useFixture(fixtures.StringStream('stdout'))
fake_stdout = displayed.stream
self.useFixture(fixtures.MonkeyPatch('sys.stdout', fake_stdout))
md.display()
fake_stdout.flush()
self.assertEqual(displayed.getDetails()['stdout'].as_text(),
"{\"AWS::CloudFormation::Init\": {\"config\": {"
"\"files\": {\"/tmp/foo\": {\"content\": \"bar\"}"
"}}}}\n")
def test_metadata_creates_cache(self):
temp_home = tempfile.mkdtemp()
@ -584,7 +601,7 @@ class TestMetadataRetrieve(testtools.TestCase):
self.assertFalse(os.path.exists(last_path),
"last_metadata file already exists")
md.retrieve(meta_str=md_str, last_path=last_path)
self.assertTrue(md.retrieve(meta_str=md_str, last_path=last_path))
self.assertTrue(os.path.exists(last_path),
"last_metadata file should exist")
# Ensure created dirs and file have right perms
@ -597,7 +614,8 @@ class TestMetadataRetrieve(testtools.TestCase):
"/tmp/foo": {"content": "bar"}}}}}
md = cfn_helper.Metadata('teststack', None)
md.retrieve(meta_str=md_data, last_path=self.last_file)
self.assertTrue(
md.retrieve(meta_str=md_data, last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
self.assertTrue(md._is_valid_metadata())
@ -627,7 +645,7 @@ class TestMetadataRetrieve(testtools.TestCase):
None,
access_key='foo',
secret_key='bar')
md.retrieve(last_path=self.last_file)
self.assertTrue(md.retrieve(last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
with tempfile.NamedTemporaryFile(mode='w') as fcreds:
@ -635,7 +653,7 @@ class TestMetadataRetrieve(testtools.TestCase):
fcreds.flush()
md = cfn_helper.Metadata(
'teststack', None, credentials_file=fcreds.name)
md.retrieve(last_path=self.last_file)
self.assertTrue(md.retrieve(last_path=self.last_file))
self.assertThat(md_data, ttm.Equals(md._metadata))
m.VerifyAll()
@ -649,7 +667,8 @@ class TestMetadataRetrieve(testtools.TestCase):
foo_file.name: {"content": "bar"}}}}}
md = cfn_helper.Metadata('teststack', None)
md.retrieve(meta_str=md_data, last_path=self.last_file)
self.assertTrue(
md.retrieve(meta_str=md_data, last_path=self.last_file))
md.cfn_init()
self.assertThat(foo_file.name, ttm.FileContains('bar'))