/*-
* -\-\-
* Helios Integration Tests
* --
* Copyright (C) 2016 Spotify AB
* --
* 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.
* -/-/-
*/
package com.spotify.helios;
import static com.spotify.helios.Utils.agentImage;
import static com.spotify.helios.Utils.masterImage;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import com.google.common.collect.ImmutableList;
import com.spotify.helios.Utils.AgentStatusProber;
import com.spotify.helios.common.protocol.CreateJobResponse;
import com.spotify.helios.common.protocol.JobDeleteResponse;
import com.spotify.helios.common.protocol.JobDeployResponse;
import com.spotify.helios.common.protocol.JobUndeployResponse;
import com.spotify.helios.testing.HeliosDeploymentResource;
import com.spotify.helios.testing.HeliosSoloDeployment;
import com.spotify.helios.testing.TemporaryJob;
import com.spotify.helios.testing.TemporaryJobBuilder;
import com.spotify.helios.testing.TemporaryJobs;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
@SuppressWarnings("AbbreviationAsWordInName")
public class HeliosIT {
@ClassRule
public static HeliosDeploymentResource solo = new HeliosDeploymentResource(
HeliosSoloDeployment.fromEnv()
.heliosSoloImage(Utils.soloImage())
.checkForNewImages(false)
.removeHeliosSoloOnExit(false)
.logStreamProvider(null)
.env("REGISTRAR_HOST_FORMAT", "_${service}._${protocol}.test.${domain}")
.build()
);
@Rule
public TemporaryJobs temporaryJobs = TemporaryJobs.builder()
.client(solo.client())
.build();
private static final String TEST_USER = "HeliosIT";
private static final String TEST_HOST = "test-host";
private String masterEndpoint;
@Before
public void setup() throws Exception {
// zookeeper
final TemporaryJob zk = temporaryJobs.job()
.image("spotify/zookeeper:3.4.5")
.port("zk", 2181)
.deploy();
final String zkEndpoint = zk.address("zk").toString();
// helios master
final TemporaryJob master = temporaryJobs.job()
.image(masterImage())
.port("helios", 5801)
.command("--zk", zkEndpoint)
.deploy();
masterEndpoint = "http://" + master.address("helios").toString();
final ImmutableList.Builder<String> args = new ImmutableList.Builder<String>()
.add("--zk")
.add(zkEndpoint)
.add("--docker")
.add(System.getenv("DOCKER_HOST"))
.add("--name")
.add(TEST_HOST);
final String certPath = System.getenv("DOCKER_CERT_PATH");
if (certPath != null) {
args.add("--docker-cert-path=/certs");
}
// helios agent
final TemporaryJobBuilder agent = temporaryJobs.job()
.image(agentImage())
.prober(new AgentStatusProber(masterEndpoint, TEST_USER, TEST_HOST))
.port("agent", 8080) // need to expose fake port just so prober gets invoked
.command(args.build());
if (certPath != null) {
agent.volume("/certs", certPath);
}
agent.deploy();
}
@Test
public void test() throws Exception {
final CreateJobResponse create = cli(CreateJobResponse.class, "create", "test:1",
"spotify/busybox:latest");
assertThat(create.getStatus(), equalTo(CreateJobResponse.Status.OK));
final JobDeployResponse deploy = cli(JobDeployResponse.class, "deploy", "test:1", TEST_HOST);
assertThat(deploy.getStatus(), equalTo(JobDeployResponse.Status.OK));
final JobUndeployResponse undeploy = cli(JobUndeployResponse.class,
"undeploy", "--yes", "test:1", "-a");
assertThat(undeploy.getStatus(), equalTo(JobUndeployResponse.Status.OK));
final JobDeleteResponse delete = cli(JobDeleteResponse.class, "remove", "--yes", "test:1");
assertThat(delete.getStatus(), equalTo(JobDeleteResponse.Status.OK));
}
private <T> T cli(final Class<T> klass, final String... args) throws Exception {
return Utils.cli(klass, masterEndpoint, args);
}
}