@Override public synchronized void releaseRandomValues( Application application, Instance instance ) { // Only used for random ports. // We only remove the ports used by this instance. List<Integer> portsToRelease = new ArrayList<> (); for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { if( ! var.isRandom() || var.getRandomKind() != RandomKind.PORT ) continue; String value = instance.overriddenExports.get( var.getName()); if( value != null ) portsToRelease.add( Integer.parseInt( value )); } // Update the cache InstanceContext ctx = findAgentContext( application, instance ); List<Integer> ports = this.agentToRandomPorts.get( ctx ); if( ports != null ) { ports.removeAll( portsToRelease ); if( ports.isEmpty()) this.agentToRandomPorts.remove( ctx ); } }
/** * A trick to validate instances with random variables. * @param instance a non-null instance * @param set true to setup the trick, false to tear it down */ private static void randomVariablesTrickForValidation( Instance instance, boolean set ) { final String trickValue = "@# --- #@"; Map<String,ExportedVariable> exportedVariables = instance.getComponent() != null ? instance.getComponent().exportedVariables : new HashMap<String,ExportedVariable>( 0 ); for( ExportedVariable var : exportedVariables.values()) { if( ! var.isRandom()) continue; String overriddenExport = instance.overriddenExports.get( var.getName()); // Set and no export? => Set it. if( set && overriddenExport == null ) instance.overriddenExports.put( var.getName(), trickValue ); // Unset and trick value? => Unset it. else if( ! set && Objects.equals( trickValue, overriddenExport )) instance.overriddenExports.remove( var.getName()); } } }
@Override public void restoreRandomValuesCache( Application application ) { // Only used for random ports. for( Instance instance : InstanceHelpers.getAllInstances( application )) { // Restore ALL the variables List<ExportedVariable> variablesToRegenerate = new ArrayList<> (); for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { // We only care about random ports if( ! var.isRandom() || var.getRandomKind() != RandomKind.PORT ) continue; // Find the overridden value. // If it exists, restore it. String value = instance.overriddenExports.get( var.getName()); if( value != null && ! acknowledgePort( application, instance, var.getName())) variablesToRegenerate.add( var ); } // Restoration may have failed for some. Regenerate new ports for( ExportedVariable var : variablesToRegenerate ) { this.logger.warning( "Generating a new random port for " + var.getName() + " in instance " + instance + " of " + application ); generateRandomPort( application, instance, var.getName()); } // Save the updated model? if( ! variablesToRegenerate.isEmpty()) ConfigurationUtils.saveInstances( application ); } }
@Override public synchronized void generateRandomValues( Application application, Instance instance ) { // Exported variables that are random will be set a value for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { // Not random? if( ! var.isRandom()) continue; // Port if( var.getRandomKind() == RandomKind.PORT ) { // Acknowledge: verify a random value was not already set on it. // Otherwise, generate a random port and associate it. if( ! acknowledgePort( application, instance, var.getName())) generateRandomPort( application, instance, var.getName()); } } // Save the updated model ConfigurationUtils.saveInstances( application ); }
@Test public void testParseExportedVariables_simpleListOfVariables() { Map<String,ExportedVariable> variables = VariableHelpers.parseExportedVariables( "key1 = value1, key2=value2 , key3 = value3 " ); Assert.assertEquals( 3, variables.size()); ExportedVariable var = variables.get( "key1" ); Assert.assertEquals( "value1", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key2" ); Assert.assertEquals( "value2", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key3" ); Assert.assertEquals( "value3", var.getValue()); Assert.assertFalse( var.isRandom()); }
@Test public void testParseExportedVariables_listWithMixedValues() { Map<String,ExportedVariable> variables = VariableHelpers.parseExportedVariables( "key1 = \"value1 is here\" , key2= value2, key3 = \"key33\", key4 = oops " ); Assert.assertEquals( 4, variables.size()); ExportedVariable var = variables.get( "key1" ); Assert.assertEquals( "value1 is here", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key2" ); Assert.assertEquals( "value2", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key3" ); Assert.assertEquals( "key33", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key4" ); Assert.assertEquals( "oops", var.getValue()); Assert.assertFalse( var.isRandom()); }
@Test public void testParseExportedVariables_variableWithComplexValue() { Map<String,ExportedVariable> variables = VariableHelpers.parseExportedVariables( "key1 = \"value1\"" ); Assert.assertEquals( 1, variables.size()); ExportedVariable var = variables.get( "key1" ); Assert.assertEquals( "value1", var.getValue()); Assert.assertFalse( var.isRandom()); variables = VariableHelpers.parseExportedVariables( " key1=\" value1 \" " ); Assert.assertEquals( 1, variables.size()); var = variables.get( "key1" ); Assert.assertEquals( " value1 ", var.getValue()); Assert.assertFalse( var.isRandom()); }
@Test public void testParseExportedVariables_listWithMixedValuesAndRandom() { Map<String,ExportedVariable> variables = VariableHelpers.parseExportedVariables( "key1 = \"value1 is here\" , random[port] key2= value2, key3 = \"key33\", key4 = oops " ); Assert.assertEquals( 4, variables.size()); ExportedVariable var = variables.get( "key1" ); Assert.assertEquals( "value1 is here", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key2" ); Assert.assertEquals( "value2", var.getValue()); Assert.assertTrue( var.isRandom()); Assert.assertEquals( RandomKind.PORT, var.getRandomKind()); var = variables.get( "key3" ); Assert.assertEquals( "key33", var.getValue()); Assert.assertFalse( var.isRandom()); var = variables.get( "key4" ); Assert.assertEquals( "oops", var.getValue()); Assert.assertFalse( var.isRandom()); } }
errors.add( new ModelError( RM_INVALID_VARIABLE_NAME, component, variable( exportedVarName ))); if( exportedVariable.isRandom()) { if( exportedVariable.getRandomKind() == null ) errors.add( new ModelError( RM_INVALID_RANDOM_KIND, component, unrecognized( exportedVariable.getRawKind())));
@Test public void testComponentsWithInvalidRandomPorts() throws Exception { File f = TestUtils.findTestFile( "/configurations/invalid/component-with-invalid-random-port.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs g = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Component comp2 = ComponentHelpers.findComponent( g, "comp2" ); Assert.assertNotNull( comp2 ); Assert.assertEquals( 3, comp2.exportedVariables.size()); Assert.assertNotNull( comp2.exportedVariables.get( "ip" )); Assert.assertNotNull( comp2.exportedVariables.get( "httpPort" )); Assert.assertNull( comp2.exportedVariables.get( "httpPort" ).getValue()); Assert.assertTrue( comp2.exportedVariables.get( "httpPort" ).isRandom()); Assert.assertEquals( RandomKind.PORT, comp2.exportedVariables.get( "httpPort" ).getRandomKind()); Assert.assertNotNull( comp2.exportedVariables.get( "ajpPort" )); Assert.assertNull( comp2.exportedVariables.get( "ajpPort" ).getValue()); Assert.assertTrue( comp2.exportedVariables.get( "ajpPort" ).isRandom()); Assert.assertNull( comp2.exportedVariables.get( "ajpPort" ).getRandomKind()); }
@Test public void testParseExportedVariables_simpleVariables() { Map<String,ExportedVariable> variables = VariableHelpers.parseExportedVariables( "key = value" ); Assert.assertEquals( 1, variables.size()); ExportedVariable var = variables.get( "key" ); Assert.assertEquals( "value", var.getValue()); Assert.assertFalse( var.isRandom()); variables = VariableHelpers.parseExportedVariables( "key=value" ); Assert.assertEquals( 1, variables.size()); var = variables.get( "key" ); Assert.assertEquals( "value", var.getValue()); Assert.assertFalse( var.isRandom()); variables = VariableHelpers.parseExportedVariables( "" ); Assert.assertEquals( 0, variables.size()); variables = VariableHelpers.parseExportedVariables( " " ); Assert.assertEquals( 0, variables.size()); variables = VariableHelpers.parseExportedVariables( "ip" ); Assert.assertEquals( 1, variables.size()); var = variables.get( "ip" ); Assert.assertNull( var.getValue()); Assert.assertFalse( var.isRandom()); }
@Test public void test_complexVariablesValues() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/component-with-complex-variables-values.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs graphs = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Assert.assertEquals( 1, graphs.getRootComponents().size()); Component comp = graphs.getRootComponents().iterator().next(); Assert.assertEquals( 6, comp.exportedVariables.size()); ExportedVariable var = comp.exportedVariables.get( "key1" ); Assert.assertEquals( "value1", var.getValue()); Assert.assertFalse( var.isRandom()); var = comp.exportedVariables.get( "key2" ); Assert.assertEquals( "value2", var.getValue()); Assert.assertFalse( var.isRandom()); var = comp.exportedVariables.get( "key3" ); Assert.assertEquals( "this is key number 3", var.getValue()); Assert.assertFalse( var.isRandom()); var = comp.exportedVariables.get( "key4" ); Assert.assertEquals( "key4", var.getValue()); Assert.assertTrue( var.isRandom()); Assert.assertEquals( RandomKind.PORT, var.getRandomKind()); var = comp.exportedVariables.get( "key5" ); Assert.assertEquals( "key5", var.getValue()); Assert.assertFalse( var.isRandom()); var = comp.exportedVariables.get( "key6" ); Assert.assertEquals( " key; 6 ", var.getValue()); Assert.assertTrue( var.isRandom()); Assert.assertEquals( RandomKind.PORT, var.getRandomKind()); }
Assert.assertTrue( comp1.exportedVariables.get( "port" ).isRandom()); Assert.assertEquals( RandomKind.PORT, comp1.exportedVariables.get( "port" ).getRandomKind()); Assert.assertTrue( comp2.exportedVariables.get( "httpPort" ).isRandom()); Assert.assertEquals( RandomKind.PORT, comp2.exportedVariables.get( "httpPort" ).getRandomKind()); Assert.assertTrue( comp2.exportedVariables.get( "ajpPort" ).isRandom()); Assert.assertEquals( RandomKind.PORT, comp2.exportedVariables.get( "ajpPort" ).getRandomKind()); Assert.assertFalse( comp3.exportedVariables.get( "ajpPort" ).isRandom()); Assert.assertNull( comp3.exportedVariables.get( "ajpPort" ).getRandomKind());
Assert.assertTrue( container1.getComponent().exportedVariables.get( "httpPort" ).isRandom()); Assert.assertEquals( RandomKind.PORT, container1.getComponent().exportedVariables.get( "httpPort" ).getRandomKind()); Assert.assertTrue( container1.getComponent().exportedVariables.get( "ajpPort" ).isRandom()); Assert.assertEquals( RandomKind.PORT, container1.getComponent().exportedVariables.get( "ajpPort" ).getRandomKind()); Assert.assertFalse( container1.getComponent().exportedVariables.get( "config" ).isRandom()); Assert.assertNull( container1.getComponent().exportedVariables.get( "config" ).getRandomKind()); Assert.assertFalse( container1.getComponent().exportedVariables.get( "ip" ).isRandom()); Assert.assertNull( container1.getComponent().exportedVariables.get( "ip" ).getRandomKind()); Assert.assertTrue( container2.getComponent().exportedVariables.get( "port" ).isRandom()); Assert.assertEquals( RandomKind.PORT, container2.getComponent().exportedVariables.get( "port" ).getRandomKind()); Assert.assertFalse( container2.getComponent().exportedVariables.get( "ip" ).isRandom()); Assert.assertNull( container2.getComponent().exportedVariables.get( "ip" ).getRandomKind());
Assert.assertNull( map.get( varName1 ).getValue()); Assert.assertNull( map.get( varName1 ).getRandomKind()); Assert.assertFalse( map.get( varName1 ).isRandom()); Assert.assertNull( map.get( varName1 ).getValue()); Assert.assertEquals( RandomKind.PORT, map.get( varName1 ).getRandomKind()); Assert.assertTrue( map.get( varName1 ).isRandom()); Assert.assertNull( map.get( varName1 ).getValue()); Assert.assertEquals( RandomKind.PORT, map.get( varName1 ).getRandomKind()); Assert.assertTrue( map.get( varName1 ).isRandom());
Assert.assertEquals( readComponent.getName(), entry.getValue().getValue(), originalVar.getValue()); Assert.assertEquals( readComponent.getName(), entry.getValue().getRandomKind(), originalVar.getRandomKind()); Assert.assertEquals( readComponent.getName(), entry.getValue().isRandom(), originalVar.isRandom());