class RpmPropagationHandler(BaseHandler):
    repoPropagationService = RepoPropagationService()
    audit = RepoAuditService()

    def _validate_post_data(self, data):
        if not data.has_key(SOURCE_KEY) or not data.has_key(DESTINATION_KEY):
            raise ValidationException(
                '"{0}" and "{1}" attributes must be set.'.format(
                    SOURCE_KEY, DESTINATION_KEY))

        if not re.match(r".+/.+/.+", data[SOURCE_KEY]):
            raise ValidationException(
                '{0} format is not valid. (repo_name/architecture/rpm-name)'.
                format(SOURCE_KEY))

        destination_repo = data[DESTINATION_KEY]
        if '/' in destination_repo or str(destination_repo).startswith('.'):
            raise ValidationException(
                '{0} must not contain slashes.'.format(DESTINATION_KEY))

    def create(self, request):
        try:
            data = request.POST

            self._validate_post_data(data)

            source_repo, package_architecture, package_name = data[
                SOURCE_KEY].split('/')
            destination_repo = data[DESTINATION_KEY]

            propagated_file_name = self.repoPropagationService.propagatePackage(
                package_name, source_repo, destination_repo,
                package_architecture)

            self.audit.log_action(
                "propagated rpm %s/%s from %s to %s" %
                (package_architecture, package_name, source_repo,
                 destination_repo), request)

            resp = rc.CREATED
            resp['Location'] = os.path.join('/repo', destination_repo,
                                            package_architecture,
                                            propagated_file_name)

            return resp

        except BaseException as e:
            return self.convert_exception_to_response(e)

    def convert_exception_to_response(self, exception):
        """
            @return: BAD_REQUEST HTTP response with error message
        """
        resp = rc.BAD_REQUEST
        error_message = str(exception)
        stack_trace = traceback.format_exc()
        resp.content = "Message: {0}.\nTrace: {1}.".format(
            error_message, stack_trace)
        return resp
class RepoPropagationHandler(BaseHandler):
    repoPropagationService = RepoPropagationService()
    repoAuditService = RepoAuditService()

    def create(self, request):
        try:
            data = request.POST

            self._validate_post_data(data)

            source_repository = data[SOURCE_KEY]
            destination_repository = data[DESTINATION_KEY]

            propagated_packages = self.repoPropagationService.propagate_repository(source_repository, destination_repository)
            message = "Propagated repository {0} to {1}, packages: {2}".format(source_repository, destination_repository, propagated_packages)
            self.repoAuditService.log_action(message, request)

            return rc.CREATED

        except BaseException as exception:
            return self.convert_exception_to_response(exception)

    def _validate_post_data(self, data):
        self._validate_repository_parameter(SOURCE_KEY, data)
        self._validate_repository_parameter(DESTINATION_KEY, data)

    def _validate_repository_parameter(self, parameter_name, data):
        if not data.has_key(parameter_name):
            raise ValidationException('"{0}" parameter must be set.'.format(parameter_name))

        repository_name = data[parameter_name]
        if '/' in repository_name or str(repository_name).startswith('.'):
            raise ValidationException(
                '{0} repository name {1} is not valid: must not contain "/" or start with "."'.format(parameter_name, repository_name))

    def convert_exception_to_response(self, exception):
        """
            @return: BAD_REQUEST HTTP response with error message
        """
        resp = rc.BAD_REQUEST
        error_message = str(exception)
        stack_trace = traceback.format_exc()
        resp.content = "Message: {0}.\nTrace: {1}.".format(error_message, stack_trace)
        return resp
 def setUp(self):
     self.service = RepoPropagationService()