def setUp(self): from haas.ext.switches.mock import LOCAL_STATE self.LOCAL_STATE = LOCAL_STATE fail_on_log_warnings() # Configure HaaS: config_testsuite() config_merge({ 'extensions': { 'haas.ext.switches.mock': '', 'haas.ext.obm.ipmi': '', 'haas.ext.obm.mock': '', 'haas.ext.network_allocators.null': None, 'haas.ext.network_allocators.vlan_pool': '', }, 'haas.ext.network_allocators.vlan_pool': { 'vlans': '100-200', }, }) config.load_extensions() newDB() # Initialize the db schema initial_db() # Populate the db with objects # Sanity check the start state: assert self.LOCAL_STATE['stock_switch_0']['free_port_0'] == {} self.request_context = app.test_request_context() self.request_context.push()
def test_db_eq(filename, make_objects, extra_config): """Migrating from a snapshot should create the same objects as a new db. `make_objects` is a function that, when run against the latest version of a schema, will create some set of objects. `filename` is the name of an sql dump of a previous database, whose contents were created with the then-current version of `make_objects`. `extra_config` specifies modifications to the haas.cfg under which the test is run. this is passed to `config_merge`. The test does the following: * Restore the database snapshot and run the migration scripts to update its contents to the current schema. * Create a fresh database according to the current schema, and execute `make_objects`. * Compare the two resulting databases. The test passes if and only if they are the same. """ config_merge(extra_config) load_extensions() server.register_drivers() server.validate_state() def run_fn(f): """Run the function f and return a representation of its db.""" # We can't just do db.drop_all(), since db's metadata won't # necessarily reflect the contents of the database. If there are # tables it doesn't know about, it may raise an exception. with app.app_context(): drop_tables() f() return get_db_state() upgraded = run_fn(lambda: load_dump(filename)) fresh = run_fn(lambda: fresh_create(make_objects)) drop_tables() def censor_nondeterminism(string): """Censor parts of the output whose values are non-deterministic. Certain objects (currently just uuids) are generated non-deterministically, and will thus be different between databases even if everything is working. This function censors the relevant parts of `string`, so that they don't cause the tests to fail. """ hex_re = r'[0-9a-f]' uuid_re = hex_re * 8 + ('-' + hex_re * 4) * 3 + '-' + hex_re * 12 return re.sub(uuid_re, '<<UUID>>', string) differ = difflib.Differ() upgraded = censor_nondeterminism(pformat(upgraded)).split('\n') fresh = censor_nondeterminism(pformat(fresh)).split('\n') assert upgraded == fresh, ("Databases are different!\n\n" + pformat(list(differ.compare(upgraded, fresh))))
def configure(): config_testsuite() config_merge({ 'extensions': { 'haas.ext.obm.ipmi': '', }, }) config.load_extensions()
def configure(): config_testsuite() config_merge({ 'extensions': { 'haas.ext.auth.mock': '', 'haas.ext.auth.null': None, }, }) config.load_extensions()
def configure(): config_testsuite() config_merge({ 'extensions': { 'haas.ext.network_allocators.null': None, 'haas.ext.network_allocators.vlan_pool': '' }, 'haas.ext.network_allocators.vlan_pool': { 'vlans': '100-104, 300, 702', # Arbitrary list }, }) load_extensions()
def configure(): config_testsuite() config_merge({ 'extensions': { 'haas.ext.auth.mock': '', # This extension is enabled by default in the tests, so we need to # disable it explicitly: 'haas.ext.auth.null': None, 'haas.ext.switches.mock': '', }, }) config.load_extensions()
def configure(): config_testsuite() config_merge({ 'extensions': { 'haas.ext.auth.mock': '', # This extension is enabled by default in the tests, so we need to # disable it explicitly: 'haas.ext.auth.null': None, 'haas.ext.switches.mock': '', 'haas.ext.obm.mock': '' }, }) config.load_extensions()
def configure(): config_testsuite() config_merge( { "extensions": { "haas.ext.auth.mock": "", # This extension is enabled by default in the tests, so we need to # disable it explicitly: "haas.ext.auth.null": None, "haas.ext.switches.mock": "", "haas.ext.obm.mock": "", } } ) config.load_extensions()
def main(): """Entry point to the CLI. There is a script located at ${source_tree}/scripts/haas, which invokes this function. """ config.load() config.configure_logging() config.load_extensions() if len(sys.argv) < 2 or sys.argv[1] not in command_dict: # Display usage for all commands help() else: command_dict[sys.argv[1]](*sys.argv[2:])
def configure(): config_testsuite() config_merge({ 'auth': { # The tests in this module are checking the specific authorization # requirements of the API calls. as such, we don't want things to # fail due to complete lack of authentication, where they should # fail later when the specific authorization checks we're testing # for happen. 'require_authentication': 'False', }, 'extensions': { 'haas.ext.auth.database': '', 'haas.ext.auth.null': None, }, }) config.load_extensions()
def test_load_extension(): """Check that putting modules in [extensions] results in importing them.""" config_set({ 'extensions': { # These modules are chosen because: # # 1. They are in the standard library, and cross-platform # 2. If you ever think you need to import these for use in # HaaS, I will judge you. 'sndhdr': '', 'colorsys': '', 'email.mime.audio': '', }, }) config.load_extensions() for module in 'sndhdr', 'colorsys', 'email.mime.audio': assert module in sys.modules
def test_db_eq(filename, extra_config): """Verify that each function in fns creates the same database.""" config_merge(extra_config) load_extensions() server.register_drivers() server.validate_state() def run_fn(f): """Run the function f and return a representation of its db.""" # We can't just do db.drop_all(), since db's metadata won't # necessarily reflect the contents of the database. If there are # tables it doesn't know about, it may raise an exception. with app.app_context(): drop_tables() f() return get_db_state() upgraded = run_fn(lambda: load_dump(filename)) fresh = run_fn(fresh_create) drop_tables() def censor_nondeterminism(string): """Censor parts of the output whose values are non-deterministic. Certain objects (currently just uuids) are generated non-deterministically, and will thus be different between databases even if everything is working. This function censors the relevant parts of `string`, so that they don't cause the tests to fail. """ hex_re = r'[0-9a-f]' uuid_re = hex_re * 8 + ('-' + hex_re * 4) * 3 + '-' + hex_re * 12 return re.sub(uuid_re, '<<UUID>>', string) differ = difflib.Differ() upgraded = censor_nondeterminism(pformat(upgraded)).split('\n') fresh = censor_nondeterminism(pformat(fresh)).split('\n') assert upgraded == fresh, ( "Databases are different!\n\n" + pformat(list(differ.compare(upgraded, fresh))) )
def test_db_eq(filename, extra_config): """Verify that each function in fns creates the same database.""" config_merge(extra_config) load_extensions() server.register_drivers() server.validate_state() def run_fn(f): """Run the function f and return a representation of its db.""" # We can't just do db.drop_all(), since db's metadata won't # necessarily reflect the contents of the database. If there are # tables it doesn't know about, it may raise an exception. with app.app_context(): drop_tables() f() return get_db_state() upgraded = run_fn(lambda: load_dump(filename)) fresh = run_fn(fresh_create) drop_tables() def censor_nondeterminism(string): """Censor parts of the output whose values are non-deterministic. Certain objects (currently just uuids) are generated non-deterministically, and will thus be different between databases even if everything is working. This function censors the relevant parts of `string`, so that they don't cause the tests to fail. """ hex_re = r'[0-9a-f]' uuid_re = hex_re * 8 + ('-' + hex_re * 4) * 3 + '-' + hex_re * 12 return re.sub(uuid_re, '<<UUID>>', string) differ = difflib.Differ() upgraded = censor_nondeterminism(pformat(upgraded)).split('\n') fresh = censor_nondeterminism(pformat(fresh)).split('\n') assert upgraded == fresh, ("Databases are different!\n\n" + pformat(list(differ.compare(upgraded, fresh))))
def configure(): """Fixture which setups up haas.cfg, and loads extensions and such.""" tc.config_testsuite() tc.config_merge({ 'extensions': { 'haas.ext.auth.null': None, 'haas.ext.auth.keystone': '', }, 'haas.ext.auth.keystone': { 'auth_url': 'http://127.0.0.1:35357/v3', 'auth_protocol': 'http', 'username': '******', 'password': '******', 'project_name': 'admin', 'admin_user': '******', 'admin_password': '******', }, }) # the keystone client library actually bombs out if we don't configure # logging: config.configure_logging() config.load_extensions()
def configure(): config_testsuite() config.load_extensions()
def configure(): config_testsuite() config.configure_logging() config.load_extensions()
def test_db_eq(filename, make_objects, extra_config): """Migrating from a snapshot should create the same objects as a new db. `make_objects` is a function that, when run against the latest version of a schema, will create some set of objects. `filename` is the name of an sql dump of a previous database, whose contents were created with the then-current version of `make_objects`. `extra_config` specifies modifications to the haas.cfg under which the test is run. this is passed to `config_merge`. The test does the following: * Restore the database snapshot and run the migration scripts to update its contents to the current schema. * Create a fresh database according to the current schema, and execute `make_objects`. * Compare the two resulting databases. The test passes if and only if they are the same. """ config_merge(extra_config) load_extensions() server.register_drivers() server.validate_state() def run_fn(f): """Run the function f and return a representation of its db.""" # We can't just do db.drop_all(), since db's metadata won't # necessarily reflect the contents of the database. If there are # tables it doesn't know about, it may raise an exception. with app.app_context(): drop_tables() f() return get_db_state() upgraded = run_fn(lambda: load_dump(filename)) fresh = run_fn(lambda: fresh_create(make_objects)) drop_tables() def censor_nondeterminism(string): """Censor parts of the output whose values are non-deterministic. Certain objects (currently just uuids) are generated non-deterministically, and will thus be different between databases even if everything is working. This function censors the relevant parts of `string`, so that they don't cause the tests to fail. """ hex_re = r'[0-9a-f]' uuid_re = hex_re * 8 + ('-' + hex_re * 4) * 3 + '-' + hex_re * 12 return re.sub(uuid_re, '<<UUID>>', string) differ = difflib.Differ() upgraded = censor_nondeterminism(pformat(upgraded)).split('\n') fresh = censor_nondeterminism(pformat(fresh)).split('\n') assert upgraded == fresh, ( "Databases are different!\n\n" + pformat(list(differ.compare(upgraded, fresh))) )
def configure(): config_testsuite() config_merge( {'extensions': {'haas.ext.obm.ipmi': '', }, }) config.load_extensions()