def test_superseded(self): """Tests successfully calling the recipe details view for superseded recipes.""" graph1 = RecipeGraph() graph1.add_job('kml', self.job_type1.name, self.job_type1.version) graph2 = RecipeGraph() graph2.add_job('kml', self.job_type1.name, self.job_type1.version) delta = RecipeGraphDelta(graph1, graph2) superseded_jobs = { recipe_job.job_name: recipe_job.job for recipe_job in self.recipe1_jobs } new_recipe = recipe_test_utils.create_recipe_handler( recipe_type=self.recipe_type, superseded_recipe=self.recipe1, delta=delta, superseded_jobs=superseded_jobs).recipe # Make sure the original recipe was updated url = rest_util.get_url('/recipes/%i/' % self.recipe1.id) response = self.client.generic('GET', url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.content) result = json.loads(response.content) self.assertTrue(result['is_superseded']) self.assertIsNone(result['root_superseded_recipe']) self.assertIsNotNone(result['superseded_by_recipe']) self.assertEqual(result['superseded_by_recipe']['id'], new_recipe.id) self.assertIsNotNone(result['superseded']) self.assertEqual(len(result['jobs']), 1) for recipe_job in result['jobs']: self.assertTrue(recipe_job['is_original']) # Make sure the new recipe has the expected relations url = rest_util.get_url('/recipes/%i/' % new_recipe.id) response = self.client.generic('GET', url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.content) result = json.loads(response.content) self.assertFalse(result['is_superseded']) self.assertIsNotNone(result['root_superseded_recipe']) self.assertEqual(result['root_superseded_recipe']['id'], self.recipe1.id) self.assertIsNotNone(result['superseded_recipe']) self.assertEqual(result['superseded_recipe']['id'], self.recipe1.id) self.assertIsNone(result['superseded']) self.assertEqual(len(result['jobs']), 1) for recipe_job in result['jobs']: self.assertFalse(recipe_job['is_original'])
def get_graph(self): """Returns the recipe graph for this definition :returns: The recipe graph :rtype: :class:`recipe.handlers.graph.RecipeGraph` """ graph = RecipeGraph() for input_name in self._inputs_by_name: input_dict = self._inputs_by_name[input_name] input_type = input_dict['type'] required = input_dict['required'] recipe_input = None if input_type == 'property': recipe_input = PropertyInput(input_name, required) elif input_type == 'file': recipe_input = FileInput(input_name, required) elif input_type == 'files': recipe_input = FilesInput(input_name, required) graph.add_input(recipe_input) for job_name in self._jobs_by_name: job_dict = self._jobs_by_name[job_name] job_type = job_dict['job_type'] job_type_name = job_type['name'] job_type_version = job_type['version'] graph.add_job(job_name, job_type_name, job_type_version) for recipe_input_dict in job_dict['recipe_inputs']: recipe_input_name = recipe_input_dict['recipe_input'] job_input_name = recipe_input_dict['job_input'] graph.add_recipe_input_connection(recipe_input_name, job_name, job_input_name) for job_name in self._jobs_by_name: job_dict = self._jobs_by_name[job_name] for dependency_dict in job_dict['dependencies']: dependency_name = dependency_dict['name'] dependency_connections = [] for conn_dict in dependency_dict['connections']: conn_input = conn_dict['input'] job_output = conn_dict['output'] dependency_connections.append((job_output, conn_input)) graph.add_dependency(dependency_name, job_name, dependency_connections) return graph
def test_superseded(self): """Tests successfully calling the recipe details view for superseded recipes.""" graph1 = RecipeGraph() graph1.add_job('kml', self.job_type1.name, self.job_type1.version) graph2 = RecipeGraph() graph2.add_job('kml', self.job_type1.name, self.job_type1.version) delta = RecipeGraphDelta(graph1, graph2) superseded_jobs = {recipe_job.job_name: recipe_job.job for recipe_job in self.recipe1_jobs} new_recipe = recipe_test_utils.create_recipe_handler( recipe_type=self.recipe_type, superseded_recipe=self.recipe1, delta=delta, superseded_jobs=superseded_jobs ).recipe # Make sure the original recipe was updated url = '/recipes/%i/' % self.recipe1.id response = self.client.generic('GET', url) result = json.loads(response.content) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue(result['is_superseded']) self.assertIsNone(result['root_superseded_recipe']) self.assertIsNotNone(result['superseded_by_recipe']) self.assertEqual(result['superseded_by_recipe']['id'], new_recipe.id) self.assertIsNotNone(result['superseded']) self.assertEqual(len(result['jobs']), 1) for recipe_job in result['jobs']: self.assertTrue(recipe_job['is_original']) # Make sure the new recipe has the expected relations url = '/recipes/%i/' % new_recipe.id response = self.client.generic('GET', url) result = json.loads(response.content) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertFalse(result['is_superseded']) self.assertIsNotNone(result['root_superseded_recipe']) self.assertEqual(result['root_superseded_recipe']['id'], self.recipe1.id) self.assertIsNotNone(result['superseded_recipe']) self.assertEqual(result['superseded_recipe']['id'], self.recipe1.id) self.assertIsNone(result['superseded']) self.assertEqual(len(result['jobs']), 1) for recipe_job in result['jobs']: self.assertFalse(recipe_job['is_original'])
def get_graph(self): """Returns the recipe graph for this definition :returns: The recipe graph :rtype: :class:`recipe.handlers.graph.RecipeGraph` """ graph = RecipeGraph() for input_file in self._get_seed_input_files(): if input_file.multiple: graph_input = FilesInput(input_file.name, input_file.required) else: graph_input = FileInput(input_file.name, input_file.required) graph.add_input(graph_input) for input_json in self._get_seed_input_json(): graph.add_input(PropertyInput(input_json.name, input_json.required)) for job_name in self._jobs_by_name: job_dict = self._jobs_by_name[job_name] job_type = job_dict['job_type'] job_type_name = job_type['name'] job_type_version = job_type['version'] graph.add_job(job_name, job_type_name, job_type_version) for recipe_input_dict in job_dict['recipe_inputs']: recipe_input_name = recipe_input_dict['recipe_input'] job_input_name = recipe_input_dict['job_input'] graph.add_recipe_input_connection(recipe_input_name, job_name, job_input_name) for job_name in self._jobs_by_name: job_dict = self._jobs_by_name[job_name] for dependency_dict in job_dict['dependencies']: dependency_name = dependency_dict['name'] dependency_connections = [] for conn_dict in dependency_dict['connections']: conn_input = conn_dict['input'] job_output = conn_dict['output'] dependency_connections.append((job_output, conn_input)) graph.add_dependency(dependency_name, job_name, dependency_connections) return graph