def poll(): """ Callback function that polls for new tasks based on a schedule. """ logging.info("Polling for new task.") deployment_id = helper.get_deployment_id() # If the deployment is not registered, skip. if not deployment_id: return # Send request to AppScale Portal. url = "{0}{1}".format(hermes_constants.PORTAL_URL, hermes_constants.PORTAL_POLL_PATH) data = json.dumps({ JSONTags.DEPLOYMENT_ID: deployment_id }) request = helper.create_request(url=url, method='POST', body=data) response = helper.urlfetch(request) try: data = json.loads(response.body) except (TypeError, ValueError) as error: logging.error("Cannot parse response from url '{0}'. Error: {1}". format(url, str(error))) return # Verify all necessary fields are present in the request. if not set(data.keys()).issuperset(set(hermes_constants.REQUIRED_KEYS)) or \ None in data.values(): logging.error("Missing args in response: {0}".format(response)) return logging.debug("Task to run: {0}".format(data)) logging.info("Redirecting task request to TaskHandler.") url = "{0}{1}".format(hermes_constants.HERMES_URL, TaskHandler.PATH) request = helper.create_request(url, method='POST', body=data) # The poller can move forward without waiting for a response here. helper.urlfetch_async(request)
def poll(): """ Callback function that polls for new tasks based on a schedule. """ deployment_id = helper.get_deployment_id() # If the deployment is not registered, skip. if not deployment_id: return # If we can't reach the backup and recovery services, skip. nodes = helper.get_node_info() http_client = tornado.httpclient.HTTPClient() for node in nodes: br_host = node[helper.NodeInfoTags.HOST] request = tornado.httpclient.HTTPRequest(br_host) try: response = http_client.fetch(request) if json.loads(response.body)['status'] != 'up': logging.warn('Backup and Recovery service at {} is not up.' .format(br_host)) return except (socket.error, ValueError): logging.exception('Backup and Recovery service at {} is not up.' .format(br_host)) return logging.info("Polling for new task.") # Send request to AppScale Portal. url = "{0}{1}".format(hermes_constants.PORTAL_URL, hermes_constants.PORTAL_POLL_PATH) data = urllib.urlencode({JSONTags.DEPLOYMENT_ID: deployment_id}) request = helper.create_request(url=url, method='POST', body=data) response = helper.urlfetch(request) if not response[JSONTags.SUCCESS]: logging.error("Inaccessible resource: {}".format(url)) return try: data = json.loads(response[JSONTags.BODY]) except (TypeError, ValueError) as error: logging.error("Cannot parse response from url '{0}'. Error: {1}". format(url, str(error))) return if data == {}: # If there's no task to perform. return # Verify all necessary fields are present in the request. if not set(data.keys()).issuperset(set(hermes_constants.REQUIRED_KEYS)): logging.error("Missing args in response: {0}".format(response)) return logging.debug("Task to run: {0}".format(data)) logging.info("Redirecting task request to TaskHandler.") url = "{0}{1}".format(hermes_constants.HERMES_URL, TaskHandler.PATH) request = helper.create_request(url, method='POST', body=json.dumps(data)) # The poller can move forward without waiting for a response here. helper.urlfetch_async(request)
def poll(): """ Callback function that polls for new tasks based on a schedule. """ logging.info("Polling for new task.") deployment_id = helper.get_deployment_id() # If the deployment is not registered, skip. if not deployment_id: return # Send request to AppScale Portal. url = "{0}{1}".format(hermes_constants.PORTAL_URL, hermes_constants.PORTAL_POLL_PATH) data = json.dumps({JSONTags.DEPLOYMENT_ID: deployment_id}) request = helper.create_request(url=url, method='POST', body=data) response = helper.urlfetch(request) try: data = json.loads(response.body) except (TypeError, ValueError) as error: logging.error( "Cannot parse response from url '{0}'. Error: {1}".format( url, str(error))) return # Verify all necessary fields are present in the request. if not set(data.keys()).issuperset(set(hermes_constants.REQUIRED_KEYS)) or \ None in data.values(): logging.error("Missing args in response: {0}".format(response)) return logging.debug("Task to run: {0}".format(data)) logging.info("Redirecting task request to TaskHandler.") url = "{0}{1}".format(hermes_constants.HERMES_URL, TaskHandler.PATH) request = helper.create_request(url, method='POST', body=data) # The poller can move forward without waiting for a response here. helper.urlfetch_async(request)