apollo

Easy way to write, build, run and collect test results.

3 years after

Apollo

wercker status

Easy way to write, build, run and collect test results.

Golang

Install Go tools I prefer use godeb to do that.

Code

Get the source code:

git clone https://github.com/wiliamsouza/apollo.git

Dependencies

After that install godeps:

go get github.com/tools/godep

Install dependencies:

cd apollo/Godeps
godep restore

Go to bin source directory and build the source:

cd apollo/bin
go build apollod.go

Running

You can run a CoreOS cluster with will run a nginx, docker-registry and an instance of the API server.

Environment

Before run see apollo-coreos for instructions.

IMAGE="${DOCKER_REGISTRY}/apollo/api"
COREOS_IP=172.16.16.101

Volumes

mkdir -p ~/.containers/apollo/apollod
cp -R volumes/ ~/.containers/apollo/apollod/

Docker image

Build this image:

docker build -t $DOCKER_REGISTRY/apollo/api:$APOLLO_TAG .

Pushing images

Push a image manually, this will preload the image to the cluster node:

docker save $IMAGE | docker -H tcp://$COREOS_IP:2375 load

Push the image to local registry:

docker push $IMAGE:$APOLLO_TAG

Before push an image you need start a local registry apollo-registry/README.md for instruction how to start a registry.

Starting service

Start api service on the cluster:

cd systemd
ln -s apollod.service [email protected]
fleetctl start [email protected]

Info about how to configure fleet apollo-coreos/README.md#fleet.

Container

The commands here should be executed inside a cluster node.

eval `cat /etc/environment`
eval `cat /etc/env.d/apollo`

Shell access:

docker run --rm -p 8000:8000 -i \
-e COREOS_IP=${COREOS_PUBLIC_IPV4} \
-v /srv/containers/apollod/volumes/etc:/etc/apollo/ \
-t $DOCKER_REGISTRY/apollo/api:$APOLLO_ENVIRONMENT /bin/bash

The command above will start a container give you a shell. Don't forget to start the service running the startup & script.

Manual start:

docker run --name api -p 8000:8000 -d \
-e COREOS_IP=${COREOS_PUBLIC_IPV4} \
-v /srv/containers/apollod/volumes/etc:/etc/apollo/ \
-t $DOCKER_REGISTRY/apollo/api:$APOLLO_ENVIRONMENT

The command above will start a container and return its ID.

Local server

Start a local api server:

The only configuration that need to be adjusted is keys path the following example set the path to a test keys.

rsa:
  private: "../data/keys/rsa"
  public: "../data/keys/rsa.pub"
./apollod -config ../etc/apollod.conf

Now you can test the API.

MongoDB container

Apollo uses MongoDB as database and for development we run it inside a Docker container to get it running follow the instructions bellow:

sudo apt-get install docker.io python-pip curl mongodb-clients

docker.io is a ubuntu 14.04 package refer to Docker getting started for [instalations instructions] (https://www.docker.io/gettingstarted/#h_installation).

To make easy the use of a container we use fig.

sudo pip install fig

Use the follow directory structure to keep MongoDB configuration, logs and data.

mkdir -p ~/.containers/apollo/volumes/mongodb/log
mkdir -p ~/.containers/apollo/volumes/mongodb/lib
mkdir -p ~/.containers/apollo/volumes/mongodb/etc
curl https://raw.githubusercontent.com/wiliamsouza/docker-mongodb/master/volumes/etc/mongod.conf -o ~/.containers/apollo/volumes/mongodb/etc/mongod.conf

Start the container run:

fig up

The command should be executed inside root project directory.

If you need to access you MongoDB shell install the client tools.

sudo apt-get install mongodb-clients

User API

Adding a new user:

curl -v --header "Content-Type: application/json" --request POST --data '{"name":"John Doe","email":"[email protected]","password":"12345"}' http://localhost:8000/users

It will return user name and email:

{"name":"John Doe","email":"[email protected]"}

Authenticate user:

curl -v --header "Content-Type: application/json" --request POST --data '{"email":"[email protected]","password":"12345"}' http://localhost:8000/users/authenticate

It will return a JWT(JSON Web Token) token:

{"token":"cCI6IkpXVCJCI6Impob25AZG9lLmNvbSIsImV4cCI6MTM5MzMxODU0OH0ZLoU"}

From now you should set an environment variable $TOKEN it will be used through this doc:

export TOKEN=<token>

<token> is the one returned by users/authenticate.

Detail user:

curl -v --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/users/[email protected]

It will return user details:

{"name":"John Doe","email":"[email protected]","apikey":"0Yy00ZDRhLThmNmQt...","created":"2014-02-22T00:20:44.511-03:00","lastlogin":"0001-01-01T00:00:00Z"}

Package API

Uploading a package:

curl -vv --header "Authorization: Bearer $TOKEN" --request POST --form [email protected] --form [email protected] http://localhost:8000/tests/packages

The data directory contains some files to test.

It will return basic information about package:

{"filename":"package1.tgz","metadata":{"description":"Package1 ON/OFF test"}}

Listing packages:

curl -vv --header "Authorization: Bearer $TOKEN"  --header "Content-Type: application/json" -X GET http://localhost:8000/tests/packages

It will return a list of packages:

[{"filename":"package1.tgz","metadata":{"description":"Package1 ON/OFF test"}}]

Detailing package:

curl -vv --header "Authorization: Bearer $TOKEN"  --header "Content-Type: application/json" -X GET http://localhost:8000/tests/packages/package1.tgz

It will return package detail:

{"filename":"package1.tgz","metadata":{"version":0.1,"description":"Package1 ON/OFF test","install":"adb push dist/package1.jar /data/local/tmp/","run":"adb shell uiautomator runtest package1.jar -c com.github.wiliamsouza.package1.Package1Test"}}

Downloading package:

curl -vv --header "Authorization: Bearer $TOKEN"  -X GET http://localhost:8000/tests/packages/downloads/package1.tgz -o package.tgz

It will download package.

Organization API

Adding a new organization:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request POST --data '{"name":"doecorp","teams":[{"name":"Test","users":["[email protected]","[email protected]"]}],"admins":["[email protected]"]}' http://localhost:8000/organizations

It will return:

{"name":"doecorp","teams":[{"name":"Test","users":["[email protected]","[email protected]"]}],"admins":["[email protected]"]}

List organizations:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/organizations

It will return:

[{"name":"janecorp","teams":[{"name":"Test","users":["[email protected]","[email protected]"]}],"admins":["[email protected]"]},{"name":"johncorp","teams":[{"name":"Test","users":["[email protected]","[email protected]"]}],"admins":["[email protected]"]}]

Detail organization:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/organizations/doecorp

It will return:

{"name":"doecorp","teams":[{"name":"Test","users":["[email protected]","[email protected]"]}],"admins":["[email protected]"]}

Update organization:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request PUT --data '{"name":"doecorp","teams":[{"name":"Test","users":["[email protected]"]}],"admins":["[email protected]"]}' http://localhost:8000/organizations/doecorp

Update is used to simulate deletion, change and addtion.

Delete:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request DELETE http://localhost:8000/organizations/doecorp

Device API

Adding a new device:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request POST --data '{"codename":"a700","permission":{"organization":{"run":false,"result":false,"info":false},"team":{"run":false,"result":false,"info":false}},"owner":"","status":"","name":"Acer A700","vendor":"acer","manufacturer":"acer","type":"tablet","platform":"NVIDIA Tegra 3","cpu":"1.3 GHz quad-core Cortex A9","gpu":"416 MHz twelve-core Nvidia GeForce ULP","ram":"1GB","weight":"665 g (1.47 lb)","dimensions":"259x175x11 mm (10.20x6.89x0.43 in)","screenDimension":"257 mm (10.1 in)","resolution":"1920x1200","screenDensity":"224 PPI","internalStorage":"32GB","sdCard":"up to 32 GB","bluetooth":"yes","wifi":"802.11 b/g/n","mainCamera":"5MP","secondaryCamera":"2MP","power":"9800 mAh","peripherals":"accelerometer, gyroscope, proximity sensor, digital compass, GPS, magnometer, microphone"}' http://localhost:8000/devices

It will return:

{"codename":"a700","permission":{"organization":{"run":false,"result":false,"info":false},"team":{"run":false,"result":false,"info":false}},"owner":"","status":"","name":"Acer A700","vendor":"acer","manufacturer":"acer","type":"tablet","platform":"NVIDIA Tegra 3","cpu":"1.3 GHz quad-core Cortex A9","gpu":"416 MHz twelve-core Nvidia GeForce ULP","ram":"1GB","weight":"665 g (1.47 lb)","dimensions":"259x175x11 mm (10.20x6.89x0.43 in)","screenDimension":"257 mm (10.1 in)","resolution":"1920x1200","screenDensity":"224 PPI","internalStorage":"32GB","sdCard":"up to 32 GB","bluetooth":"yes","wifi":"802.11 b/g/n","mainCamera":"5MP","secondaryCamera":"2MP","power":"9800 mAh","peripherals":"accelerometer, gyroscope, proximity sensor, digital compass, GPS, magnometer, microphone"}

List devices:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/devices

It will return:

[{"codename":"a700","permission":{"organization":{"run":false,"result":false,"info":false},"team":{"run":false,"result":false,"info":false}},"owner":"","status":"","name":"Acer A700","vendor":"acer","manufacturer":"acer","type":"tablet","platform":"NVIDIA Tegra 3","cpu":"1.3 GHz quad-core Cortex A9","gpu":"416 MHz twelve-core Nvidia GeForce ULP","ram":"1GB","weight":"665 g (1.47 lb)","dimensions":"259x175x11 mm (10.20x6.89x0.43 in)","screenDimension":"257 mm (10.1 in)","resolution":"1920x1200","screenDensity":"224 PPI","internalStorage":"32GB","sdCard":"up to 32 GB","bluetooth":"yes","wifi":"802.11 b/g/n","mainCamera":"5MP","secondaryCamera":"2MP","power":"9800 mAh","peripherals":"accelerometer, gyroscope, proximity sensor, digital compass, GPS, magnometer, microphone"}]

Detail device:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/devices/a700

It will return:

{"codename":"a700","permission":{"organization":{"run":false,"result":false,"info":false},"team":{"run":false,"result":false,"info":false}},"owner":"","status":"","name":"Acer A700","vendor":"acer","manufacturer":"acer","type":"tablet","platform":"NVIDIA Tegra 3","cpu":"1.3 GHz quad-core Cortex A9","gpu":"416 MHz twelve-core Nvidia GeForce ULP","ram":"1GB","weight":"665 g (1.47 lb)","dimensions":"259x175x11 mm (10.20x6.89x0.43 in)","screenDimension":"257 mm (10.1 in)","resolution":"1920x1200","screenDensity":"224 PPI","internalStorage":"32GB","sdCard":"up to 32 GB","bluetooth":"yes","wifi":"802.11 b/g/n","mainCamera":"5MP","secondaryCamera":"2MP","power":"9800 mAh","peripherals":"accelerometer, gyroscope, proximity sensor, digital compass, GPS, magnometer, microphone"}

Update device:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request PUT --data '{"codename":"a700","permission":{"organization":{"run":true,"result":true,"info":false},"team":{"run":false,"result":false,"info":false}},"owner":"[email protected]","status":"","name":"Acer A700","vendor":"acer","manufacturer":"acer","type":"tablet","platform":"NVIDIA Tegra 3","cpu":"1.3 GHz quad-core Cortex A9","gpu":"416 MHz twelve-core Nvidia GeForce ULP","ram":"1GB","weight":"665 g (1.47 lb)","dimensions":"259x175x11 mm (10.20x6.89x0.43 in)","screenDimension":"257 mm (10.1 in)","resolution":"1920x1200","screenDensity":"224 PPI","internalStorage":"32GB","sdCard":"up to 32 GB","bluetooth":"yes","wifi":"802.11 b/g/n","mainCamera":"5MP","secondaryCamera":"2MP","power":"9800 mAh","peripherals":"accelerometer, gyroscope, proximity sensor, digital compass, GPS, magnometer, microphone"}' http://localhost:8000/devices/a700

Update is used to simulate deletion, change and addtion.

Delete:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request DELETE http://localhost:8000/devices/a700

Cicle API

Adding a new cicle:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request POST --data '{"name":"Test maguro","device":"maguro","packages":["bluetooth.jar","wifi.jar"]}' http://localhost:8000/tests

It will return:

{"id":"530d6474e169975bbb000001","name":"Test maguro","device":"maguro","packages":["bluetooth.jar","wifi.jar"]}

List cicles:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/tests

It will return:

[{"id":"530d6474e169975bbb000001","name":"Test maguro","device":"maguro","packages":["bluetooth.jar","wifi.jar"]}]

Detail cicle:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request GET http://localhost:8000/tests/530d6474e169975bbb000001

It will return:

{"id":"530d6474e169975bbb000001","name":"Test maguro","device":"maguro","packages":["bluetooth.jar","wifi.jar"]}

Update cicle:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request PUT --data '{"name":"Test yakju","device":"yakju","packages":["bluetooth.jar","wifi.jar"]}' http://localhost:8000/tests/530d6474e169975bbb000001

Update is used to simulate deletion, change and addtion.

Delete:

curl -vv --header "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --request DELETE http://localhost:8000/tests/530d6474e169975bbb000001

Related Repositories

Apollo-11

Apollo-11

Original Apollo 11 Guidance Computer (AGC) source code for the command and lunar ...

react-apollo

react-apollo

:recycle: React data container for the Apollo Client ...

apollo-universal-starter-kit

apollo-universal-starter-kit

Apollo Universal Starter Kit — Universal web and mobile app boilerplate with Hot ...

apollo-client-devtools

apollo-client-devtools

:christmas_tree: Chrome extension for Apollo Client developer tools ...

activemq-apollo

activemq-apollo

Mirror of Apache ActiveMQ Apollo ...


Top Contributors

wiliamsouza bitdeli-chef fsouza