/*
* 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.addthis.hydra.job;
import java.util.List;
import com.addthis.basis.test.SlowTest;
import com.addthis.bark.StringSerializer;
import com.addthis.codec.Codec;
import com.addthis.codec.json.CodecJSON;
import com.addthis.hydra.job.store.DataStoreUtil;
import com.addthis.hydra.job.store.SpawnDataStore;
import com.addthis.hydra.util.ZkCodecStartUtil;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import org.junit.After;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static com.addthis.hydra.job.store.SpawnDataStoreKeys.SPAWN_JOB_CONFIG_PATH;
import static org.junit.Assert.*;
@Category(SlowTest.class)
public class JobConfigManagerTest extends ZkCodecStartUtil {
private static final Codec codec = CodecJSON.INSTANCE;
private JobConfigManager jobConfigManager;
private SpawnDataStore spawnDataStore;
@After
public void cleanup() throws Exception {
if (spawnDataStore != null) {
spawnDataStore.close();
}
}
private JobConfigManager getJobConfigManager() throws Exception {
if (spawnDataStore == null) {
spawnDataStore = DataStoreUtil.makeCanonicalSpawnDataStore();
}
if (jobConfigManager == null) {
jobConfigManager = new JobConfigManager(spawnDataStore, null);
}
return jobConfigManager;
}
@Test
public void testBasicExists() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "foo";
IJob job = new ZnodeJob(id);
job.setQueryConfig(new JobQueryConfig());
jcm.addJob(job);
assertNotNull(spawnDataStore.getChild(SPAWN_JOB_CONFIG_PATH, id));
assertNotNull(spawnDataStore.get(SPAWN_JOB_CONFIG_PATH + "/foo/config"));
assertNotNull(spawnDataStore.get(SPAWN_JOB_CONFIG_PATH + "/foo/queryconfig"));
}
@Test
public void testDeserQC() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "foo";
IJob job = new ZnodeJob(id);
jcm.addJob(job);
String raw = spawnDataStore.get(SPAWN_JOB_CONFIG_PATH + "/foo/queryconfig");
assertNotNull(raw);
JobQueryConfig jqc = codec.decode(JobQueryConfig.class, StringSerializer.deserialize(raw.getBytes()).getBytes());
assertEquals(jqc, new JobQueryConfig());
}
@Test
public void testChangeData() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "foo";
IJob job = new ZnodeJob(id);
JobQueryConfig jqc = new JobQueryConfig();
job.setQueryConfig(jqc);
jcm.addJob(job);
String qc = spawnDataStore.get(SPAWN_JOB_CONFIG_PATH + "/foo/queryconfig");
// What's up with logging config?
//logger.warn("qc: " + qc);
JobQueryConfig cycle_jqc = codec.decode(JobQueryConfig.class, qc.getBytes());
assertEquals(jqc, cycle_jqc);
// change stuff
jqc.setCanQuery(false);
job.setQueryConfig(jqc);
jcm.updateJob(job);
String qc2 = spawnDataStore.get(SPAWN_JOB_CONFIG_PATH + "/foo/queryconfig");
JobQueryConfig cycle_jqc_2 = codec.decode(JobQueryConfig.class, qc2.getBytes());
// how to do Not=?
//System.out.println(cycle_jqc_2);
assertFalse(cycle_jqc.equals(cycle_jqc_2));
}
@Test
public void testDelete() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "foo";
IJob job = new ZnodeJob(id);
job.setQueryConfig(new JobQueryConfig());
jcm.addJob(job);
assertNotNull(spawnDataStore.getChild(SPAWN_JOB_CONFIG_PATH, id));
jcm.deleteJob(job.getId());
assertNull(spawnDataStore.getChild(SPAWN_JOB_CONFIG_PATH, "foo"));
}
@Test
public void testGetJob() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "bar";
IJob job = new ZnodeJob(id);
job.setQueryConfig(new JobQueryConfig());
jcm.addJob(job);
IJob jobBack = jcm.getJob("bar");
assertNotNull(jobBack);
assertEquals(job.getId(), jobBack.getId());
assertEquals(job.getQueryConfig(), jobBack.getQueryConfig());
assertEquals(job.getCopyOfTasks(), jobBack.getCopyOfTasks());
}
@Test
public void testGetJobNull() throws Exception {
JobConfigManager jcm = getJobConfigManager();
IJob job = new ZnodeJob("foo");
jcm.addJob(job);
IJob jobBack = jcm.getJob("noexist");
assertNull(jobBack);
}
@Test
public void testGetJobWithTasks() throws Exception {
JobConfigManager jcm = getJobConfigManager();
String id = "bar";
IJob job = new ZnodeJob(id);
List<JobTask> tasks = ImmutableList.of(new JobTask("s1.local", 1, 5), new JobTask("s1.local", 2, 5), new JobTask("s2.local", 3, 6));
job.setTasks(tasks);
jcm.addJob(job);
IJob jobBack = jcm.getJob("bar");
assertEquals(job.getId(), jobBack.getId());
assertEquals(job.getQueryConfig(), jobBack.getQueryConfig());
assertEquals(ImmutableList.copyOf(Collections2.transform(job.getCopyOfTasks(), new nodeGetter())),
ImmutableList.copyOf(Collections2.transform(jobBack.getCopyOfTasks(), new nodeGetter())));
}
public static class nodeGetter implements Function<JobTask, Integer> {
@Override
public Integer apply(JobTask t) {
return t.getTaskID();
}
}
@Test
public void testGetJobs() throws Exception {
JobConfigManager jcm = getJobConfigManager();
jcm.addJob(new ZnodeJob("foo"));
jcm.addJob(new ZnodeJob("bar"));
new JobConfigManager(spawnDataStore);
}
}