Skip to content

Commit

Permalink
adding custom logging test + local runtimes-common integration test (#…
Browse files Browse the repository at this point in the history
…134)

* adding custom logging test + local runtimes-common integration test

* organize imports + namings

* changed test-app to lazy init + local-cloud-builder

* DEVELOPING instructions updated + enforcer plugin fixed for property resolution

* cleanup

* cleanup

* Add shutdown tests back to maven execution (#149)

* cleanup + adding automated application-default credentials logic instead of GOOGLE_APPLICATION_CREDENTIALS

* cleaning up unnecessary dependencies
  • Loading branch information
balopat committed Sep 7, 2017
1 parent 1a7548b commit ad4b0a8
Show file tree
Hide file tree
Showing 17 changed files with 316 additions and 33 deletions.
8 changes: 7 additions & 1 deletion DEVELOPING.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,15 @@ $ ./scripts/integration_test.sh $RUNTIME_IMAGE

**Run ONLY Local Docker integration tests:**
```bash
$ ./scripts/local_integration_test.sh $RUNTIME_IMAGE
$ ./scripts/local_runtimes_common_integration_test.sh $RUNTIME_IMAGE
```

**Run ONLY Local shutdown tests:**
```bash
$ ./scripts/local_shutdown_test.sh $RUNTIME_IMAGE
```


**Run ONLY App Engine flexible environment integration tests:**
```bash
$ ./scripts/ae_integration_test.sh $RUNTIME_IMAGE
Expand Down
11 changes: 11 additions & 0 deletions openjdk-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,17 @@

<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>enforce</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
Expand Down
4 changes: 4 additions & 0 deletions openjdk8/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@
<id>common-structure-test</id>
<phase>integration-test</phase>
</execution>
<execution>
<id>local-shutdown-test</id>
<phase>integration-test</phase>
</execution>
<!-- Execute structure tests specific to this module -->
<execution>
<id>openjdk8-structure-test</id>
Expand Down
4 changes: 4 additions & 0 deletions openjdk9/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@
<id>common-structure-test</id>
<phase>integration-test</phase>
</execution>
<execution>
<id>local-shutdown-test</id>
<phase>integration-test</phase>
</execution>
<!-- Execute structure tests specific to this module -->
<execution>
<id>openjdk9-structure-test</id>
Expand Down
42 changes: 25 additions & 17 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,24 +67,16 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0,)</version>
</requireMavenVersion>
<requireJavaVersion>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.3,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>[1.8,)</version>
</requireJavaVersion>
</rules>
</configuration>
</execution>
</executions>
</requireJavaVersion>
</rules>
</configuration>
</plugin>

<plugin>
Expand Down Expand Up @@ -191,6 +183,22 @@
</arguments>
</configuration>
</execution>
<execution>
<id>local-shutdown-test</id>
<!-- Do not bind to a phase, so that child modules can explicitly choose the phase for
this execution -->
<phase>none</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${project.parent.basedir}/scripts/local_shutdown_test.sh</executable>
<workingDirectory>${project.build.outputDirectory}</workingDirectory>
<arguments>
<argument>${docker.image.name}</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>

Expand Down
1 change: 1 addition & 0 deletions scripts/gcloud-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ gcloud auth activate-service-account --key-file=$KEYFILE
gcloud config set project $GCP_PROJECT
gcloud config set compute/zone us-east1-b
gcloud components install beta kubectl -q
gcloud components install beta container-builder-local
2 changes: 1 addition & 1 deletion scripts/integration_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ fi
# is not recommended
readonly gaeDeploymentVersion=$2

${dir}/local_integration_test.sh ${imageUnderTest}
${dir}/local_shutdown_test.sh ${imageUnderTest}

${dir}/ae_integration_test.sh ${imageUnderTest} ${gaeDeploymentVersion}

Expand Down
1 change: 0 additions & 1 deletion scripts/integration_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ steps:
- name: 'gcr.io/java-runtime-test/integration-test'
args:
- '--url=${_DEPLOYED_APP_URL}'
- '--skip-custom-logging-tests' # blocked by b/33415496
- '--skip-standard-logging-tests' # blocked by b/33415496
- '--skip-custom-tests'

109 changes: 109 additions & 0 deletions scripts/local_runtimes_common_integration_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
#!/bin/bash

# Copyright 2017 Google Inc. All rights reserved.

# 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

# http://www.apache.org/licenses/LICENSE-2.0

# 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.


# exit on command failure
set -e

readonly dir=$(dirname $0)
readonly projectRoot="$dir/.."
readonly testAppDir="$projectRoot/test-application"
readonly deployDir="$testAppDir/target/deploy"

APP_IMAGE='openjdk-local-integration'
CONTAINER=${APP_IMAGE}-container
OUTPUT_FILE=${CONTAINER}-output.txt
DEPLOYMENT_TOKEN=$(uuidgen)

readonly imageUnderTest=$1
if [[ -z "$imageUnderTest" ]]; then
echo "Usage: ${0} <image_under_test>"
exit 1
fi

if [[ ! -f $HOME/.config/gcloud/application_default_credentials.json ]]; then
# get default application credentials
gcloud auth application-default login
fi

# build the test app
pushd ${testAppDir}
mvn clean package -Ddeployment.token="${DEPLOYMENT_TOKEN}" -DskipTests --batch-mode
popd

# build app container locally
pushd $deployDir
export STAGING_IMAGE=$imageUnderTest
envsubst < Dockerfile.in > Dockerfile
echo "Building app container..."
docker build -t $APP_IMAGE . || docker build -t $APP_IMAGE .

docker rm -f $CONTAINER || echo "Integration-test-app container is not running, ready to start a new instance."

# run app container locally to test shutdown logging
echo "Starting app container..."
docker run --rm --name $CONTAINER -p 8080 \
-e "SHUTDOWN_LOGGING_THREAD_DUMP=true" \
-e "SHUTDOWN_LOGGING_HEAP_INFO=true" \
-v "$HOME/.config/gcloud/:/root/.config/gcloud" $APP_IMAGE &> $OUTPUT_FILE &

function waitForOutput() {
found_output='false'
for run in {1..10}
do
grep "$1" $OUTPUT_FILE && found_output='true' && break
sleep 1
done

if [ "$found_output" == "false" ]; then
cat $OUTPUT_FILE
echo "did not match '$1' in '$OUTPUT_FILE'"
exit 1
fi
}

waitForOutput 'Started Application'

getPort() {
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}{{(index $conf 0).HostPort}}{{end}}' ${CONTAINER}
}


PORT=`getPort`

nslookup `hostname` | grep Address | grep -v 127.0 | awk '{print $2}' > /tmp/myip
MYIP=`cat /tmp/myip`

DEPLOYED_APP_URL=http://$MYIP:$PORT

echo app is deployed to $DEPLOYED_APP_URL, making sure it accepts connections


until [[ $(curl --silent --fail "$DEPLOYED_APP_URL/deployment.token" | grep "$DEPLOYMENT_TOKEN") ]]; do
sleep 2
done
popd

docker rm -f metadata || echo "ready to run local cloud builder"

# run in cloud container builder
echo "Running integration tests on application that is deployed at $DEPLOYED_APP_URL"
echo `pwd`
container-builder-local \
--config ${dir}/integration_test.yaml \
--substitutions "_DEPLOYED_APP_URL=$DEPLOYED_APP_URL" \
--dryrun=false \
${dir}
File renamed without changes.
8 changes: 4 additions & 4 deletions test-application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,12 @@
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-monitoring</artifactId>
<version>0.20.1-alpha</version>
<version>0.22.0-alpha</version>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-credentials</artifactId>
<version>0.7.0</version>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-logging</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.google.cloud.runtimes;

import static org.springframework.web.bind.annotation.RequestMethod.POST;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.POST;

@RestController
public class ExceptionController {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.google.cloud.runtimes;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

@RestController
public class HelloController {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.google.cloud.runtimes;

import com.google.cloud.MonitoredResource;
import com.google.cloud.logging.LogEntry;
import com.google.cloud.logging.Logging;
import com.google.cloud.logging.Payload;
import com.google.cloud.logging.Severity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import static org.springframework.web.bind.annotation.RequestMethod.POST;

@RestController
public class LoggingTestController {

@Autowired
@Lazy
private Logging logging;

private static Logger LOG = Logger.getLogger(LoggingTestController.class.getName());

public static class LoggingTestRequest {
private String level;
private String log_name;
private String token;

public void setLevel(String level) {
this.level = level;
}

public void setLog_name(String log_name) {
this.log_name = log_name;
}

public void setToken(String token) {
this.token = token;
}


@Override
public String toString() {
return "LoggingTestRequest{" +
"level='" + level + '\'' +
", log_name='" + log_name + '\'' +
", token='" + token + '\'' +
'}';
}
}

@RequestMapping(path = "/logging_custom", method = POST)
public String handleLoggingTestRequest(@RequestBody LoggingTestRequest loggingTestRequest) throws IOException, InterruptedException {
LOG.info(String.valueOf(loggingTestRequest));

List<LogEntry> entries = new ArrayList<>();
Payload.StringPayload payload = Payload.StringPayload.of(loggingTestRequest.token);
Severity severity = Severity.valueOf(loggingTestRequest.level);
LogEntry entry = LogEntry.newBuilder(payload)
.setSeverity(severity)
.setLogName(loggingTestRequest.log_name)
.setResource(MonitoredResource.newBuilder("global").build())
.build();
entries.add(entry);
logging.write(entries);
LOG.info("Log written to StackDriver: " + entries);
return "OK";
}


}
Loading

0 comments on commit ad4b0a8

Please sign in to comment.