/** * Ensure that state models that we know to be good pass validation */ @Test public void testValidModels() { StateModelDefinition masterSlave = new StateModelDefinition(StateModelConfigGenerator.generateConfigForMasterSlave()); Assert.assertTrue(masterSlave.isValid()); StateModelDefinition leaderStandby = new StateModelDefinition(StateModelConfigGenerator.generateConfigForLeaderStandby()); Assert.assertTrue(leaderStandby.isValid()); StateModelDefinition onlineOffline = new StateModelDefinition(StateModelConfigGenerator.generateConfigForOnlineOffline()); Assert.assertTrue(onlineOffline.isValid()); }
@Override public boolean createStateModelDef(StateModelDefinition stateModelDef) { String path = PropertyPathBuilder.stateModelDef(_clusterName, stateModelDef.getId()); HelixProperty property = getProperty(new PropertyKey.Builder(_clusterName).stateModelDef(stateModelDef.getId())); // Set new StateModelDefinition if it is different from old one. if (property != null) { // StateModelDefinition need to be updated if (!new StateModelDefinition(property.getRecord()).equals(stateModelDef)) { return stateModelDef.isValid() && _baseDataAccessor .set(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } } else { // StateModeDefinition does not exist return stateModelDef.isValid() && _baseDataAccessor .create(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } // StateModelDefinition exists but not need to be updated return true; }
@Override public boolean createStateModelDef(StateModelDefinition stateModelDef) { String path = PropertyPathBuilder.stateModelDef(_clusterName, stateModelDef.getId()); HelixProperty property = getProperty(new PropertyKey.Builder(_clusterName).stateModelDef(stateModelDef.getId())); // Set new StateModelDefinition if it is different from old one. if (property != null) { // StateModelDefinition need to be updated if (!new StateModelDefinition(property.getRecord()).equals(stateModelDef)) { return stateModelDef.isValid() && _baseDataAccessor .set(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } } else { // StateModeDefinition does not exist return stateModelDef.isValid() && _baseDataAccessor .create(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } // StateModelDefinition exists but not need to be updated return true; }
Assert.assertFalse(stateModel.isValid());
/** * Ensure that Helix responds negatively if DROPPED is not specified */ @Test public void testNoDroppedState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addTransition("OFFLINE", "SLAVE") .addTransition("SLAVE", "MASTER").addTransition("MASTER", "SLAVE") .addTransition("SLAVE", "OFFLINE").build(); Assert.assertFalse(stateModel.isValid()); }
/** * The initial state should be added as a state, otherwise validation check should fail */ @Test public void testInitialStateIsNotState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("MASTER") .addState("SLAVE").addState("DROPPED").addTransition("OFFLINE", "SLAVE") .addTransition("SLAVE", "MASTER").addTransition("SLAVE", "OFFLINE") .addTransition("OFFLINE", "DROPPED").addTransition("MASTER", "SLAVE").build(); Assert.assertFalse(stateModel.isValid()); }
/** * The initial state should be able to reach all states, should fail validation otherwise */ @Test public void testUnreachableState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "OFFLINE") .addTransition("OFFLINE", "DROPPED").addTransition("MASTER", "SLAVE") .addTransition("MASTER", "DROPPED").build(); Assert.assertFalse(stateModel.isValid()); }
/** * Ensure that Helix can catch when a state doesn't have a path to DROPPED */ @Test public void testNoPathToDropped() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED").build(); Assert.assertFalse(stateModel.isValid()); // now see that adding MASTER-DROPPED fixes the problem stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "DROPPED").build(); Assert.assertTrue(stateModel.isValid()); }
/** * SRC and DEST in a transition SRC-TEST must be valid states */ @Test public void testTransitionsWithInvalidStates() { // invalid to state StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "SLAVE").addTransition("OFFLINE", "INVALID").build(); Assert.assertFalse(stateModel.isValid()); // invalid from state stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "SLAVE").addTransition("INVALID", "MASTER").build(); Assert.assertFalse(stateModel.isValid()); }
Assert.assertTrue(stateModel.isValid());
assert (statemodelDefinition.isValid());