Skip to content
This repository was archived by the owner on Sep 23, 2022. It is now read-only.

Commit 816eb05

Browse files
committed
Initial commit
0 parents  commit 816eb05

35 files changed

+1900
-0
lines changed

Diff for: .gitignore

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/.idea/
2+
/.idea_modules/
3+
target
4+
/project/typesafe.properties
5+
/project/activator-*
6+
/logs/
7+
/RUNNING_PID
8+
*.iml
9+
.DS_Store
10+
.sbtserver*
11+
project/play-fork-run.sbt
12+
project/sbt-ui.sbt
13+
senza.yaml
14+
Dockerfile
15+
Makefile
16+
/src/main/resources/application.conf

Diff for: LICENSE

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Copyright 2013-2015 Zalando SE
2+
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.

Diff for: MAINTAINERS

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

Diff for: README.md

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Innkeeper
2+
3+
A route management API for [Skipper](https://github.com/zalando/skipper)
4+
5+
When a new instance of Skipper is started, it will connect to innkeeper, ask for all the routes and initialize it's own data structures.
6+
7+
Then, at every x minutes will will ask innkeeper for the modified routes and update it's internal data structures.
8+
9+
## Development
10+
11+
To run Innkeeper, execute `sbt run`.
12+
13+
To run the test suite, run `sbt test`.
14+
15+
Innkeeper requires a Postgres DB for operation. For local development, docker can be used to spawn a DB (see below).
16+
17+
### Inserting a new route manually
18+
19+
```bash
20+
curl -XPOST localhost:8080/routes -d '{
21+
"path_matcher": {
22+
"matcher": "/route",
23+
"matcher_type": "STRICT"
24+
},
25+
"response_headers": [],
26+
"description": "The New Route",
27+
"request_headers": [],
28+
"method_matchers": [],
29+
"header_matchers": [],
30+
"endpoint": {
31+
"hostname": "zalando.de",
32+
"port": 80,
33+
"protocol": "HTTP",
34+
"endpointType": "REVERSE_PROXY"
35+
}
36+
}' -H 'Content-Type: application/json' -H 'Authorization: oauth-token'
37+
```
38+
39+
### Getting all routes
40+
41+
curl http://localhost:8080/routes -H 'Authorization: oauth-token'
42+
43+
### Getting last modified routes
44+
45+
curl http://localhost:8080/routes?last_modified=2015-08-21T15:23:05.731 -H 'Authorization: oauth-token'
46+
47+
# Postgres
48+
49+
For localhost
50+
51+
CREATE ROLE innkeeper superuser login createdb;
52+
ALTER ROLE innkeeper WITH PASSWORD 'innkeeper';
53+
54+
## Postgres via docker
55+
56+
It is possible to simply start a docker container with a postgres ready for innkeeper by running:
57+
58+
```bash
59+
$ docker run -e POSTGRES_PASSWORD=innkeeper -e POSTGRES_USER=innkeeper -p 5432:5432 postgres:9.4
60+
```
61+
62+
For the tests, a different DB is used:
63+
64+
```bash
65+
$ docker run -e POSTGRES_PASSWORD=innkeeper-test -e POSTGRES_USER=innkeeper-test -p 5433:5432 postgres:9.4
66+
```
67+
68+
For users of `boot2docker` or `docker-machine` it is also necessary to create a port forwarding.
69+
Assuming the docker-machine is named `default` this can be achieved via:
70+
71+
```bash
72+
$ VBoxManage controlvm "default" natpf1 "tcp-port5432,tcp,,5432,,5432"
73+
$ VBoxManage controlvm "default" natpf1 "tcp-port5433,tcp,,5433,,5433"
74+
```
75+
76+
### License
77+
78+
Copyright 2015 Zalando SE
79+
80+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
81+
82+
http://www.apache.org/licenses/LICENSE-2.0
83+
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Diff for: build.sbt

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import com.typesafe.sbt.SbtScalariform.ScalariformKeys
2+
import com.typesafe.sbt.SbtScalariform._
3+
import com.typesafe.sbt.packager.archetypes.JavaAppPackaging
4+
import sbt.dsl._
5+
import spray.revolver.RevolverPlugin.Revolver
6+
7+
import _root_.scalariform.formatter.preferences.AlignSingleLineCaseStatements
8+
import _root_.scalariform.formatter.preferences.DoubleIndentClassDeclaration
9+
10+
name := """innkeeper"""
11+
organization := "org.zalando.spearheads"
12+
version := "0.0.1"
13+
14+
mainClass in Compile := Some("org.zalando.spearheads.innkeeper.Innkeeper")
15+
16+
scalaVersion := "2.11.7"
17+
18+
scalacOptions := Seq("-unchecked", "-feature", "-deprecation", "-encoding", "utf8")
19+
20+
val akkaStreamV = "1.0"
21+
val scalaTestV = "3.0.0-M1"
22+
val scalaMockV = "3.2.2"
23+
24+
libraryDependencies ++= List(
25+
"com.typesafe.slick" %% "slick" % "3.0.1",
26+
"com.h2database" % "h2" % "1.3.175",
27+
"com.typesafe.akka" %% "akka-stream-experimental" % akkaStreamV,
28+
"com.typesafe.akka" %% "akka-http-core-experimental" % akkaStreamV,
29+
"com.typesafe.akka" %% "akka-http-spray-json-experimental" % akkaStreamV,
30+
"com.typesafe.akka" %% "akka-slf4j" % "2.3.9",
31+
"ch.qos.logback" % "logback-classic" % "1.1.3",
32+
"com.google.inject" % "guice" % "4.0",
33+
"net.codingwell" %% "scala-guice" % "4.0.0",
34+
"org.postgresql" % "postgresql" % "9.3-1103-jdbc41",
35+
"com.github.tminglei" %% "slick-pg" % "0.9.1",
36+
"com.zaxxer" % "HikariCP" % "2.4.1",
37+
"org.scalatest" %% "scalatest" % scalaTestV % "it,test",
38+
"org.scalamock" %% "scalamock-scalatest-support" % scalaMockV % "it,test",
39+
"com.typesafe.akka" %% "akka-http-testkit-experimental" % akkaStreamV % "it,test",
40+
"com.typesafe.akka" %% "akka-stream-testkit-experimental" % akkaStreamV % "it,test"
41+
)
42+
43+
lazy val root = project.in(file(".")).configs(IntegrationTest)
44+
Defaults.itSettings
45+
scalariformSettings
46+
Revolver.settings
47+
48+
enablePlugins(JavaAppPackaging)
49+
50+
ScalariformKeys.preferences := ScalariformKeys.preferences.value
51+
.setPreference(AlignSingleLineCaseStatements, true)
52+
.setPreference(AlignSingleLineCaseStatements.MaxArrowIndent, 100)
53+
.setPreference(DoubleIndentClassDeclaration, true)
54+
55+
fork in run := true

Diff for: project/build.properties

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#Activator-generated Properties
2+
#Tue Aug 11 14:06:45 CEST 2015
3+
template.uuid=77656160-dd7e-421b-88b2-fe788534e42f
4+
sbt.version=0.13.8

Diff for: project/idea.sbt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// This plugin adds commands to generate IDE project files
2+
3+
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

Diff for: project/plugins.sbt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
resolvers += Classpaths.sbtPluginReleases
2+
3+
addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0")
4+
addSbtPlugin("com.sksamuel.scapegoat" %% "sbt-scapegoat" % "1.0.0")
5+
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.7.0")
6+
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.2.0")
7+
addSbtPlugin("io.spray" %% "sbt-revolver" % "0.7.2")
8+
addSbtPlugin("com.typesafe.sbt" %% "sbt-native-packager" % "1.0.2")
9+
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")

Diff for: scalastyle-config.xml

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<scalastyle>
2+
<name>Scalastyle standard configuration</name>
3+
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
4+
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
5+
<parameters>
6+
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
7+
</parameters>
8+
</check>
9+
<check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="false">
10+
<parameters>
11+
<parameter name="header"><![CDATA[// Copyright (C) 2011-2012 the original author or authors.
12+
// See the LICENCE.txt file distributed with this work for additional
13+
// information regarding copyright ownership.
14+
//
15+
// Licensed under the Apache License, Version 2.0 (the "License");
16+
// you may not use this file except in compliance with the License.
17+
// You may obtain a copy of the License at
18+
//
19+
// http://www.apache.org/licenses/LICENSE-2.0
20+
//
21+
// Unless required by applicable law or agreed to in writing, software
22+
// distributed under the License is distributed on an "AS IS" BASIS,
23+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24+
// See the License for the specific language governing permissions and
25+
// limitations under the License.]]></parameter>
26+
</parameters>
27+
</check>
28+
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
29+
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
30+
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
31+
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
32+
<parameters>
33+
<parameter name="maxLineLength"><![CDATA[240]]></parameter>
34+
<parameter name="tabSize"><![CDATA[4]]></parameter>
35+
</parameters>
36+
</check>
37+
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
38+
<parameters>
39+
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
40+
</parameters>
41+
</check>
42+
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
43+
<parameters>
44+
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
45+
</parameters>
46+
</check>
47+
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
48+
<parameters>
49+
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
50+
</parameters>
51+
</check>
52+
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
53+
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
54+
<parameters>
55+
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
56+
</parameters>
57+
</check>
58+
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
59+
<parameters>
60+
<parameter name="maxParameters"><![CDATA[8]]></parameter>
61+
</parameters>
62+
</check>
63+
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false">
64+
<parameters>
65+
<parameter name="ignore"><![CDATA[-1,0,1,2,3]]></parameter>
66+
</parameters>
67+
</check>
68+
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check>
69+
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
70+
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="true"></check>
71+
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="true"></check>
72+
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="true"></check>
73+
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
74+
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
75+
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
76+
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
77+
<parameters>
78+
<parameter name="regex"><![CDATA[println]]></parameter>
79+
</parameters>
80+
</check>
81+
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
82+
<parameters>
83+
<parameter name="maxTypes"><![CDATA[30]]></parameter>
84+
</parameters>
85+
</check>
86+
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="false">
87+
<parameters>
88+
<parameter name="maximum"><![CDATA[10]]></parameter>
89+
</parameters>
90+
</check>
91+
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
92+
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
93+
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
94+
<parameters>
95+
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
96+
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
97+
</parameters>
98+
</check>
99+
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
100+
<parameters>
101+
<parameter name="maxLength"><![CDATA[50]]></parameter>
102+
</parameters>
103+
</check>
104+
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
105+
<parameters>
106+
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
107+
</parameters>
108+
</check>
109+
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
110+
<parameters>
111+
<parameter name="maxMethods"><![CDATA[30]]></parameter>
112+
</parameters>
113+
</check>
114+
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="false"></check>
115+
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="false"></check>
116+
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
117+
</scalastyle>

Diff for: src/main/resources/sample.application.conf

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
innkeeper.env=dev
2+
3+
dev {
4+
innkeeperdb = {
5+
url = "jdbc:postgresql://localhost:5432/innkeeper"
6+
user = "innkeeper"
7+
password = "innkeeper"
8+
driver = org.postgresql.Driver
9+
connectionPool = HikariCP
10+
keepAliveConnection = true
11+
}
12+
}
13+
14+
prod {
15+
innkeeperdb = {
16+
url = "jdbc:postgresql://innkeeper-db-prod:5432/innkeeper"
17+
user = "innkeeper"
18+
password = "innkeeper"
19+
driver = org.postgresql.Driver
20+
connectionPool = HikariCP
21+
keepAliveConnection = true
22+
}
23+
}
24+
25+
akka {
26+
loglevel = DEBUG
27+
}
28+
29+
interface = "0.0.0.0"
30+
port = 8080
31+
32+
oauth.url="https://auth.provider/tokeninfo?access_token="
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.zalando.spearheads.innkeeper
2+
3+
import com.google.inject.{ AbstractModule, Provider }
4+
import com.typesafe.config.{ Config, ConfigFactory }
5+
import net.codingwell.scalaguice.ScalaModule
6+
import org.zalando.spearheads.innkeeper.ConfigModule.ConfigProvider
7+
8+
object ConfigModule {
9+
class ConfigProvider extends Provider[Config] {
10+
override def get() = ConfigFactory.load()
11+
}
12+
}
13+
14+
/**
15+
* Binds the application configuration to the [[Config]] interface.
16+
*
17+
* The config is bound as an eager singleton so that errors in the config are detected
18+
* as early as possible.
19+
*/
20+
class ConfigModule extends AbstractModule with ScalaModule {
21+
22+
override def configure() {
23+
bind[Config].toProvider[ConfigProvider].asEagerSingleton()
24+
}
25+
}

0 commit comments

Comments
 (0)