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:
parent
16452ffedf
commit
2d00ede1e6
|
@ -86,3 +86,4 @@ metadata = Metadata(args.stack_name,
|
||||||
credentials_file=args.credential_file)
|
credentials_file=args.credential_file)
|
||||||
metadata.retrieve()
|
metadata.retrieve()
|
||||||
LOG.debug(str(metadata))
|
LOG.debug(str(metadata))
|
||||||
|
metadata.display()
|
||||||
|
|
|
@ -1041,7 +1041,12 @@ class Metadata(object):
|
||||||
meta_str=None,
|
meta_str=None,
|
||||||
default_path='/var/lib/heat-cfntools/cfn-init-data',
|
default_path='/var/lib/heat-cfntools/cfn-init-data',
|
||||||
last_path='/var/cache/heat-cfntools/last_metadata'):
|
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:
|
if meta_str:
|
||||||
self._data = meta_str
|
self._data = meta_str
|
||||||
else:
|
else:
|
||||||
|
@ -1116,9 +1121,16 @@ class Metadata(object):
|
||||||
cf.write(json.dumps(self._metadata))
|
cf.write(json.dumps(self._metadata))
|
||||||
os.rename(cf.name, last_path)
|
os.rename(cf.name, last_path)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return json.dumps(self._metadata)
|
return json.dumps(self._metadata)
|
||||||
|
|
||||||
|
def display(self):
|
||||||
|
if self._metadata is not None:
|
||||||
|
print str(self)
|
||||||
|
return
|
||||||
|
|
||||||
def _is_valid_metadata(self):
|
def _is_valid_metadata(self):
|
||||||
"""Should find the AWS::CloudFormation::Init json key."""
|
"""Should find the AWS::CloudFormation::Init json key."""
|
||||||
is_valid = self._metadata and \
|
is_valid = self._metadata and \
|
||||||
|
|
|
@ -528,17 +528,16 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
default_file.flush()
|
default_file.flush()
|
||||||
self.assertThat(default_file.name, ttm.FileContains(md_str))
|
self.assertThat(default_file.name, ttm.FileContains(md_str))
|
||||||
|
|
||||||
md.retrieve(
|
self.assertTrue(
|
||||||
default_path=default_file.name,
|
md.retrieve(default_path=default_file.name,
|
||||||
last_path=self.last_file)
|
last_path=self.last_file))
|
||||||
|
|
||||||
self.assertThat(self.last_file, ttm.FileContains(md_str))
|
self.assertThat(self.last_file, ttm.FileContains(md_str))
|
||||||
self.assertThat(md_data, ttm.Equals(md._metadata))
|
self.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
|
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
md = cfn_helper.Metadata('teststack', None)
|
||||||
md.retrieve(
|
self.assertTrue(md.retrieve(default_path=default_file.name,
|
||||||
default_path=default_file.name,
|
last_path=self.last_file))
|
||||||
last_path=self.last_file)
|
|
||||||
self.assertThat(md_data, ttm.Equals(md._metadata))
|
self.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
|
|
||||||
def test_metadata_retrieve_none(self):
|
def test_metadata_retrieve_none(self):
|
||||||
|
@ -546,11 +545,17 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
md = cfn_helper.Metadata('teststack', None)
|
||||||
default_file = os.path.join(self.tdir.path, 'default_file')
|
default_file = os.path.join(self.tdir.path, 'default_file')
|
||||||
|
|
||||||
md.retrieve(
|
self.assertFalse(md.retrieve(default_path=default_file,
|
||||||
default_path=default_file,
|
last_path=self.last_file))
|
||||||
last_path=self.last_file)
|
|
||||||
self.assertIsNone(md._metadata)
|
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):
|
def test_metadata_retrieve_passed(self):
|
||||||
|
|
||||||
md_data = {"AWS::CloudFormation::Init": {"config": {"files": {
|
md_data = {"AWS::CloudFormation::Init": {"config": {"files": {
|
||||||
|
@ -558,14 +563,26 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
md_str = json.dumps(md_data)
|
md_str = json.dumps(md_data)
|
||||||
|
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
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))
|
self.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
|
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
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.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
self.assertEqual(md_str, str(md))
|
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):
|
def test_metadata_creates_cache(self):
|
||||||
temp_home = tempfile.mkdtemp()
|
temp_home = tempfile.mkdtemp()
|
||||||
|
|
||||||
|
@ -584,7 +601,7 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
|
|
||||||
self.assertFalse(os.path.exists(last_path),
|
self.assertFalse(os.path.exists(last_path),
|
||||||
"last_metadata file already exists")
|
"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),
|
self.assertTrue(os.path.exists(last_path),
|
||||||
"last_metadata file should exist")
|
"last_metadata file should exist")
|
||||||
# Ensure created dirs and file have right perms
|
# Ensure created dirs and file have right perms
|
||||||
|
@ -597,7 +614,8 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
"/tmp/foo": {"content": "bar"}}}}}
|
"/tmp/foo": {"content": "bar"}}}}}
|
||||||
|
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
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.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
self.assertTrue(md._is_valid_metadata())
|
self.assertTrue(md._is_valid_metadata())
|
||||||
|
@ -627,7 +645,7 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
None,
|
None,
|
||||||
access_key='foo',
|
access_key='foo',
|
||||||
secret_key='bar')
|
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))
|
self.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
|
|
||||||
with tempfile.NamedTemporaryFile(mode='w') as fcreds:
|
with tempfile.NamedTemporaryFile(mode='w') as fcreds:
|
||||||
|
@ -635,7 +653,7 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
fcreds.flush()
|
fcreds.flush()
|
||||||
md = cfn_helper.Metadata(
|
md = cfn_helper.Metadata(
|
||||||
'teststack', None, credentials_file=fcreds.name)
|
'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))
|
self.assertThat(md_data, ttm.Equals(md._metadata))
|
||||||
|
|
||||||
m.VerifyAll()
|
m.VerifyAll()
|
||||||
|
@ -649,7 +667,8 @@ class TestMetadataRetrieve(testtools.TestCase):
|
||||||
foo_file.name: {"content": "bar"}}}}}
|
foo_file.name: {"content": "bar"}}}}}
|
||||||
|
|
||||||
md = cfn_helper.Metadata('teststack', None)
|
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()
|
md.cfn_init()
|
||||||
self.assertThat(foo_file.name, ttm.FileContains('bar'))
|
self.assertThat(foo_file.name, ttm.FileContains('bar'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue