Example #1
0
def create_recipe_handler(recipe_type=None,
                          data=None,
                          event=None,
                          superseded_recipe=None,
                          delta=None,
                          superseded_jobs=None):
    """Creates a recipe along with its declared jobs for unit testing

    :returns: The recipe handler with created recipe and jobs
    :rtype: :class:`recipe.handlers.handler.RecipeHandler`
    """

    if not recipe_type:
        recipe_type = create_recipe_type()
    if not data:
        data = {}
    if not isinstance(data, LegacyRecipeData):
        data = LegacyRecipeData(data)
    if not event:
        event = trigger_test_utils.create_trigger_event()
    if superseded_recipe and not delta:
        delta = RecipeGraphDelta(RecipeGraph(), RecipeGraph())

    return Recipe.objects.create_recipe_old(
        recipe_type,
        data,
        event,
        superseded_recipe=superseded_recipe,
        delta=delta,
        superseded_jobs=superseded_jobs)
Example #2
0
    def test_convert_diff_to_v6_empty(self):
        """Tests calling convert_diff_to_v6() with an empty diff"""

        # Try diff with empty graphs
        graph_a = RecipeGraph()
        graph_b = RecipeGraph()
        diff = RecipeGraphDelta(graph_a, graph_b)
        json = convert_diff_to_v6(diff)
        RecipeDiffV6(diff=json.get_dict(), do_validate=True)  # Revalidate
Example #3
0
    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
Example #4
0
    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'])
Example #5
0
    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
Example #6
0
    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'])
Example #7
0
    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