request_messenger.py (7335B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\character\title\repository\message_bus\request_messenger.py 2 import logging 3 import httplib 4 from carbon.common.script.sys.serviceConst import ROLE_QA 5 from character.client.identifier import CharacterIdentifier 6 from cosmetics.client.character.title.const import LOGGER_NAME 7 from cosmetics.client.character.title.model.definition.identifier import TitleIdentifier 8 from cosmetics.client.character.title.model.state.equipped import EquippedTitleStateAttributes 9 from eveProto.generated.eve_public.public_pb2 import Page as ProtoPage 10 from eveProto.generated.eve_public.cosmetic.character.title.api.requests_pb2 import GetEquippedForCharacterRequest, GetEquippedForCharacterResponse, EquipRequest, EquipResponse, UnequipRequest, UnequipResponse, GetOwnedRequest, GetOwnedResponse 11 from eveProto.generated.eve_public.cosmetic.character.title.api.admin.requests_pb2 import GrantRequest, GrantResponse, RevokeRequest, RevokeResponse 12 from publicGateway.gateway import PublicGateway 13 from stackless_response_router.exceptions import TimeoutException, UnpackException 14 from cosmetics.client.character.title.api.error import ServiceUnavailableError, GenericInternalServerError, GenericError, GenericNotFoundError 15 logger = logging.getLogger(LOGGER_NAME) 16 17 class TitleRequestMessenger(object): 18 19 def __init__(self, public_gateway): 20 self.public_gateway = public_gateway 21 22 def get_owned_titles_request(self, page): 23 request = GetOwnedRequest(page=ProtoPage(size=100, token=page)) 24 info_log = 'Request: Get Owned Request: {request}\n'.format(request=request) 25 status_code, payload = self._send_character_request(request, response_class=GetOwnedResponse, info_log=info_log) 26 if status_code == httplib.OK: 27 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 28 owned_titles = [ TitleIdentifier.from_proto(x) for x in payload.titles ] 29 next_page_token = payload.next_page.token if payload.next_page.token else None 30 logger.info(info_log) 31 return (owned_titles, next_page_token) 32 self._raise_error_and_log(info_log, status_code) 33 34 def get_equipped_title_request(self, character_identifier): 35 request = GetEquippedForCharacterRequest(character=CharacterIdentifier.to_proto(character_identifier)) 36 info_log = 'Request: Get Equipped For Character Request: {request}\n'.format(request=request) 37 status_code, payload = self._send_user_request(request, response_class=GetEquippedForCharacterResponse, info_log=info_log) 38 if status_code == httplib.OK: 39 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 40 equipped_title = EquippedTitleStateAttributes.from_response_proto(payload) 41 logger.info(info_log) 42 return equipped_title 43 self._raise_error_and_log(info_log, status_code) 44 45 def equip_title_request(self, title_identifier): 46 request = EquipRequest(title=TitleIdentifier.to_proto(title_identifier)) 47 info_log = 'Request: Equip Request: {request}\n'.format(request=request) 48 status_code, payload = self._send_character_request(request, response_class=EquipResponse, info_log=info_log) 49 if status_code == httplib.OK: 50 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 51 logger.info(info_log) 52 else: 53 self._raise_error_and_log(info_log, status_code) 54 55 def unequip_title_request(self): 56 request = UnequipRequest() 57 info_log = 'Request: Unequip Request: {request}\n'.format(request=request) 58 status_code, payload = self._send_character_request(request, response_class=UnequipResponse, info_log=info_log) 59 if status_code == httplib.OK: 60 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 61 logger.info(info_log) 62 else: 63 self._raise_error_and_log(info_log, status_code) 64 65 def admin_grant_request(self, title_identifier): 66 if not session.role & ROLE_QA: 67 return 68 request = GrantRequest(id=TitleIdentifier.to_proto(title_identifier)) 69 info_log = 'Admin Request: Grant Request: {request}\n'.format(request=request) 70 status_code, payload = self._send_character_request(request, response_class=GrantResponse, info_log=info_log) 71 if status_code == httplib.OK: 72 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 73 logger.info(info_log) 74 else: 75 self._raise_error_and_log(info_log, status_code) 76 77 def admin_revoke_request(self, title_identifier): 78 if not session.role & ROLE_QA: 79 return 80 request = RevokeRequest(id=TitleIdentifier.to_proto(title_identifier)) 81 info_log = 'Admin Request: Revoke Request: {request}\n'.format(request=request) 82 status_code, payload = self._send_character_request(request, response_class=RevokeResponse, info_log=info_log) 83 if status_code == httplib.OK: 84 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 85 logger.info(info_log) 86 else: 87 self._raise_error_and_log(info_log, status_code) 88 89 def _send_character_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1): 90 try: 91 response_primitive, response = self.public_gateway.send_blocking_character_request_and_receive_response(request_payload=request, expected_response_class=response_class, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=1) 92 except (TimeoutException, UnpackException) as exc: 93 error_info = 'ERROR: %s' % exc.__class__.__name__ 94 info_log += error_info 95 logger.info(info_log) 96 request_cls = request.__class__.__name__ 97 raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc)) 98 99 return (response_primitive.status_code, response) 100 101 def _send_user_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1): 102 try: 103 response_primitive, response = self.public_gateway.send_blocking_user_request_and_receive_response(request_payload=request, expected_response_class=response_class, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=1) 104 except (TimeoutException, UnpackException) as exc: 105 error_info = 'ERROR: %s' % exc.__class__.__name__ 106 info_log += error_info 107 logger.info(info_log) 108 request_cls = request.__class__.__name__ 109 raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc)) 110 111 return (response_primitive.status_code, response) 112 113 @staticmethod 114 def _raise_error_and_log(info_text, status_code): 115 info_text += 'ERROR: %s(%s)\n' % (httplib.responses[status_code], status_code) 116 logger.info(info_text) 117 if status_code == httplib.INTERNAL_SERVER_ERROR: 118 raise GenericInternalServerError(info_text) 119 if status_code == httplib.NOT_FOUND: 120 raise GenericNotFoundError(info_text) 121 raise GenericError(info_text)