def test_post_node_success(self, m_load_neighbordb, m_repository): node = create_node() definition = create_definition() definition.add_action() cfg = {'return_value.exists.return_value': False} m_repository.configure_mock(**cfg) cfg = {'return_value.match_node.return_value': [Mock()]} m_load_neighbordb.configure_mock(**cfg) request = Request.blank('/nodes', body=node.as_json(), method='POST', headers=ztp_headers()) resp = request.get_response(ztpserver.controller.Router()) args_list = list() args_list.append('nodes/%s/%s' % (node.serialnumber, DEFINITION_FN)) args_list.append('nodes/%s/%s' % (node.serialnumber, PATTERN_FN)) for arg in args_list: m_repository.return_value.add_file.assert_any_call(arg) location = 'http://localhost/nodes/%s' % node.serialnumber self.assertEqual(resp.status_code, constants.HTTP_STATUS_CREATED) self.assertEqual(resp.location, location)
def test_get_definition_wo_validation(self): ztpserver.config.runtime.set_value(\ 'disable_topology_validation', True, 'default') definitions_file = create_definition() definitions_file.add_action() node = create_node() filestore = Mock() ztpserver.controller.create_file_store = filestore def get_file(filepath): fileobj = Mock() if filepath.endswith('node'): fileobj.contents = node.as_json() elif filepath.endswith('definition'): fileobj.contents = definitions_file.as_yaml() elif filepath.endswith('attributes'): type(fileobj).contents = mock.PropertyMock(side_effect=\ ztpserver.repository.FileObjectNotFound) return fileobj filestore.return_value.get_file = Mock(side_effect=get_file) url = '/nodes/%s' % node.systemmac request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/json') self.assertIsInstance(json.loads(resp.body), dict)
def test_get_definition_w_validation_success(self, m_load_pattern, m_repository): node = create_node() definitions_file = create_definition() definitions_file.add_action() cfg = dict() def m_get_file(arg): print arg m_file_object = Mock() if arg.endswith('.node'): m_file_object.read.return_value = node.as_dict() elif arg.endswith('definition'): m_file_object.read.return_value = definitions_file.as_dict() elif arg.endswith('attributes'): raise ztpserver.repository.FileObjectNotFound return m_file_object cfg['return_value.get_file.side_effect'] = m_get_file m_repository.configure_mock(**cfg) m_load_pattern.return_value.match_node.return_value = Mock() url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) self.assertIsInstance(json.loads(resp.body), dict)
def test_get_definition_wo_validation(self, m_repository): ztpserver.config.runtime.set_value(\ 'disable_topology_validation', True, 'default') definitions_file = create_definition() definitions_file.add_action() node = create_node() cfg = dict() def m_get_file(arg): m_file_object = Mock() if arg.endswith('.node'): m_file_object.read.return_value = node.as_dict() elif arg.endswith('definition'): m_file_object.read.return_value = definitions_file.as_dict() else: raise ztpserver.repository.FileObjectNotFound return m_file_object cfg['return_value.get_file.side_effect'] = m_get_file m_repository.configure_mock(**cfg) url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) self.assertIsInstance(json.loads(resp.body), dict)
def test_get_definition_w_validation_failure(self, m_load_pattern, m_repository): definitions_file = create_definition() definitions_file.add_action() serialnumber = random_string() node = Mock(serialnumber=serialnumber) node.identifier.return_value = serialnumber cfg = dict() def m_get_file(arg): m_file_object = Mock() if arg.endswith('.node'): m_file_object.read.return_value = node elif arg.endswith('definition'): m_file_object.read.return_value = definitions_file.as_dict() return m_file_object cfg['return_value.get_file.side_effect'] = m_get_file m_repository.configure_mock(**cfg) m_load_pattern.return_value.match_node.return_value = False url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_BAD_REQUEST) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_HTML) self.assertEqual(resp.body, str())
def test_do_substitution_with_attributes(self): ztpserver.controller.create_file_store = Mock() defattrs = dict(foo='$foo') definition = create_definition() definition.add_attribute('foo', 'bar') definition.add_action(name='dummy action', attributes=defattrs) g_attr_foo = random_string() attributes = create_attributes() attributes.add_attribute('foo', g_attr_foo) response = dict(definition=definition.as_dict(), attributes=attributes.as_dict()) controller = ztpserver.controller.NodesController() (resp, state) = controller.do_substitution(response) self.assertEqual(state, 'do_resources') self.assertIsInstance(resp, dict) foo = resp['definition']['actions'][0]['attributes']['foo'] self.assertEqual(foo, g_attr_foo)
def test_get_startup_config_wo_validation(self, m_load_pattern, m_repository, m_create_node): ztpserver.config.runtime.set_value(\ 'disable_topology_validation', True, 'default') definition = create_definition() definition.add_action() node = create_node() cfg = dict() def m_get_file(arg): fileobj = Mock() if arg.endswith('.node'): fileobj.return_value.read.return_value = node.as_dict() elif arg.endswith('startup-config'): fileobj.return_value.read.return_value = random_string() else: raise ztpserver.repository.FileObjectNotFound return fileobj cfg['return_value.get_file'] = Mock(side_effect=m_get_file) m_repository.configure_mock(**cfg) url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) self.assertIsInstance(json.loads(resp.body), dict)
def test_do_substitution_without_actions(self): # github issue #129 definition = create_definition() definition.actions.append({'name': 'foo'}) response = dict(definition=definition.as_dict()) controller = ztpserver.controller.NodesController() (resp, state) = controller.do_substitution(response, resource=random_string()) self.assertEqual(state, 'do_resources') self.assertIsInstance(resp, dict)
def test_get_definition_w_attributes_no_substitution(self): ztpserver.config.runtime.set_value(\ 'disable_topology_validation', False, 'default') node = create_node() g_attr_foo = random_string() attributes_file = create_attributes() attributes_file.add_attribute('variables', {'foo': g_attr_foo}) l_attr_url = random_string() definitions_file = create_definition() definitions_file.add_attribute('foo', random_string()) definitions_file.add_action(name='dummy action', attributes=dict(url=l_attr_url)) filestore = Mock() def exists(filepath): if filepath.endswith('startup-config'): return False return True filestore.return_value.exists = Mock(side_effect=exists) def get_file(filepath): fileobj = Mock() if filepath.endswith('node'): fileobj.contents = node.as_json() elif filepath.endswith('definition'): fileobj.contents = definitions_file.as_yaml() elif filepath.endswith('attributes'): fileobj.contents = attributes_file.as_yaml() return fileobj filestore.return_value.get_file = Mock(side_effect=get_file) ztpserver.controller.create_file_store = filestore ztpserver.neighbordb.load_pattern = Mock() cfg = {'return_value.match_node.return_value': True} ztpserver.neighbordb.load_pattern.configure_mock(**cfg) url = '/nodes/%s' % node.systemmac request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/json') attrs = resp.json['actions'][0]['attributes'] self.assertFalse('variables' in attrs) self.assertFalse('foo' in attrs) self.assertEqual(attrs['url'], l_attr_url)
def test_get_definition_w_attributes_no_substitution( self, m_load_pattern, m_repository): node = create_node() g_attr_foo = random_string() attributes_file = create_attributes() attributes_file.add_attribute('variables', {'foo': g_attr_foo}) l_attr_url = random_string() definitions_file = create_definition() definitions_file.add_attribute('foo', random_string()) definitions_file.add_action(name='dummy action', attributes=dict(url=l_attr_url)) cfg = dict() def m_get_file(arg): m_file_object = Mock() if arg.endswith('.node'): m_file_object.read.return_value = node.as_dict() elif arg.endswith('definition'): m_file_object.read.return_value = definitions_file.as_dict() elif arg.endswith('attributes'): m_file_object.read.return_value = attributes_file.as_dict() elif arg.endswith('startup-config'): raise ztpserver.repository.FileObjectNotFound return m_file_object cfg['return_value.get_file'] = Mock(side_effect=m_get_file) cfg['return_value.match_node.return_value'] = True m_repository.configure_mock(**cfg) url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) attrs = resp.json['actions'][0]['attributes'] self.assertFalse('variables' in attrs) self.assertFalse('foo' in attrs) self.assertEqual(attrs['url'], l_attr_url)
def test_do_resources_success(self): var_foo = random_string() ztpserver.controller.resources = Mock(return_value=dict(foo=var_foo)) definition = create_definition() definition.add_action(name='dummy action', attributes=dict(foo=random_string())) response = dict(definition=definition.as_dict()) controller = ztpserver.controller.NodesController() (resp, state) = controller.do_resources(response, node=Mock(), resource=random_string()) self.assertEqual(state, 'finalize_response') self.assertIsInstance(resp, dict) foo = resp['definition']['actions'][0]['attributes']['foo'] self.assertEqual(foo, var_foo)
def test_do_substitution_success(self): defattrs = dict(foo='$foo') definition = create_definition() definition.add_attribute('foo', 'bar') definition.add_action(name='dummy action', attributes=defattrs) response = dict(definition=definition.as_dict()) controller = ztpserver.controller.NodesController() (resp, state) = controller.do_substitution(response, resource=random_string()) self.assertEqual(state, 'do_resources') self.assertIsInstance(resp, dict) foo = resp['definition']['actions'][0]['attributes']['foo'] self.assertEqual(foo, 'bar')
def test_get_definition_w_attributes_no_substitution(self, m_load_pattern, m_repository): node = create_node() g_attr_foo = random_string() attributes_file = create_attributes() attributes_file.add_attribute('variables', {'foo': g_attr_foo}) l_attr_url = random_string() definitions_file = create_definition() definitions_file.add_attribute('foo', random_string()) definitions_file.add_action(name='dummy action', attributes=dict(url=l_attr_url)) cfg = dict() def m_get_file(arg): m_file_object = Mock() if arg.endswith('.node'): m_file_object.read.return_value = node.as_dict() elif arg.endswith('definition'): m_file_object.read.return_value = definitions_file.as_dict() elif arg.endswith('attributes'): m_file_object.read.return_value = attributes_file.as_dict() elif arg.endswith('startup-config'): raise ztpserver.repository.FileObjectNotFound return m_file_object cfg['return_value.get_file'] = Mock(side_effect=m_get_file) cfg['return_value.match_node.return_value'] = True m_repository.configure_mock(**cfg) url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) attrs = resp.json['actions'][0]['attributes'] self.assertFalse('variables' in attrs) self.assertFalse('foo' in attrs) self.assertEqual(attrs['url'], l_attr_url)
def test_get_startup_config_success(self): resource = random_string() ztpserver.controller.create_file_store = Mock() action_name = random_string() action = {'name': action_name, 'action': 'replace_config'} ztpserver.neighbordb.replace_config_action = Mock(return_value=action) definition = create_definition() definition.name = random_string() response = dict(definition=definition.as_dict()) controller = ztpserver.controller.NodesController() (resp, state) = controller.get_startup_config(response, resource=resource) self.assertEqual(state, 'do_actions') self.assertIsInstance(resp, dict) self.assertTrue(resp['get_startup_config']) self.assertTrue(resp['definition'], definition.name) self.assertEqual(resp['definition']['actions'][0]['name'], action_name)
def test_get_definition_success(self): node = create_node() definition = create_definition() filestore = Mock() filestore.return_value.get_file.return_value = \ Mock(contents=definition.as_yaml()) ztpserver.controller.create_file_store = filestore controller = ztpserver.controller.NodesController() (resp, state) = controller.get_definition(dict(), resource=node.systemmac) filepath = '%s/%s' % (node.systemmac, ztpserver.controller.DEFINITION_FN) filestore.return_value.get_file.assert_called_with(filepath) self.assertEqual(state, 'do_validation') self.assertIsInstance(resp, dict) self.assertEqual(resp['definition'], definition.as_dict())
def test_post_node_success(self): node = create_node() definition_file = create_definition() definition_file.add_action() filestore = Mock() filestore.return_value.exists.return_value = False filestore.return_value.get_file.return_value.contents = \ definition_file.as_yaml() ztpserver.controller.create_file_store = filestore ztpserver.neighbordb.topology.match_node = Mock(return_value=[Mock()]) request = Request.blank('/nodes', body=node.as_json(), method='POST', headers=ztp_headers()) resp = request.get_response(ztpserver.controller.Router()) location = 'http://localhost/nodes/%s' % node.systemmac self.assertEqual(resp.status_code, 201) self.assertEqual(resp.location, location)
def test_get_startup_config_w_validation_success(self, m_load_pattern, m_repository, m_create_node): definition = create_definition() definition.add_action() node = create_node() cfg = dict() def m_get_file(arg): fileobj = Mock() if arg.endswith('.node'): fileobj.read.return_value = node.as_dict() elif arg.endswith('startup-config'): fileobj.read.return_value = random_string() elif arg.endswith('pattern'): fileobj.read.return_value = random_string() else: raise ztpserver.repository.FileObjectNotFound return fileobj cfg['return_value.get_file'] = Mock(side_effect=m_get_file) m_repository.configure_mock(**cfg) cfg = {'return_value.match_node.return_value': True} m_load_pattern.configure_mock(**cfg) url = '/nodes/%s' % node.serialnumber request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, constants.HTTP_STATUS_OK) self.assertEqual(resp.content_type, constants.CONTENT_TYPE_JSON) self.assertIsInstance(json.loads(resp.body), dict)
def test_get_definition_w_validation_failure(self): ztpserver.config.runtime.set_value(\ 'disable_topology_validation', False, 'default') node = create_node() definitions_file = create_definition() definitions_file.add_action() filestore = Mock() ztpserver.controller.create_file_store = filestore def get_file(filepath): fileobj = Mock() if filepath.endswith('node'): fileobj.contents = node.as_json() elif filepath.endswith('definition'): fileobj.contents = definitions_file.as_yaml() else: type(fileobj).contents = mock.PropertyMock(side_effect=\ ztpserver.repository.FileObjectNotFound) return fileobj filestore.return_value.get_file = Mock(side_effect=get_file) ztpserver.neighbordb.load_pattern = Mock() cfg = {'return_value.match_node.return_value': False} ztpserver.neighbordb.load_pattern.configure_mock(**cfg) url = '/nodes/%s' % node.systemmac request = Request.blank(url, method='GET') resp = request.get_response(ztpserver.controller.Router()) self.assertEqual(resp.status_code, 400) self.assertEqual(resp.content_type, 'text/html') self.assertEqual(resp.body, str())