Ejemplo n.º 1
0
def mock_client_fetch_jwt_bundles(mocker):
    jwt_bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.prod': JWKS_2_EC_1_RSA_KEYS
    }
    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=[
            workload_pb2.JWTBundlesResponse(bundles=jwt_bundles),
            workload_pb2.JWTBundlesResponse(bundles=jwt_bundles),
        ])
def test_watch_jwt_bundle_no_retry_on_grpc_error_no_call(mocker):
    grpc_error = grpc.RpcError
    jwt_bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.prod': JWKS_2_EC_1_RSA_KEYS
    }

    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        side_effect=[
            grpc_error,
            delayed_responses(
                [workload_pb2.JWTBundlesResponse(bundles=jwt_bundles)]),
        ])

    expected_error = FetchJwtBundleError(
        'Cannot process response from Workload API.')
    event = threading.Event()
    response_holder = ResponseHolder()

    WORKLOAD_API_CLIENT.watch_jwt_bundles(
        on_success=lambda r: handle_success(r, response_holder, event),
        on_error=lambda e: handle_error(e, response_holder, event),
    )

    event.wait(3)  # add timeout to prevent test from hanging

    assert not response_holder.success
    assert response_holder.error
    assert_error(response_holder.error, expected_error)
def test_watch_jwt_bundle_success(mocker):
    jwt_bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.prod': JWKS_2_EC_1_RSA_KEYS
    }
    jwt_bundles_2 = {'domain.dev': JWKS_1_EC_KEY}

    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=delayed_responses([
            workload_pb2.JWTBundlesResponse(bundles=jwt_bundles),
            workload_pb2.JWTBundlesResponse(bundles=jwt_bundles_2),
        ]))

    event = threading.Event()
    response_holder = ResponseHolder()

    WORKLOAD_API_CLIENT.watch_jwt_bundles(
        on_success=lambda r: handle_success(r, response_holder, event),
        on_error=lambda e: handle_error(e, response_holder, event),
    )

    event.wait(3)  # add timeout to prevent test from hanging

    assert not response_holder.error
    jwt_bundle_set = response_holder.success
    assert jwt_bundle_set
    jwt_bundle_1 = jwt_bundle_set.get(TrustDomain.parse('example.org'))
    assert jwt_bundle_1
    assert len(jwt_bundle_1.jwt_authorities()) == 1

    jwt_bundle_2 = jwt_bundle_set.get(TrustDomain.parse('domain.prod'))
    assert jwt_bundle_2
    assert len(jwt_bundle_2.jwt_authorities()) == 3

    # Wait to receive the second response from delayed_responses()
    time.sleep(1)

    assert not response_holder.error
    jwt_bundle_set = response_holder.success
    jwt_bundle = jwt_bundle_set.get(TrustDomain.parse('domain.dev'))
    assert jwt_bundle
    assert len(jwt_bundle.jwt_authorities()) == 1
def test_fetch_jwt_bundles_empty_response(mocker):
    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=iter([
            workload_pb2.JWTBundlesResponse(bundles={}, ),
        ]))

    with pytest.raises(FetchJwtBundleError) as exc_info:
        WORKLOAD_API_CLIENT.fetch_jwt_bundles()

    assert (str(exc_info.value) ==
            'Error fetching JWT Bundle: JWT Bundles response is empty.')
def test_fetch_jwt_bundles_error_parsing_jwks(mocker):
    bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.test': JWKS_MISSING_KEY_ID
    }

    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=iter([
            workload_pb2.JWTBundlesResponse(bundles=bundles, ),
        ]))

    with pytest.raises(FetchJwtBundleError) as exc_info:
        WORKLOAD_API_CLIENT.fetch_jwt_bundles()

    assert (
        str(exc_info.value) ==
        'Error fetching JWT Bundle: Error parsing JWT bundle: Error adding authority from JWKS: keyID cannot be empty.'
    )
def test_fetch_jwt_bundles(mocker):
    bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.test': JWKS_2_EC_1_RSA_KEYS
    }

    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=iter([
            workload_pb2.JWTBundlesResponse(bundles=bundles, ),
        ]))

    jwt_bundle_set = WORKLOAD_API_CLIENT.fetch_jwt_bundles()

    jwt_bundle = jwt_bundle_set.get(TrustDomain.parse('example.org'))
    assert jwt_bundle
    assert len(jwt_bundle.jwt_authorities()) == 1

    federated_jwt_bundle = jwt_bundle_set.get(TrustDomain.parse('domain.test'))
    assert federated_jwt_bundle
    assert len(federated_jwt_bundle.jwt_authorities()) == 3
Ejemplo n.º 7
0
def test_get_jwt_bundle_exception(mocker):

    jwt_bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.prod': JWKS_2_EC_1_RSA_KEYS
    }
    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        return_value=[
            workload_pb2.JWTBundlesResponse(bundles=jwt_bundles),
        ],
        side_effect=Exception('Mocked Error'),
    )

    jwt_source = DefaultJwtSource(WORKLOAD_API_CLIENT)

    with pytest.raises(JwtSourceError) as exception:
        _ = jwt_source.get_jwt_bundle(TrustDomain.parse('example.org'))

    assert (str(exception.value) ==
            'JWT Source error: Cannot get JWT Bundle: source is closed.')
def test_watch_jwt_bundle_retry_on_grpc_error(mocker):
    grpc_error = FakeCall()
    jwt_bundles = {
        'example.org': JWKS_1_EC_KEY,
        'domain.prod': JWKS_2_EC_1_RSA_KEYS
    }

    WORKLOAD_API_CLIENT._spiffe_workload_api_stub.FetchJWTBundles = mocker.Mock(
        side_effect=[
            grpc_error,
            delayed_responses(
                [workload_pb2.JWTBundlesResponse(bundles=jwt_bundles)]),
        ])

    expected_error = FetchJwtBundleError(grpc_error.details())
    event = threading.Event()
    response_holder = ResponseHolder()

    WORKLOAD_API_CLIENT.watch_jwt_bundles(
        on_success=lambda r: handle_success(r, response_holder, event),
        on_error=lambda e: assert_error(e, expected_error),
    )

    event.wait(3)  # add timeout to prevent test from hanging
    # Wait to receive the response from delayed_responses()
    time.sleep(1)

    jwt_bundle_set = response_holder.success
    assert jwt_bundle_set
    jwt_bundle_1 = jwt_bundle_set.get(TrustDomain.parse('example.org'))
    assert jwt_bundle_1
    assert len(jwt_bundle_1.jwt_authorities()) == 1

    jwt_bundle_2 = jwt_bundle_set.get(TrustDomain.parse('domain.prod'))
    assert jwt_bundle_2
    assert len(jwt_bundle_2.jwt_authorities()) == 3