예제 #1
0
    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))
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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)
예제 #8
0
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)
예제 #9
0
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.")
예제 #10
0
def raise_if_errors(response, module):
    errors = navigate_hash(response, [])
    if errors:
        module.fail_json(msg=navigate_hash(response, []))