# Istio Apigee Adapter

This workspace holds an apigee adapter for Istio. It can be tested by itself, but in order
to really use it you need a build of the Istio mixer that pulls it in. Instructions for that
are forthcoming.

## Building

You need Bazel, just like with Istio.

    make

Builds everything, and

    make test

Runs the tests.

## Launching with the mixer

Assuming that you have built a Mixer that includes it, you can launch the mixer as follows:

First, edit testdata/global/adapters.yml to specify the organization and environment name for
your Apigee adapter to use. If you deployed "edgemicro-auth" to a production org, then
that is all you need. Otherwise, you can use "validationURL" to specify the base path
to another proxy.

Now, launch the Mixer binary:

    $MIXER_HOME/bazel-bin/cmd/server/mixs server --logtostderr --configStoreURL fs://$THIS_ROOT/testdata/configroot

(In other words the "config store URL" needs to be the absolute path of the "testdata/configroot"
directory of this repo. If you get this wrong then the mixer will silently do nothing
and always return "OK!")

Once that's running, here's a sample command:

    $MIXER_HOME/bazel-bin/cmd/client/mixc check -a target.service=fault.svc.cluster.local \
    --stringmap_attributes request.headers=apikey:SOME_VALID_API_KEY

That will send a "check" RPC to the mixer, which will respond "OK" if and only if the
API key is valid.

You can also run "bazel-bin/cmd/mockserver," which will implement the same API as
edgemicro-auth, but it will do it locally so that you can test easily. With the mock
server, "12345" is a valid API key.
