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()