+++ /dev/null
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-
-###
-### an unparented test -- no encapsulating class, just any fn starting with
-### 'test'.
-## http://darcs.idyll.org/~t/projects/nose-demo/simple/tests/test_stuff.py.html
-###
-
-import io
-import sys
-import mox
-import nose
-from nose.plugins.attrib import attr
-from nose import with_setup
-import unittest
-import shutil
-
-from utils import skip_if
-
-try:
- from heat.cfntools.cfn_helper import *
-except:
- skip_test = True
-else:
- skip_test = False
-
-
-@attr(tag=['unit', 'cfn_helper'])
-@attr(speed='fast')
-@skip_if(skip_test, 'unable to import cfn_helper')
-def test_boolean():
-
- assert(to_boolean('true'))
- assert(to_boolean(True))
- assert(to_boolean('TRUE'))
- assert(to_boolean('True'))
- assert(to_boolean('Yes'))
- assert(to_boolean('YES'))
- assert(to_boolean('yes'))
- assert(to_boolean('1'))
- assert(to_boolean(1))
-
- assert(not to_boolean('tru'))
- assert(not to_boolean(False))
- assert(not to_boolean('False'))
- assert(not to_boolean('FALSE'))
- assert(not to_boolean('No'))
- assert(not to_boolean('NO'))
- assert(not to_boolean('no'))
- assert(not to_boolean('0334'))
- assert(not to_boolean(0))
- assert(not to_boolean(56))
-
-
-def setUp_credential_file():
- f = open('/tmp/incredible', 'w')
- f.write('junk, just junk')
- f.close()
-
-
-def tearDown_credential_file():
- shutil.rmtree('/tmp/incredible', ignore_errors=True)
-
-
-@with_setup(setUp_credential_file, tearDown_credential_file)
-@attr(tag=['unit', 'cfn-hup'])
-@attr(speed='fast')
-@skip_if(skip_test, 'unable to import cfn_helper')
-def test_hup_conf1():
- good = """
-[main]
-stack=stack-test
-credential-file=/tmp/incredible
-region=unit-test-a
-interval=3
-"""
- c = HupConfig([io.BytesIO(good)])
- assert(c.stack == 'stack-test')
- assert(c.credential_file == '/tmp/incredible')
- assert(c.region == 'unit-test-a')
- assert(c.interval == 3)
-
-
-@with_setup(setUp_credential_file, tearDown_credential_file)
-@attr(tag=['unit', 'cfn-hup'])
-@attr(speed='fast')
-@skip_if(skip_test, 'unable to import cfn_helper')
-def test_hup_default():
- good = """
-[main]
-stack=stack-testr
-credential-file=/tmp/incredible
-"""
- c = HupConfig([io.BytesIO(good)])
- assert(c.stack == 'stack-testr')
- assert(c.credential_file == '/tmp/incredible')
- assert(c.region == 'nova')
- assert(c.interval == 10)
-
-
-@with_setup(setUp_credential_file, tearDown_credential_file)
-@attr(tag=['unit', 'cfn-hup'])
-@attr(speed='fast')
-@skip_if(skip_test, 'unable to import cfn_helper')
-def test_hup_hook():
- good = """
-[main]
-stack=stackname_is_fred
-credential-file=/tmp/incredible
-
-[bla]
-triggers=post.update
-path=Resources.webserver
-action=systemctl reload httpd.service
-runas=root
-"""
- c = HupConfig([io.BytesIO(good)])
- assert(c.stack == 'stackname_is_fred')
- assert(c.credential_file == '/tmp/incredible')
- assert(c.region == 'nova')
- assert(c.interval == 10)
-
- assert(c.hooks['bla'].triggers == 'post.update')
- assert(c.hooks['bla'].path == 'Resources.webserver')
- assert(c.hooks['bla'].action == 'systemctl reload httpd.service')
- assert(c.hooks['bla'].runas == 'root')
-
-
-def tearDown_metadata_files():
- shutil.rmtree('/tmp/_files_test_',
- ignore_errors=True)
-
-
-class PopenMock:
- def communicate(self):
- self.returncode = 0
- return ['', None]
-
-
-class MetadataTest(unittest.TestCase):
- def setUp(self):
- self.m = mox.Mox()
-
- def tearDown(self):
- self.m.UnsetStubs()
- shutil.rmtree('/tmp/_files_test_', ignore_errors=True)
-
- @attr(tag=['unit', 'cfn-metadata'])
- @attr(speed='fast')
- @skip_if(skip_test, 'unable to import cfn_helper')
- def test_metadata_files(self):
- j = ''' {
- "AWS::CloudFormation::Init" : {
- "config" : {
- "sources": {
-''' + \
- '"/home/ec2-user/sample" : "https://s3.amazonaws.com/' + \
- 'cloudformation-examples/CloudFormationRailsSample.zip"' + \
- '''
- },
- "files" : {
- "/tmp/_files_test_/epel.repo" : {
- "source" : "https://raw.github.com/heat-api/heat/master/README.rst",
- "mode" : "000644"
- },
- "/tmp/_files_test_/_with/some/dirs/to/make/small.conf" : {
- "content" : "not much really",
- "mode" : "000777"
- },
- "/tmp/_files_test_/node.json": {
- "content": {
- "myapp": {
- "db": {
- "database": "RefDBName",
- "user": "RefDBUser",
- "host": "Fn::GetAttDBInstance.Endpoint.Address",
- "password": "RefDBPassword"
- }
- },
- "run_list": ["recipe[wordpress]", "bla"]
- },
- "mode": "000600"
- }
- }
- }
- }
- }
-'''
-
- import subprocess
- import os
- self.m.StubOutWithMock(subprocess, 'Popen')
- self.m.StubOutWithMock(os, 'chown')
- self.m.StubOutWithMock(os, 'chmod')
-
- subprocess.Popen(['su', 'root', '-c',
- 'wget -O /tmp/CloudFormationRailsSample.zip ' +
- 'https://s3.amazonaws.com/cloudformation-' +
- 'examples/CloudFormationRailsSample.zip'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).AndReturn(PopenMock())
-
- subprocess.Popen(['su', 'root', '-c',
-'unzip -d /home/ec2-user/sample /tmp/CloudFormationRailsSample.zip'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).AndReturn(PopenMock())
-
- subprocess.Popen(['su', 'root', '-c',
- 'wget -O /tmp/_files_test_/epel.repo \
-https://raw.github.com/heat-api/heat/master/README.rst'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).AndReturn(PopenMock())
- os.chown('/tmp/_files_test_/node.json', -1, -1)
- os.chown('/tmp/_files_test_/epel.repo', -1, -1)
- os.chmod('/tmp/_files_test_/node.json', 384)
- os.chmod('/tmp/_files_test_/epel.repo', 420)
- os.chown('/tmp/_files_test_/_with/some/dirs/to/make/small.conf',
- -1, -1)
- os.chmod('/tmp/_files_test_/_with/some/dirs/to/make/small.conf', 511)
- self.m.ReplayAll()
-
- metadata = Metadata('tester', 'ronald')
- metadata.retrieve(j)
- metadata.cfn_init()
- self.m.VerifyAll()
-
-
-class CommandRunnerTest(unittest.TestCase):
- def setUp(self):
- self.m = mox.Mox()
-
- def tearDown(self):
- self.m.UnsetStubs()
-
- @attr(tag=['unit', 'cfn-helper'])
- @attr(speed='fast')
- @skip_if(skip_test, 'unable to import cfn_helper')
- def test_runas(self):
- import subprocess
- self.m.StubOutWithMock(subprocess, 'Popen')
- subprocess.Popen(['su', 'user', '-c', 'some command'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).AndReturn(PopenMock())
-
- self.m.ReplayAll()
- CommandRunner('some command').run('user')
- self.m.VerifyAll()
-
- @attr(tag=['unit', 'cfn-helper'])
- @attr(speed='fast')
- @skip_if(skip_test, 'unable to import cfn_helper')
- def test_default_runas(self):
- import subprocess
- self.m.StubOutWithMock(subprocess, 'Popen')
- subprocess.Popen(['su', 'root', '-c', 'some command'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).AndReturn(PopenMock())
-
- self.m.ReplayAll()
- CommandRunner('some command').run()
- self.m.VerifyAll()
-
-
-if __name__ == '__main__':
- sys.argv.append(__file__)
- nose.main()