From 7491c94704d9ef747db23d9c4a5a113eea899669 Mon Sep 17 00:00:00 2001 From: Michel Tricot Date: Wed, 5 Aug 2020 12:44:52 -0700 Subject: [PATCH] Generate API code + bootstrap webserver + simplify launch (#8) --- .gitignore | 1 + Dockerfile | 10 +- README.md | 11 +- build.gradle | 39 +- conduit-api/build.gradle | 47 ++ conduit-api/src/main/openapi/conduit.yaml | 712 ++++++++++++++++++ conduit-commons/build.gradle | 0 .../dataline/conduit/commons}/HelloWorld.java | 2 +- .../conduit/commons}/HelloWorldTest.java | 2 +- conduit-server/build.gradle | 28 + .../io/dataline/conduit/server/ServerApp.java | 38 + .../dataline/conduit/server/apis/PetApi.java | 55 ++ .../conduit/server/ServerAppTest.java | 12 + settings.gradle | 4 + src/main/java/io/dataline/commons/Sample.java | 5 - tools/app/start.sh | 17 + tools/lib/lib.sh | 12 + 17 files changed, 954 insertions(+), 41 deletions(-) create mode 100644 conduit-api/build.gradle create mode 100644 conduit-api/src/main/openapi/conduit.yaml create mode 100644 conduit-commons/build.gradle rename {src/main/java/io/dataline/playground => conduit-commons/src/main/java/io/dataline/conduit/commons}/HelloWorld.java (83%) rename {src/test/java/io/dataline/playground => conduit-commons/src/test/java/io/dataline/conduit/commons}/HelloWorldTest.java (83%) create mode 100644 conduit-server/build.gradle create mode 100644 conduit-server/src/main/java/io/dataline/conduit/server/ServerApp.java create mode 100644 conduit-server/src/main/java/io/dataline/conduit/server/apis/PetApi.java create mode 100644 conduit-server/src/test/java/io/dataline/conduit/server/ServerAppTest.java delete mode 100644 src/main/java/io/dataline/commons/Sample.java create mode 100755 tools/app/start.sh create mode 100644 tools/lib/lib.sh diff --git a/.gitignore b/.gitignore index e0d53d80c06b..be04972538c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .gradle .idea build +.DS_Store diff --git a/Dockerfile b/Dockerfile index 8ccd49030ce7..53055fd08df5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,15 @@ FROM gradle:jdk14 AS build COPY . /code WORKDIR /code -RUN gradle fatjar --no-daemon +RUN gradle distTar --no-daemon # RUN FROM openjdk:14.0.2-slim +EXPOSE 8080 -RUN mkdir /app +WORKDIR /app/conduit-server -COPY --from=build /code/build/libs/*fatjar*.jar /app/conduit-application.jar +COPY --from=build /code/conduit-server/build/distributions/*.tar conduit-server.tar +RUN tar xvf conduit-server.tar --strip-components=1 -ENTRYPOINT ["java", "-jar", "/app/conduit-application.jar"] +CMD bin/conduit-server diff --git a/README.md b/README.md index da5b2d04726b..498124f287ac 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,9 @@ # Conduit ## Getting Started -### Docker +Simply run ``` -docker run --rm -it dataline/conduit:$VERSION +./tools/app/start.sh ``` -### Repo -``` -VERSION=$(cat .version) -docker build . -t dataline/conduit:$VERSION -docker run --rm -it dataline/conduit:$VERSION -``` +And go to [http://localhost:8080]() diff --git a/build.gradle b/build.gradle index 8893554af046..5922beb6d4c5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,30 +1,25 @@ -plugins { - id 'java' +allprojects { + group = "io.dataline.${rootProject.name}" + version = rootProject.file('.version').text.trim() } -group 'io.dataline' -version = rootProject.file('.version').text.trim() +// For java projects (might need to add some filtering once we have the UI) +subprojects { + apply plugin: 'java' -repositories { - mavenCentral() -} - -test { - useJUnitPlatform() -} + repositories { + mavenCentral() + } -dependencies { - compile group: 'com.google.guava', name: 'guava', version: '29.0-jre' + test { + useJUnitPlatform() + } - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2' -} + dependencies { + implementation group: 'com.google.guava', name: 'guava', version: '29.0-jre' -task fatjar(type: Jar) { - manifest { - attributes 'Main-Class': 'io.dataline.playground.HelloWorld' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2' + testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.4.6' } - baseName "${rootProject.name}-fatjar" - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } - with jar } diff --git a/conduit-api/build.gradle b/conduit-api/build.gradle new file mode 100644 index 000000000000..ca18b33b05ed --- /dev/null +++ b/conduit-api/build.gradle @@ -0,0 +1,47 @@ +plugins { + id "org.openapi.generator" version "4.3.1" + id "java-library" +} + +def specFile = "$projectDir/src/main/openapi/conduit.yaml".toString() + +openApiGenerate { + generatorName = "jaxrs-spec" + inputSpec = specFile + outputDir = "$buildDir/generated".toString() + + apiPackage = "io.dataline.conduit.api" + invokerPackage = "io.dataline.conduit.api.invoker" + modelPackage = "io.dataline.conduit.api.model" + + generateApiDocumentation = false + + configOptions = [ + dateLibrary : "java8", + generatePom : "false", + interfaceOnly: "true" + ] +} + +dependencies { + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.2' + + implementation group: 'io.swagger', name: 'swagger-annotations', version: '1.6.2' + + implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2' + implementation group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.1.1' + implementation group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final' +} + +sourceSets { + main { + java { + srcDir "$buildDir/generated/src/gen/java" + } + resources { + srcDir "$projectDir/src/main/openapi/" + } + } +} + +compileJava.dependsOn tasks.openApiGenerate diff --git a/conduit-api/src/main/openapi/conduit.yaml b/conduit-api/src/main/openapi/conduit.yaml new file mode 100644 index 000000000000..2449f4849423 --- /dev/null +++ b/conduit-api/src/main/openapi/conduit.yaml @@ -0,0 +1,712 @@ +--- +openapi: 3.0.2 +info: + title: Swagger Petstore - OpenAPI 3.0 + description: |- + This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about + Swagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach! + You can now help us improve the API whether it's by making changes to the definition itself or to the code. + That way, with time, we can improve the API in general, and expose some of the new features in OAS3. + + Some useful links: + - [The Pet Store repository](https://github.com/swagger-api/swagger-petstore) + - [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml) + termsOfService: http://swagger.io/terms/ + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.5 +externalDocs: + description: Find out more about Swagger + url: http://swagger.io +servers: + - url: "/api/v3" +tags: + - name: pet + description: Everything about your Pets + externalDocs: + description: Find out more + url: http://swagger.io + - name: store + description: Operations about user + - name: user + description: Access to Petstore orders + externalDocs: + description: Find out more about our store + url: http://swagger.io +paths: + "/pet": + put: + tags: + - pet + summary: Update an existing pet + description: Update an existing pet by Id + operationId: updatePet + requestBody: + description: Update an existent pet in the store + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + required: true + responses: + '200': + description: Successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + '400': + description: Invalid ID supplied + '404': + description: Pet not found + '405': + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + post: + tags: + - pet + summary: Add a new pet to the store + description: Add a new pet to the store + operationId: addPet + requestBody: + description: Create a new pet in the store + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + required: true + responses: + '200': + description: Successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + '405': + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + "/pet/findByStatus": + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: false + explode: true + schema: + type: string + default: available + enum: + - available + - pending + - sold + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + "$ref": "#/components/schemas/Pet" + '400': + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + "/pet/findByTags": + get: + tags: + - pet + summary: Finds Pets by tags + description: Multiple tags can be provided with comma separated strings. Use + tag1, tag2, tag3 for testing. + operationId: findPetsByTags + parameters: + - name: tags + in: query + description: Tags to filter by + required: false + explode: true + schema: + type: array + items: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + "$ref": "#/components/schemas/Pet" + '400': + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + "/pet/{petId}": + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + '400': + description: Invalid ID supplied + '404': + description: Pet not found + security: + - api_key: [] + - petstore_auth: + - write:pets + - read:pets + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + format: int64 + - name: name + in: query + description: Name of pet that needs to be updated + schema: + type: string + - name: status + in: query + description: Status of pet that needs to be updated + schema: + type: string + responses: + '405': + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + delete: + tags: + - pet + summary: Deletes a pet + description: '' + operationId: deletePet + parameters: + - name: api_key + in: header + description: '' + required: false + schema: + type: string + - name: petId + in: path + description: Pet id to delete + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + "/pet/{petId}/uploadImage": + post: + tags: + - pet + summary: uploads an image + description: '' + operationId: uploadFile + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + schema: + type: integer + format: int64 + - name: additionalMetadata + in: query + description: Additional Metadata + required: false + schema: + type: string + requestBody: + content: + application/octet-stream: + schema: + type: string + format: binary + responses: + '200': + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/ApiResponse" + security: + - petstore_auth: + - write:pets + - read:pets + "/store/inventory": + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + additionalProperties: + type: integer + format: int32 + security: + - api_key: [] + "/store/order": + post: + tags: + - store + summary: Place an order for a pet + description: Place a new order in the store + operationId: placeOrder + requestBody: + content: + application/json: + schema: + "$ref": "#/components/schemas/Order" + responses: + '200': + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/Order" + '405': + description: Invalid input + "/store/order/{orderId}": + get: + tags: + - store + summary: Find purchase order by ID + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generated exceptions + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of order that needs to be fetched + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/Order" + '400': + description: Invalid ID supplied + '404': + description: Order not found + delete: + tags: + - store + summary: Delete purchase order by ID + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid ID supplied + '404': + description: Order not found + "/user": + post: + tags: + - user + summary: Create user + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + description: Created user object + content: + application/json: + schema: + "$ref": "#/components/schemas/User" + responses: + default: + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/User" + "/user/createWithList": + post: + tags: + - user + summary: Creates list of users with given input array + description: Creates list of users with given input array + operationId: createUsersWithListInput + requestBody: + content: + application/json: + schema: + type: array + items: + "$ref": "#/components/schemas/User" + responses: + '200': + description: Successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/User" + default: + description: successful operation + "/user/login": + get: + tags: + - user + summary: Logs user into the system + description: '' + operationId: loginUser + parameters: + - name: username + in: query + description: The user name for login + required: false + schema: + type: string + - name: password + in: query + description: The password for login in clear text + required: false + schema: + type: string + responses: + '200': + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + schema: + type: integer + format: int32 + X-Expires-After: + description: date in UTC when toekn expires + schema: + type: string + format: date-time + content: + application/json: + schema: + type: string + '400': + description: Invalid username/password supplied + "/user/logout": + get: + tags: + - user + summary: Logs out current logged in user session + description: '' + operationId: logoutUser + parameters: [] + responses: + default: + description: successful operation + "/user/{username}": + get: + tags: + - user + summary: Get user by user name + description: '' + operationId: getUserByName + parameters: + - name: username + in: path + description: 'The name that needs to be fetched. Use user1 for testing. ' + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + "$ref": "#/components/schemas/User" + '400': + description: Invalid username supplied + '404': + description: User not found + put: + tags: + - user + summary: Update user + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + schema: + type: string + requestBody: + description: Update an existent user in the store + content: + application/json: + schema: + "$ref": "#/components/schemas/User" + responses: + default: + description: successful operation + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid username supplied + '404': + description: User not found +components: + schemas: + Order: + type: object + properties: + id: + type: integer + format: int64 + example: 10 + petId: + type: integer + format: int64 + example: 198772 + quantity: + type: integer + format: int32 + example: 7 + shipDate: + type: string + format: date-time + status: + type: string + description: Order Status + example: approved + enum: + - placed + - approved + - delivered + complete: + type: boolean + Customer: + type: object + properties: + id: + type: integer + format: int64 + example: 100000 + username: + type: string + example: fehguy + address: + type: array + items: + "$ref": "#/components/schemas/Address" + Address: + type: object + properties: + street: + type: string + example: 437 Lytton + city: + type: string + example: Palo Alto + state: + type: string + example: CA + zip: + type: string + example: '94301' + Category: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + name: + type: string + example: Dogs + User: + type: object + properties: + id: + type: integer + format: int64 + example: 10 + username: + type: string + example: theUser + firstName: + type: string + example: John + lastName: + type: string + example: James + email: + type: string + example: john@email.com + password: + type: string + example: '12345' + phone: + type: string + example: '12345' + userStatus: + type: integer + description: User Status + format: int32 + example: 1 + Tag: + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + Pet: + required: + - name + - photoUrls + type: object + properties: + id: + type: integer + format: int64 + example: 10 + name: + type: string + example: doggie + category: + "$ref": "#/components/schemas/Category" + photoUrls: + type: array + items: + type: string + tags: + type: array + items: + "$ref": "#/components/schemas/Tag" + status: + type: string + description: pet status in the store + enum: + - available + - pending + - sold + ApiResponse: + type: object + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string + requestBodies: + Pet: + description: Pet object that needs to be added to the store + content: + application/json: + schema: + "$ref": "#/components/schemas/Pet" + UserArray: + description: List of user object + content: + application/json: + schema: + type: array + items: + "$ref": "#/components/schemas/User" + securitySchemes: + petstore_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: https://petstore3.swagger.io/oauth/authorize + scopes: + write:pets: modify pets in your account + read:pets: read your pets + api_key: + type: apiKey + name: api_key + in: header diff --git a/conduit-commons/build.gradle b/conduit-commons/build.gradle new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/main/java/io/dataline/playground/HelloWorld.java b/conduit-commons/src/main/java/io/dataline/conduit/commons/HelloWorld.java similarity index 83% rename from src/main/java/io/dataline/playground/HelloWorld.java rename to conduit-commons/src/main/java/io/dataline/conduit/commons/HelloWorld.java index 1e75feecb94f..29ebe7facae8 100644 --- a/src/main/java/io/dataline/playground/HelloWorld.java +++ b/conduit-commons/src/main/java/io/dataline/conduit/commons/HelloWorld.java @@ -1,4 +1,4 @@ -package io.dataline.playground; +package io.dataline.conduit.commons; import com.google.common.base.Strings; diff --git a/src/test/java/io/dataline/playground/HelloWorldTest.java b/conduit-commons/src/test/java/io/dataline/conduit/commons/HelloWorldTest.java similarity index 83% rename from src/test/java/io/dataline/playground/HelloWorldTest.java rename to conduit-commons/src/test/java/io/dataline/conduit/commons/HelloWorldTest.java index c16964d9fbcf..2b93da2a3f44 100644 --- a/src/test/java/io/dataline/playground/HelloWorldTest.java +++ b/conduit-commons/src/test/java/io/dataline/conduit/commons/HelloWorldTest.java @@ -1,4 +1,4 @@ -package io.dataline.playground; +package io.dataline.conduit.commons; import org.junit.jupiter.api.Test; diff --git a/conduit-server/build.gradle b/conduit-server/build.gradle new file mode 100644 index 000000000000..7151a89c44b9 --- /dev/null +++ b/conduit-server/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'application' +} + +dependencies { + implementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.31.v20200723' + implementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.31.v20200723' + + implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3' + implementation group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet', version: '2.31' + implementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.31' + implementation group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.31' + + implementation project(':conduit-api') +} + +application { + mainClass = 'io.dataline.conduit.server.ServerApp' +} + +task fatjar(type: Jar) { + manifest { + attributes 'Main-Class': 'io.dataline.conduit.server.ServerApp' + } + baseName "${rootProject.name}-fatjar" + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} diff --git a/conduit-server/src/main/java/io/dataline/conduit/server/ServerApp.java b/conduit-server/src/main/java/io/dataline/conduit/server/ServerApp.java new file mode 100644 index 000000000000..90cdcc9a1de4 --- /dev/null +++ b/conduit-server/src/main/java/io/dataline/conduit/server/ServerApp.java @@ -0,0 +1,38 @@ +package io.dataline.conduit.server; + +import io.dataline.conduit.server.apis.PetApi; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletContainer; + +public class ServerApp { + + public ServerApp() { + } + + public void start() throws Exception { + Server server = new Server(8080); + + ServletContextHandler handler = new ServletContextHandler(); + + ResourceConfig rc = new ResourceConfig() + .registerClasses(PetApi.class); + + ServletHolder conduitServlet = new ServletHolder(new ServletContainer(rc)); + + handler.addServlet(conduitServlet, "/api/v1/*"); + + server.setHandler(handler); + + server.start(); + server.join(); + } + + public static void main(String[] args) throws Exception { + System.out.println("Starting Server..."); + + new ServerApp().start(); + } +} diff --git a/conduit-server/src/main/java/io/dataline/conduit/server/apis/PetApi.java b/conduit-server/src/main/java/io/dataline/conduit/server/apis/PetApi.java new file mode 100644 index 000000000000..735975c52bc4 --- /dev/null +++ b/conduit-server/src/main/java/io/dataline/conduit/server/apis/PetApi.java @@ -0,0 +1,55 @@ +package io.dataline.conduit.server.apis; + +import javax.validation.Valid; +import javax.ws.rs.Path; +import java.io.File; +import java.util.List; + +import io.dataline.conduit.api.model.ModelApiResponse; +import io.dataline.conduit.api.model.Pet; + +@Path("/pet") +public class PetApi implements io.dataline.conduit.api.PetApi { + + @Override + public Pet addPet(@Valid Pet pet) { + return null; + } + + @Override + public void deletePet(Long petId, String apiKey) { + + } + + @Override + public List findPetsByStatus(String status) { + return null; + } + + @Override + public List findPetsByTags(List tags) { + return null; + } + + @Override + public Pet getPetById(Long petId) { + final Pet pet = new Pet(); + pet.setId(petId); + return pet; + } + + @Override + public Pet updatePet(@Valid Pet pet) { + return null; + } + + @Override + public void updatePetWithForm(Long petId, String name, String status) { + + } + + @Override + public ModelApiResponse uploadFile(Long petId, String additionalMetadata, @Valid File body) { + return null; + } +} diff --git a/conduit-server/src/test/java/io/dataline/conduit/server/ServerAppTest.java b/conduit-server/src/test/java/io/dataline/conduit/server/ServerAppTest.java new file mode 100644 index 000000000000..d47abd4733d9 --- /dev/null +++ b/conduit-server/src/test/java/io/dataline/conduit/server/ServerAppTest.java @@ -0,0 +1,12 @@ +package io.dataline.conduit.server; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ServerAppTest { + @Test + void name() { + assertEquals(1, 1); + } +} diff --git a/settings.gradle b/settings.gradle index 853ad6c87dfd..03909be23fd7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ rootProject.name = 'conduit' + +include 'conduit-api' +include 'conduit-server' +include 'conduit-commons' diff --git a/src/main/java/io/dataline/commons/Sample.java b/src/main/java/io/dataline/commons/Sample.java deleted file mode 100644 index 0f55adb3ffe4..000000000000 --- a/src/main/java/io/dataline/commons/Sample.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.dataline.commons; - -public class Sample { - -} diff --git a/tools/app/start.sh b/tools/app/start.sh new file mode 100755 index 000000000000..0427a14512ba --- /dev/null +++ b/tools/app/start.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env sh + +set -e + +. tools/lib/lib.sh + +PORT=${PORT:-8080} + +main() { + assert_root + + docker run --rm -it \ + -p $PORT:8080 \ + dataline/conduit:$VERSION +} + +main "$@" diff --git a/tools/lib/lib.sh b/tools/lib/lib.sh new file mode 100644 index 000000000000..d429b4a47042 --- /dev/null +++ b/tools/lib/lib.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + +VERSION=$(cat .version) + +error() { + echo "$@" + exit 1 +} + +assert_root() { + [ -f .root ] || error "Must run from root" +}