def test_navigate_hash(self): value = { 'foo': { 'quiet': { 'tree': 'test' }, } } self.assertEquals(navigate_hash(value, ["foo", "quiet", "tree"]), "test") self.assertEquals(navigate_hash(value, ["foo", "q", "tree"], 123), 123) self.assertIsNone(navigate_hash(value, [], 123))
def resource_get_url(session, wait_done): combined = session.module.params.copy() combined['op_id'] = navigate_hash(wait_done, ['vpc', 'id']) url = 'vpcs/{op_id}'.format(**combined) endpoint = session.get_service_endpoint('vpc') return endpoint + url
def return_if_object(module, response, success_codes, has_content=True): code = response.status_code # If not found, return nothing. if code == 404: return None success_codes = [200, 201, 202, 203, 204, 205, 206, 207, 208, 226] # If no content, return nothing. if code in success_codes and not has_content: return None result = None try: result = response.json() except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: module.fail_json(msg="Invalid JSON response with error: %s" % inst) if code not in success_codes: msg = navigate_hash(result, ['message']) if msg: module.fail_json(msg=msg) else: module.fail_json(msg="operation failed, return code=%d" % code) return result
def get_resource(config, result): module = config.module client = config.client(get_region(module), "smn", "project") d = {'topic_urn': navigate_hash(result, ['topic_urn'])} url = build_path(module, 'notifications/topics/{topic_urn}', d) return fetch_resource(module, client, url)
def get_resource(session, result): combined = session.module.params.copy() combined['topic_urn'] = navigate_hash(result, ['topic_urn']) url = 'notifications/topics/{topic_urn}'.format(**combined) e = session.get_service_endpoint('compute') url = e.replace("ecs", "smn") + url return fetch_resource(session, url)
def wait_for_operation(session, op_type, op_result): op_id = navigate_hash(op_result, ['vpc', 'id']) url = async_op_url(session, {'op_id': op_id}) timeout = 60 * int(session.module.params['timeouts'][op_type].rstrip('m')) states = { 'create': { 'allowed': ['CREATING', 'DONW', 'OK'], 'complete': ['OK'], }, 'update': { 'allowed': ['PENDING_UPDATE', 'DONW', 'OK'], 'complete': ['OK'], } } return wait_for_completion(url, timeout, states[op_type]['allowed'], states[op_type]['complete'], session)
def create(config, link): module = config.module client = config.client(get_region(module), "vpc", "project") r = None try: r = client.post(link, resource_to_create(module)) except HwcClientException as ex: msg = ("module(hwc_network_vpc): error creating " "resource, error: %s" % str(ex)) module.fail_json(msg=msg) wait_done = wait_for_operation(config, 'create', r) v = navigate_hash(wait_done, ['vpc', 'id']) url = build_path(module, 'vpcs/{op_id}', {'op_id': v}) return fetch_resource(module, client, url)
def wait_for_operation(config, op_type, op_result): module = config.module op_id = navigate_hash(op_result, ['vpc', 'id']) url = build_path(module, "vpcs/{op_id}", {'op_id': op_id}) timeout = 60 * int(module.params['timeouts'][op_type].rstrip('m')) states = { 'create': { 'allowed': ['CREATING', 'DONW', 'OK'], 'complete': ['OK'], }, 'update': { 'allowed': ['PENDING_UPDATE', 'DONW', 'OK'], 'complete': ['OK'], } } return wait_for_completion(url, timeout, states[op_type]['allowed'], states[op_type]['complete'], config)
def wait_for_completion(op_uri, timeout, allowed_states, complete_states, session): module = session.module end = time.time() + timeout while time.time() <= end: try: op_result = fetch_resource(session, op_uri) except Exception: time.sleep(1.0) continue raise_if_errors(op_result, module) status = navigate_hash(op_result, ['vpc', 'status']) if status not in allowed_states: module.fail_json(msg="Invalid async operation status %s" % status) if status in complete_states: return op_result time.sleep(1.0) module.fail_json(msg="Timeout to wait completion.")
def raise_if_errors(response, module): errors = navigate_hash(response, []) if errors: module.fail_json(msg=navigate_hash(response, []))