diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bd0cf57 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +sudo: required + +language: go + +go: + - "1.10.x" + +services: + - docker + +install: + - docker-compose up -d + +script: + - go test -v github.com/paypal/gorealis diff --git a/README.md b/README.md index 76292af..82ddc2f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# gorealis [![GoDoc](https://godoc.org/github.com/paypal/gorealis?status.svg)](https://godoc.org/github.com/paypal/gorealis) +# gorealis [![GoDoc](https://godoc.org/github.com/paypal/gorealis?status.svg)](https://godoc.org/github.com/paypal/gorealis) [![Build Status](https://travis-ci.org/paypal/gorealis.svg?branch=master)](https://travis-ci.org/paypal/gorealis) Go library for interacting with [Apache Aurora](https://github.com/apache/aurora). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4bb1587 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,81 @@ +version: "2" + +services: + zk: + image: rdelvalle/zookeeper + restart: on-failure + ports: + - "2181:2181" + environment: + ZK_CONFIG: tickTime=2000,initLimit=10,syncLimit=5,maxClientCnxns=128,forceSync=no,clientPort=2181 + ZK_ID: 1 + networks: + aurora_cluster: + ipv4_address: 192.168.33.2 + + master: + image: mesosphere/mesos-master:1.5.0 + restart: on-failure + ports: + - "5050:5050" + environment: + MESOS_ZK: zk://192.168.33.2:2181/mesos + MESOS_QUORUM: 1 + MESOS_HOSTNAME: localhost + MESOS_CLUSTER: test-cluster + MESOS_REGISTRY: replicated_log + networks: + aurora_cluster: + ipv4_address: 192.168.33.3 + depends_on: + - zk + + agent-one: + image: rdelvalle/mesos-agent:1.5.0 + pid: host + restart: on-failure + ports: + - "5051:5051" + environment: + MESOS_MASTER: zk://192.168.33.2:2181/mesos + MESOS_CONTAINERIZERS: docker,mesos + MESOS_PORT: 5051 + MESOS_HOSTNAME: localhost + MESOS_RESOURCES: ports(*):[11000-11999] + MESOS_SYSTEMD_ENABLE_SUPPORT: 'false' + MESOS_WORK_DIR: /tmp/mesos + networks: + aurora_cluster: + ipv4_address: 192.168.33.4 + + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup + - /var/run/docker.sock:/var/run/docker.sock + depends_on: + - zk + + aurora-one: + image: rdelvalle/aurora:0.20.0 + pid: host + ports: + - "8081:8081" + restart: on-failure + environment: + CLUSTER_NAME: test-cluster + ZK_ENDPOINTS: "192.168.33.2:2181" + MESOS_MASTER: "zk://192.168.33.2:2181/mesos" + networks: + aurora_cluster: + ipv4_address: 192.168.33.7 + depends_on: + - zk + - master + - agent-one + +networks: + aurora_cluster: + driver: bridge + ipam: + config: + - subnet: 192.168.33.0/16 + gateway: 192.168.33.1 \ No newline at end of file diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 0000000..895ad1e --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,90 @@ + +# Developing gorealis + + +### Installing Docker + +For our developer environment we leverage of Docker containers. + +First you must have Docker installed. Instructions on how to install Docker +vary from platform to platform and can be found [here](https://docs.docker.com/install/). + +### Installing docker-compose + +To make the creation of our developer environment as simple as possible, we leverage +docker-compose to bring up all independent components up separately. + +This also allows us to delete and recreate our development cluster very quickly. + +To install docker-compose please follow the instructions for your platform +[here](https://docs.docker.com/compose/install/). + + +### Getting the source code + +As of go 1.10.x, GOPATH is still relevant. This may change in the future but +for the sake of making development less error prone, it is suggested that the following +directories be created: + +`$ mkdir -p $GOPATH/src/github.com/paypal` + +And then clone the master branch into the newly created folder: + +`$ cd $GOPATH/src/github.com/paypal; git clone git@github.com:paypal/gorealis.git` + +Since we check in our vendor folder, gorealis no further set up is needed. + +### Bringing up the cluster + +To develop gorealis, you will need a fully functioning Mesos cluster along with +Apache Aurora. + +In order to bring up our docker-compose set up execute the following command from the root +of the git repository: + +`$ docker-compose up -d` + +### Testing code + +Since Docker does not work well using host mode under MacOS, a workaround has been employed: +docker-compose brings up a bridged network. + +* The ports 8081 is exposed for Aurora. http://localhost:8081 will load the Aurora Web UI. +* The port 5050 is exposed for Mesos. http://localhost:5050 will load the Mesos Web UI. + +#### Note for developers on MacOS: +Running the cluster using a bridged network on MacOS has some side effects. +Since Aurora exposes it's internal IP location through Zookeeper, gorealis will determine +the address to be 192.168.33.7. The address 192.168.33.7 is valid when running in a Linux +environment but not when running under MacOS. To run code involving the ZK leader fetcher +(such as the tests), a container connected to the network needs to be launched. + +For example, running the tests in a container can be done through the following command from +the root of the git repository: + +`$ docker run -t -v $(pwd):/go/src/github.com/paypal/gorealis --network gorealis_aurora_cluster golang:1.10.3-alpine go test github.com/paypal/gorealis` + +Or + +`$ ./runTestsMac.sh` + +Alternatively, if an interactive shell is necessary, the following command may be used: +`$ docker run -it -v $(pwd):/go/src/github.com/paypal/gorealis --network gorealis_aurora_cluster golang:1.10.3-alpine /bin/sh` + +### Cleaning up the cluster + +If something went wrong while developing and a clean environment is desired, perform the +following command from the root of the git directory: + +`$ docker-compose down && docker-compose up -d` + + +### Tearing down the cluster + +Once development is done, the environment may be torn down by executing (from the root of the +git directory): + +`$ docker-compose down` + + + diff --git a/realis_e2e_test.go b/realis_e2e_test.go index cbf2804..afc651e 100644 --- a/realis_e2e_test.go +++ b/realis_e2e_test.go @@ -69,7 +69,7 @@ func TestNonExistentEndpoint(t *testing.T) { Jitter: 0.1} // Attempt to connect to a bad endpoint - r, err := realis.NewRealisClient(realis.SchedulerUrl("http://127.0.0.1:8081/doesntexist/"), + r, err := realis.NewRealisClient(realis.SchedulerUrl("http://192.168.33.7:8081/doesntexist/"), realis.TimeoutMS(200), realis.BackOff(backoff), ) @@ -92,11 +92,11 @@ func TestNonExistentEndpoint(t *testing.T) { } func TestLeaderFromZK(t *testing.T) { - cluster := realis.GetDefaultClusterFromZKUrl("192.168.33.7:2181") + cluster := realis.GetDefaultClusterFromZKUrl("192.168.33.2:2181") url, err := realis.LeaderFromZK(*cluster) assert.NoError(t, err) - assert.Equal(t, "http://aurora.local:8081", url) + assert.Equal(t, "http://192.168.33.7:8081", url) } func TestRealisClient_ReestablishConn(t *testing.T) { @@ -171,7 +171,7 @@ func TestRealisClient_CreateJobWithPulse_Thermos(t *testing.T) { Name("create_thermos_job_test"). ExecutorName(aurora.AURORA_EXECUTOR_NAME). ExecutorData(string(thermosPayload)). - CPU(1). + CPU(.5). RAM(64). Disk(100). IsService(true). @@ -295,7 +295,7 @@ func TestRealisClient_ScheduleCronJob_Thermos(t *testing.T) { } func TestRealisClient_DrainHosts(t *testing.T) { - hosts := []string{"192.168.33.7"} + hosts := []string{"localhost"} _, _, err := r.DrainHosts(hosts...) if err != nil { fmt.Printf("error: %+v\n", err.Error()) @@ -308,7 +308,7 @@ func TestRealisClient_DrainHosts(t *testing.T) { []aurora.MaintenanceMode{aurora.MaintenanceMode_DRAINED, aurora.MaintenanceMode_DRAINING}, 1, 50) - assert.Equal(t, map[string]bool{"192.168.33.7": true}, hostResults) + assert.Equal(t, map[string]bool{"localhost": true}, hostResults) assert.NoError(t, err) t.Run("TestRealisClient_MonitorNontransitioned", func(t *testing.T) { @@ -321,7 +321,7 @@ func TestRealisClient_DrainHosts(t *testing.T) { // Assert monitor returned an error that was not nil, and also a list of the non-transitioned hosts assert.Error(t, err) - assert.Equal(t, map[string]bool{"192.168.33.7": true, "IMAGINARY_HOST": false}, hostResults) + assert.Equal(t, map[string]bool{"localhost": true, "IMAGINARY_HOST": false}, hostResults) }) t.Run("TestRealisClient_EndMaintenance", func(t *testing.T) { diff --git a/runTestsMac.sh b/runTestsMac.sh new file mode 100755 index 0000000..fcc17b1 --- /dev/null +++ b/runTestsMac.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Since we run our docker compose setup in bridge mode to be able to run on MacOS, we have to launch a Docker container within the bridge network in order to avoid any routing issues. +docker run -t -v $(pwd):/go/src/github.com/paypal/gorealis --network gorealis_aurora_cluster golang:1.10.3-stretch go test -v github.com/paypal/gorealis