def test_metadata_retrieve_files(self): md_data = { "AWS::CloudFormation::Init": { "config": { "files": { "/tmp/foo": { "content": "bar" } } } } } md_str = json.dumps(md_data) md = cfn_helper.Metadata('teststack', None) with tempfile.NamedTemporaryFile(mode='w+') as default_file: default_file.write(md_str) default_file.flush() self.assertThat(default_file.name, ttm.FileContains(md_str)) 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) self.assertTrue( md.retrieve(default_path=default_file.name, last_path=self.last_file)) self.assertThat(md_data, ttm.Equals(md._metadata))
def test_cfn_init_with_ignore_errors_true(self): self.mock_cmd_run(['su', 'root', '-c', '/bin/command1']).AndReturn( FakePOpen('Doing something', 'error', -1)) self.mock_cmd_run(['su', 'root', '-c', '/bin/command2']).AndReturn(FakePOpen('All good')) self.m.ReplayAll() md_data = { "AWS::CloudFormation::Init": { "config": { "commands": { "00_foo": { "command": "/bin/command1", "ignoreErrors": "true" }, "01_bar": { "command": "/bin/command2", "ignoreErrors": "false" } } } } } md = cfn_helper.Metadata('teststack', None) self.assertTrue(md.retrieve(meta_str=md_data, last_path=self.last_file)) md.cfn_init()
def setUp(self): super(TestCfnHup, self).setUp() self.logger = self.useFixture(fixtures.FakeLogger()) self.stack_name = self.getUniqueString() self.resource = self.getUniqueString() self.region = self.getUniqueString() self.creds = tempfile.NamedTemporaryFile() self.metadata = cfn_helper.Metadata(self.stack_name, self.resource, credentials_file=self.creds.name, region=self.region) self.init_content = self.getUniqueString() self.init_temp = tempfile.NamedTemporaryFile() self.service_name = self.getUniqueString() self.init_section = { 'AWS::CloudFormation::Init': { 'config': { 'services': { 'sysvinit': { self.service_name: { 'enabled': True, 'ensureRunning': True, } } }, 'files': { self.init_temp.name: { 'content': self.init_content } } } } }
def test_get_tags(self): self.m = mox.Mox() self.addCleanup(self.m.UnsetStubs) fake_tags = {'foo': 'fee', 'apple': 'red'} md_data = { "uuid": "f9431d18-d971-434d-9044-5b38f5b4646f", "availability_zone": "nova", "hostname": "as-wikidatabase-4ykioj3lgi57.novalocal", "launch_index": 0, "meta": fake_tags, "public_keys": { "heat_key": "ssh-rsa etc...\n" }, "name": "as-WikiDatabase-4ykioj3lgi57" } tags_expect = fake_tags tags_expect['InstanceId'] = md_data['uuid'] md = cfn_helper.Metadata('teststack', None) self.m.StubOutWithMock(md, 'get_nova_meta') md.get_nova_meta().AndReturn(md_data) self.m.ReplayAll() tags = md.get_tags() self.assertEqual(tags_expect, tags) self.m.VerifyAll()
def test_nova_meta_wget_corrupt(self): url = 'http://169.254.169.254/openstack/2012-08-10/meta_data.json' temp_home = tempfile.mkdtemp() cache_path = os.path.join(temp_home, 'meta_data.json') def cleanup_temp_home(thome): os.unlink(cache_path) os.rmdir(thome) self.m = mox.Mox() self.addCleanup(self.m.UnsetStubs) self.addCleanup(cleanup_temp_home, temp_home) md_str = "this { is not really json" def write_cache_file(*params, **kwargs): with open(cache_path, 'w+') as cache_file: cache_file.write(md_str) cache_file.flush() self.assertThat(cache_file.name, ttm.FileContains(md_str)) self.m.StubOutWithMock(subprocess, 'Popen') subprocess.Popen(['su', 'root', '-c', 'wget -O %s %s' % (cache_path, url)], cwd=None, env=None, stderr=-1, stdout=-1)\ .WithSideEffects(write_cache_file)\ .AndReturn(FakePOpen('Downloaded', '', 0)) self.m.ReplayAll() md = cfn_helper.Metadata('teststack', None) meta_out = md.get_nova_meta(cache_path=cache_path) self.assertEqual(None, meta_out) self.m.VerifyAll()
def test_cfn_init(self): with tempfile.NamedTemporaryFile(mode='w+') as foo_file: md_data = {"AWS::CloudFormation::Init": {"config": {"files": { foo_file.name: {"content": "bar"}}}}} md = cfn_helper.Metadata('teststack', None) self.assertTrue( md.retrieve(meta_str=md_data, last_path=self.last_file)) md.cfn_init() self.assertThat(foo_file.name, ttm.FileContains('bar'))
def test_is_valid_metadata(self): md_data = {"AWS::CloudFormation::Init": {"config": {"files": { "/tmp/foo": {"content": "bar"}}}}} md = cfn_helper.Metadata('teststack', None) 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()) self.assertThat( md_data['AWS::CloudFormation::Init'], ttm.Equals(md._metadata))
def test_metadata_retrieve_none(self): md = cfn_helper.Metadata('teststack', None) default_file = os.path.join(self.tdir.path, 'default_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_nova_meta_wget(self): url = 'http://169.254.169.254/openstack/2012-08-10/meta_data.json' temp_home = tempfile.mkdtemp() cache_path = os.path.join(temp_home, 'meta_data.json') def cleanup_temp_home(thome): os.unlink(cache_path) os.rmdir(thome) self.m = mox.Mox() self.addCleanup(self.m.UnsetStubs) self.addCleanup(cleanup_temp_home, temp_home) meta_in = { "uuid": "f9431d18-d971-434d-9044-5b38f5b4646f", "availability_zone": "nova", "hostname": "as-wikidatabase-4ykioj3lgi57.novalocal", "launch_index": 0, "meta": { "freddy": "is hungry" }, "public_keys": { "heat_key": "ssh-rsa etc...\n" }, "name": "as-WikiDatabase-4ykioj3lgi57" } md_str = json.dumps(meta_in) def write_cache_file(*params, **kwargs): with open(cache_path, 'w+') as cache_file: cache_file.write(md_str) cache_file.flush() self.assertThat(cache_file.name, ttm.FileContains(md_str)) self.m.StubOutWithMock(subprocess, 'Popen') subprocess.Popen(['su', 'root', '-c', 'wget -O %s %s' % (cache_path, url)], cwd=None, env=None, stderr=-1, stdout=-1)\ .WithSideEffects(write_cache_file)\ .AndReturn(FakePOpen('Downloaded', '', 0)) self.m.ReplayAll() md = cfn_helper.Metadata('teststack', None) meta_out = md.get_nova_meta(cache_path=cache_path) self.assertEqual(meta_in, meta_out) self.m.VerifyAll()
def test_metadata_retrieve_by_key_passed(self): md_data = {"foo": {"bar": {"fred.1": "abcd"}}} md_str = json.dumps(md_data) md = cfn_helper.Metadata('teststack', None) 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("foo") fake_stdout.flush() self.assertEqual(displayed.getDetails()['stdout'].as_text(), "{\"bar\": {\"fred.1\": \"abcd\"}}\n")
def test_nova_meta_with_cache(self): meta_in = {"uuid": "f9431d18-d971-434d-9044-5b38f5b4646f", "availability_zone": "nova", "hostname": "as-wikidatabase-4ykioj3lgi57.novalocal", "launch_index": 0, "meta": {}, "public_keys": {"heat_key": "ssh-rsa etc...\n"}, "name": "as-WikiDatabase-4ykioj3lgi57"} md_str = json.dumps(meta_in) md = cfn_helper.Metadata('teststack', None) with tempfile.NamedTemporaryFile(mode='w+') as default_file: default_file.write(md_str) default_file.flush() self.assertThat(default_file.name, ttm.FileContains(md_str)) meta_out = md.get_nova_meta(cache_path=default_file.name) self.assertEqual(meta_in, meta_out)
def test_get_instance_id(self): self.m = mox.Mox() self.addCleanup(self.m.UnsetStubs) uuid = "f9431d18-d971-434d-9044-5b38f5b4646f" md_data = {"uuid": uuid, "availability_zone": "nova", "hostname": "as-wikidatabase-4ykioj3lgi57.novalocal", "launch_index": 0, "public_keys": {"heat_key": "ssh-rsa etc...\n"}, "name": "as-WikiDatabase-4ykioj3lgi57"} md = cfn_helper.Metadata('teststack', None) self.m.StubOutWithMock(md, 'get_nova_meta') md.get_nova_meta().AndReturn(md_data) self.m.ReplayAll() self.assertEqual(md.get_instance_id(), uuid) self.m.VerifyAll()
def test_nova_meta_wget_failed(self): url = 'http://169.254.169.254/openstack/2012-08-10/meta_data.json' temp_home = tempfile.mkdtemp() cache_path = os.path.join(temp_home, 'meta_data.json') def cleanup_temp_home(thome): os.rmdir(thome) self.m = mox.Mox() self.addCleanup(self.m.UnsetStubs) self.addCleanup(cleanup_temp_home, temp_home) self.m.StubOutWithMock(subprocess, 'Popen') subprocess.Popen(['su', 'root', '-c', 'wget -O %s %s' % (cache_path, url)], cwd=None, env=None, stderr=-1, stdout=-1)\ .AndReturn(FakePOpen('Failed', '', 1)) self.m.ReplayAll() md = cfn_helper.Metadata('teststack', None) meta_out = md.get_nova_meta(cache_path=cache_path) self.assertEqual(None, meta_out) self.m.VerifyAll()