/*- * -\-\- * Helios Services * -- * 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.servicescommon; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import com.spotify.helios.ZooKeeperTestingServerManager; import com.spotify.helios.common.descriptors.JobId; import com.spotify.helios.servicescommon.coordination.DefaultZooKeeperClient; import com.spotify.helios.servicescommon.coordination.Paths; import com.spotify.helios.servicescommon.coordination.ZooKeeperClient; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ZooKeeperRegistrarServiceUtilTest { private static final String HOSTNAME = "host"; private static final String ID = UUID.randomUUID().toString(); private static final JobId JOB_ID1 = JobId.newBuilder().setName("job1").setVersion("0.1.0").build(); private ZooKeeperTestingServerManager testingServerManager; private ZooKeeperClient zkClient; @Before public void setUp() throws Exception { testingServerManager = new ZooKeeperTestingServerManager(); testingServerManager.awaitUp(5, TimeUnit.SECONDS); zkClient = new DefaultZooKeeperClient(testingServerManager.curatorWithSuperAuth()); } @After public void tearDown() throws Exception { zkClient.close(); if (testingServerManager != null) { testingServerManager.close(); } } @Test public void testRegisterHost() throws Exception { final String idPath = Paths.configHostId(HOSTNAME); ZooKeeperRegistrarUtil.registerHost(zkClient, idPath, HOSTNAME, ID); assertNotNull(zkClient.exists(Paths.configHost(HOSTNAME))); assertNotNull(zkClient.exists(Paths.configHostJobs(HOSTNAME))); assertNotNull(zkClient.exists(Paths.configHostPorts(HOSTNAME))); assertNotNull(zkClient.exists(Paths.statusHost(HOSTNAME))); assertNotNull(zkClient.exists(Paths.statusHostJobs(HOSTNAME))); assertEquals(ID, new String(zkClient.getData(idPath))); } @Test public void testDeregisterHost() throws Exception { final String idPath = Paths.configHostId(HOSTNAME); ZooKeeperRegistrarUtil.registerHost(zkClient, idPath, HOSTNAME, ID); ZooKeeperRegistrarUtil.deregisterHost(zkClient, HOSTNAME); assertNull(zkClient.exists(Paths.configHost(HOSTNAME))); assertNull(zkClient.exists(Paths.statusHost(HOSTNAME))); } // Verify that the re-registering: // * does not change the /config/hosts/<host> subtree, except the host-id. // * deletes everything under /status/hosts/<host> subtree. @Test public void testReRegisterHost() throws Exception { // Register the host & add some fake data to its status & config dirs final String idPath = Paths.configHostId(HOSTNAME); ZooKeeperRegistrarUtil.registerHost(zkClient, idPath, HOSTNAME, ID); zkClient.ensurePath(Paths.statusHostJob(HOSTNAME, JOB_ID1)); zkClient.ensurePath(Paths.configHostJob(HOSTNAME, JOB_ID1)); final Stat jobConfigStat = zkClient.stat(Paths.configHostJob(HOSTNAME, JOB_ID1)); // ... and then re-register it final String newId = UUID.randomUUID().toString(); ZooKeeperRegistrarUtil.reRegisterHost(zkClient, HOSTNAME, newId); // Verify that the host-id was updated assertEquals(newId, new String(zkClient.getData(idPath))); // Verify that /status/hosts/<host>/jobs exists and is EMPTY assertNotNull(zkClient.exists(Paths.statusHostJobs(HOSTNAME))); assertThat(zkClient.listRecursive(Paths.statusHostJobs(HOSTNAME)), contains(Paths.statusHostJobs(HOSTNAME))); // Verify that re-registering didn't change the nodes in /config/hosts/<host>/jobs assertEquals( jobConfigStat, zkClient.stat(Paths.configHostJob(HOSTNAME, JOB_ID1)) ); } }