def append_underlying_workflow_desc(self, describe_output, region):
        """
        :param region: region name
        :type region: string
        :param describe_output: description of a global workflow
        :type describe_output: dict
        :returns: object description of the global workflow
        :rtype: : dict

        Appends stages, inputs, outputs and other workflow-specific metadata to a global workflow describe output.

        Note: global workflow description does not contain functional metadata (stages, IO), since this data
        is region-specific (due to applets and bound inputs) and so reside only in region-specific underlying
        workflows. We add them to global_workflow_desc so that it can be used for a workflow or a global workflow
        """
        assert(describe_output is None or describe_output.get('class') == 'globalworkflow')

        underlying_workflow_desc = self.describe_underlying_workflow(region,
                                                                     describe_output=describe_output)
        for field in ['inputs', 'outputs', 'inputSpec', 'outputSpec', 'stages']:
            describe_output[field] = underlying_workflow_desc[field]
        return describe_output
:param region: region name
        :type region: string
        :param describe_output: description of a global workflow
        :type describe_output: dict
        :returns: object description of the global workflow
        :rtype: : dict

        Appends stages, inputs, outputs and other workflow-specific metadata to a global workflow describe output.

        Note: global workflow description does not contain functional metadata (stages, IO), since this data
        is region-specific (due to applets and bound inputs) and so reside only in region-specific underlying
        workflows. We add them to global_workflow_desc so that it can be used for a workflow or a global workflow