Search in sources :

Example 11 with Api

use of io.apiman.gateway.engine.beans.Api in project apiman by apiman.

the class DefaultEngineFactoryTest method testCreateEngine.

/**
 * Test method for {@link io.apiman.gateway.engine.impl.AbstractEngineFactory#createEngine()}.
 * @throws ExecutionException
 * @throws InterruptedException
 */
@Test
public void testCreateEngine() throws InterruptedException, ExecutionException {
    DefaultEngineFactory factory = new DefaultEngineFactory() {

        @Override
        protected IComponentRegistry createComponentRegistry(IPluginRegistry pluginRegistry) {
            return new DefaultComponentRegistry() {

                @Override
                protected void registerBufferFactoryComponent() {
                    addComponent(IBufferFactoryComponent.class, new ByteBufferFactoryComponent());
                }
            };
        }

        @Override
        protected IConnectorFactory createConnectorFactory(IPluginRegistry pluginRegistry) {
            return new IConnectorFactory() {

                @Override
                public IApiConnector createConnector(ApiRequest request, Api api, RequiredAuthType requiredAuthType, boolean hasDataPolicy, IConnectorConfig connectorConfig) {
                    Assert.assertEquals("test", api.getEndpointType());
                    Assert.assertEquals("test:endpoint", api.getEndpoint());
                    IApiConnector connector = new IApiConnector() {

                        /**
                         * @see io.apiman.gateway.engine.IApiConnector#connect(io.apiman.gateway.engine.beans.ApiRequest, io.apiman.gateway.engine.async.IAsyncResultHandler)
                         */
                        @Override
                        public IApiConnection connect(ApiRequest request, IAsyncResultHandler<IApiConnectionResponse> handler) throws ConnectorException {
                            final ApiResponse response = new ApiResponse();
                            response.setCode(200);
                            // $NON-NLS-1$
                            response.setMessage("OK");
                            mockApiConnectionResponse = new MockApiConnectionResponse() {

                                @Override
                                public void write(IApimanBuffer chunk) {
                                    handleBody(chunk);
                                }

                                @Override
                                protected void handleHead(ApiResponse head) {
                                    return;
                                }

                                @Override
                                public ApiResponse getHead() {
                                    return response;
                                }

                                @Override
                                public void end() {
                                    handleEnd();
                                }

                                @Override
                                public void transmit() {
                                    transmitHandler.handle((Void) null);
                                }

                                @Override
                                public void abort(Throwable t) {
                                }
                            };
                            IAsyncResult<IApiConnectionResponse> mockResponseResultHandler = mock(IAsyncResult.class);
                            given(mockResponseResultHandler.isSuccess()).willReturn(true);
                            given(mockResponseResultHandler.isError()).willReturn(false);
                            given(mockResponseResultHandler.getResult()).willReturn(mockApiConnectionResponse);
                            mockApiConnection = mock(MockApiConnection.class);
                            given(mockApiConnection.getHead()).willReturn(request);
                            // Handle head
                            handler.handle(mockResponseResultHandler);
                            return mockApiConnection;
                        }
                    };
                    return connector;
                }

                @Override
                public IConnectorConfig createConnectorConfig(ApiRequest request, Api api) {
                    return new TestConnectorConfigImpl();
                }
            };
        }

        @Override
        protected IDelegateFactory createLoggerFactory(IPluginRegistry pluginRegistry) {
            return null;
        }

        @Override
        protected IApiRequestPathParser createRequestPathParser(IPluginRegistry pluginRegistry) {
            return new DefaultRequestPathParser(null);
        }

        @Override
        protected void complete() {
        }
    };
    IEngine engine = factory.createEngine();
    Assert.assertNotNull(engine);
    // create a api
    Api api = new Api();
    api.setEndpointType("test");
    api.setEndpoint("test:endpoint");
    api.setOrganizationId("TestOrg");
    api.setApiId("TestApi");
    api.setVersion("1.0");
    // create a client
    Client app = new Client();
    app.setClientId("TestApp");
    app.setOrganizationId("TestOrg");
    app.setVersion("1.0");
    app.setApiKey("client-12345");
    Contract contract = new Contract();
    contract.setPlan("Gold");
    contract.setApiId("TestApi");
    contract.setApiOrgId("TestOrg");
    contract.setApiVersion("1.0");
    contract.setPolicies(policyList);
    app.addContract(contract);
    // simple api/app config
    engine.getRegistry().publishApi(api, new IAsyncResultHandler<Void>() {

        @Override
        public void handle(IAsyncResult<Void> result) {
        }
    });
    engine.getRegistry().registerClient(app, new IAsyncResultHandler<Void>() {

        @Override
        public void handle(IAsyncResult<Void> result) {
        }
    });
    ApiRequest request = new ApiRequest();
    request.setApiKey("client-12345");
    request.setApiId("TestApi");
    request.setApiOrgId("TestOrg");
    request.setApiVersion("1.0");
    request.setDestination("/");
    request.setUrl("http://localhost:9999/");
    request.setType("TEST");
    IApiRequestExecutor prExecutor = engine.executor(request, new IAsyncResultHandler<IEngineResult>() {

        // At this point, we are either saying *fail* or *response connection is ready*
        @Override
        public void handle(IAsyncResult<IEngineResult> result) {
            IEngineResult er = result.getResult();
            // No exception occurred
            Assert.assertTrue(result.isSuccess());
            // The chain evaluation succeeded
            Assert.assertNotNull(er);
            Assert.assertTrue(!er.isFailure());
            Assert.assertNotNull(er.getApiResponse());
            // $NON-NLS-1$
            Assert.assertEquals("OK", er.getApiResponse().getMessage());
            er.bodyHandler(mockBodyHandler);
            er.endHandler(mockEndHandler);
        }
    });
    prExecutor.streamHandler(new IAsyncHandler<ISignalWriteStream>() {

        @Override
        public void handle(ISignalWriteStream streamWriter) {
            streamWriter.write(mockBufferInbound);
            streamWriter.end();
        }
    });
    transmitHandler = new IAsyncHandler<Void>() {

        @Override
        public void handle(Void result) {
            // NB: This is cheating slightly for testing purposes, we don't have real async here.
            // Only now start writing stuff, so user has had opportunity to set handlers
            mockApiConnectionResponse.write(mockBufferOutbound);
            mockApiConnectionResponse.end();
        }
    };
    prExecutor.execute();
    // Request handler should receive the mock inbound buffer once only
    verify(mockApiConnection, times(1)).write(mockBufferInbound);
    // Ultimately user should receive the contrived response and end in order.
    InOrder order = inOrder(mockBodyHandler, mockEndHandler);
    order.verify(mockBodyHandler).handle(mockBufferOutbound);
    order.verify(mockEndHandler).handle((Void) null);
}
Also used : IApimanBuffer(io.apiman.gateway.engine.io.IApimanBuffer) IEngineResult(io.apiman.gateway.engine.IEngineResult) IEngine(io.apiman.gateway.engine.IEngine) IAsyncResultHandler(io.apiman.gateway.engine.async.IAsyncResultHandler) ApiRequest(io.apiman.gateway.engine.beans.ApiRequest) IApiConnectionResponse(io.apiman.gateway.engine.IApiConnectionResponse) ApiResponse(io.apiman.gateway.engine.beans.ApiResponse) RequiredAuthType(io.apiman.gateway.engine.auth.RequiredAuthType) IConnectorFactory(io.apiman.gateway.engine.IConnectorFactory) Client(io.apiman.gateway.engine.beans.Client) IApiRequestExecutor(io.apiman.gateway.engine.IApiRequestExecutor) IPluginRegistry(io.apiman.gateway.engine.IPluginRegistry) InOrder(org.mockito.InOrder) IConnectorConfig(io.apiman.gateway.engine.IConnectorConfig) ISignalWriteStream(io.apiman.gateway.engine.io.ISignalWriteStream) IApiConnector(io.apiman.gateway.engine.IApiConnector) Api(io.apiman.gateway.engine.beans.Api) Contract(io.apiman.gateway.engine.beans.Contract) Test(org.junit.Test)

Example 12 with Api

use of io.apiman.gateway.engine.beans.Api in project apiman by apiman.

the class InMemoryRegistry method getApi.

/**
 * @see io.apiman.gateway.engine.IRegistry#getApi(java.lang.String, java.lang.String, java.lang.String, io.apiman.gateway.engine.async.IAsyncResultHandler)
 */
@Override
public void getApi(String organizationId, String apiId, String apiVersion, IAsyncResultHandler<Api> handler) {
    Api api = getApiInternal(organizationId, apiId, apiVersion);
    handler.handle(AsyncResultImpl.create(api));
}
Also used : Api(io.apiman.gateway.engine.beans.Api)

Example 13 with Api

use of io.apiman.gateway.engine.beans.Api in project apiman by apiman.

the class InMemoryRegistry method getApiInternal.

/**
 * Gets an API by its unique identifying info (orgid, id, version).
 *
 * @return an Api or null if not found
 */
private Api getApiInternal(String apiOrgId, String apiId, String apiVersion) {
    String key = getApiIndex(apiOrgId, apiId, apiVersion);
    Api api;
    synchronized (mutex) {
        api = (Api) getMap().get(key);
    }
    return api;
}
Also used : Api(io.apiman.gateway.engine.beans.Api)

Example 14 with Api

use of io.apiman.gateway.engine.beans.Api in project apiman by apiman.

the class PolicyTester method publishApi.

/**
 * Publish a API configured with the correct policy and policy config.
 * @param method
 * @throws Throwable
 */
protected void publishApi(FrameworkMethod method) {
    version++;
    try {
        // Get the policy class under test.
        TestingPolicy tp = method.getMethod().getAnnotation(TestingPolicy.class);
        if (tp == null) {
            tp = getTestClass().getJavaClass().getAnnotation(TestingPolicy.class);
        }
        if (tp == null) {
            throw new Exception("Missing test annotation @TestingPolicy.");
        }
        Class<? extends IPolicy> policyUnderTest = tp.value();
        // Get the configuration JSON to use
        Configuration config = method.getMethod().getAnnotation(Configuration.class);
        if (config == null) {
            config = getTestClass().getJavaClass().getAnnotation(Configuration.class);
        }
        if (config == null) {
            throw new Exception("Missing test annotation @Configuration.");
        }
        // Get the back end API simulator to use
        BackEndApi backEnd = method.getMethod().getAnnotation(BackEndApi.class);
        if (backEnd == null) {
            backEnd = getTestClass().getJavaClass().getAnnotation(BackEndApi.class);
        }
        Class<? extends IPolicyTestBackEndApi> backEndApi;
        if (backEnd == null) {
            backEndApi = EchoBackEndApi.class;
        } else {
            backEndApi = backEnd.value();
        }
        final Set<Throwable> errorHolder = new HashSet<>();
        Policy policy = new Policy();
        policy.setPolicyImpl("class:" + policyUnderTest.getName());
        policy.setPolicyJsonConfig(getPolicyConfiguration(config));
        Api api = new Api();
        api.setEndpoint(backEndApi.getName());
        api.setEndpointType("TEST");
        api.setOrganizationId(orgId);
        api.setApiId(apiId);
        api.setVersion(String.valueOf(version));
        api.setPublicAPI(true);
        api.setApiPolicies(Collections.singletonList(policy));
        api.setParsePayload(true);
        getEngine().getRegistry().publishApi(api, new IAsyncResultHandler<Void>() {

            @Override
            public void handle(IAsyncResult<Void> result) {
                if (result.isError()) {
                    errorHolder.add(result.getError());
                }
            }
        });
        if (!errorHolder.isEmpty()) {
            throw errorHolder.iterator().next();
        }
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }
}
Also used : IPolicy(io.apiman.gateway.engine.policy.IPolicy) Policy(io.apiman.gateway.engine.beans.Policy) IOException(java.io.IOException) Api(io.apiman.gateway.engine.beans.Api) HashSet(java.util.HashSet)

Example 15 with Api

use of io.apiman.gateway.engine.beans.Api in project apiman by apiman.

the class StorageImportDispatcher method publishApis.

/**
 * Publishes any apis that were imported in the "Published" state.
 * @throws StorageException
 */
private void publishApis() throws StorageException {
    // $NON-NLS-1$
    logger.info(Messages.i18n.format("StorageExporter.PublishingApis"));
    try {
        for (EntityInfo info : apisToPublish) {
            // $NON-NLS-1$
            logger.info(Messages.i18n.format("StorageExporter.PublishingApi", info));
            ApiVersionBean versionBean = storage.getApiVersion(info.organizationId, info.id, info.version);
            Api gatewayApi = new Api();
            gatewayApi.setEndpoint(versionBean.getEndpoint());
            gatewayApi.setEndpointType(versionBean.getEndpointType().toString());
            gatewayApi.setEndpointProperties(versionBean.getEndpointProperties());
            gatewayApi.setOrganizationId(versionBean.getApi().getOrganization().getId());
            gatewayApi.setApiId(versionBean.getApi().getId());
            gatewayApi.setVersion(versionBean.getVersion());
            gatewayApi.setPublicAPI(versionBean.isPublicAPI());
            gatewayApi.setParsePayload(versionBean.isParsePayload());
            if (versionBean.isPublicAPI()) {
                List<Policy> policiesToPublish = new ArrayList<>();
                Iterator<PolicyBean> apiPolicies = storage.getAllPolicies(info.organizationId, info.id, info.version, PolicyType.Api);
                while (apiPolicies.hasNext()) {
                    PolicyBean apiPolicy = apiPolicies.next();
                    Policy policyToPublish = new Policy();
                    policyToPublish.setPolicyJsonConfig(apiPolicy.getConfiguration());
                    policyToPublish.setPolicyImpl(apiPolicy.getDefinition().getPolicyImpl());
                    policiesToPublish.add(policyToPublish);
                }
                gatewayApi.setApiPolicies(policiesToPublish);
            }
            // Publish the api to all relevant gateways
            Set<ApiGatewayBean> gateways = versionBean.getGateways();
            if (gateways == null) {
                // $NON-NLS-1$
                throw new RuntimeException("No gateways specified for api!");
            }
            for (ApiGatewayBean apiGatewayBean : gateways) {
                IGatewayLink gatewayLink = createGatewayLink(apiGatewayBean.getGatewayId());
                gatewayLink.publishApi(gatewayApi);
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : Policy(io.apiman.gateway.engine.beans.Policy) PolicyBean(io.apiman.manager.api.beans.policies.PolicyBean) ArrayList(java.util.ArrayList) IGatewayLink(io.apiman.manager.api.gateway.IGatewayLink) StorageException(io.apiman.manager.api.core.exceptions.StorageException) ImportNotNeededException(io.apiman.manager.api.exportimport.exceptions.ImportNotNeededException) PublishingException(io.apiman.gateway.engine.beans.exceptions.PublishingException) ApiGatewayBean(io.apiman.manager.api.beans.apis.ApiGatewayBean) Api(io.apiman.gateway.engine.beans.Api) ApiVersionBean(io.apiman.manager.api.beans.apis.ApiVersionBean)

Aggregations

Api (io.apiman.gateway.engine.beans.Api)41 Client (io.apiman.gateway.engine.beans.Client)16 ApiContract (io.apiman.gateway.engine.beans.ApiContract)11 Contract (io.apiman.gateway.engine.beans.Contract)10 Policy (io.apiman.gateway.engine.beans.Policy)10 PublishingException (io.apiman.gateway.engine.beans.exceptions.PublishingException)10 ApiNotFoundException (io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException)8 ApiRetiredException (io.apiman.gateway.engine.beans.exceptions.ApiRetiredException)8 NoContractFoundException (io.apiman.gateway.engine.beans.exceptions.NoContractFoundException)8 ClientNotFoundException (io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException)7 ApiGatewayBean (io.apiman.manager.api.beans.apis.ApiGatewayBean)7 ApiVersionBean (io.apiman.manager.api.beans.apis.ApiVersionBean)7 StorageException (io.apiman.manager.api.core.exceptions.StorageException)7 IGatewayLink (io.apiman.manager.api.gateway.IGatewayLink)7 ArrayList (java.util.ArrayList)7 Date (java.util.Date)7 RegistrationException (io.apiman.gateway.engine.beans.exceptions.RegistrationException)6 ApiBean (io.apiman.manager.api.beans.apis.ApiBean)6 ActionException (io.apiman.manager.api.rest.exceptions.ActionException)6 ApiVersionNotFoundException (io.apiman.manager.api.rest.exceptions.ApiVersionNotFoundException)6