public static String getValue(final String name, final Environment env) { return env.getVariablesList().stream() .filter(var -> var.getName().equals(name)) .findFirst() .map(var -> var.getValue()) .orElse(""); }
/** * Returns the value of the provided environment variable, or an empty {@link Optional} if no matching environment * variable was found. */ public static Optional<String> getEnvVar(Environment environment, String key) { return environment.getVariablesList().stream() .filter(v -> v.getName().equals(key)) .map(v -> v.getValue()) .findFirst(); }
public static Map<String, String> toMap(final Environment environment) { return environment.getVariablesList().stream() .collect( Collectors.toMap(var -> var.getName(), var -> var.getValue())); }
Map<String, String> portEnvVarMap = taskBuilder.getCommand().getEnvironment().getVariablesList() .stream() .filter(variable -> variable.getName().equals(expectedExplicitOverlayPortEnvvar) || variable.getName().equals(expextedDynamicOverlayPortEnvvar)) .collect(Collectors.toMap(Protos.Environment.Variable::getName, Protos.Environment.Variable::getValue)); Assert.assertEquals(2, portEnvVarMap.size());
for (int i = 0; i < taskBuilder.getCommand().getEnvironment().getVariablesCount(); i++) { Protos.Environment.Variable variable = taskBuilder.getCommand().getEnvironment().getVariables(i); if (Objects.equals(variable.getName(), "PORT_TEST_PORT")) { Assert.assertEquals(variable.getValue(), "10000"); portInTaskEnv = true; Protos.Environment.Variable variable = readinessCheck.getCommand() .getCommand().getEnvironment().getVariables(i); if (Objects.equals(variable.getName(), "PORT_TEST_PORT")) { Assert.assertEquals(variable.getValue(), "10000"); portInHealthEnv = true;
for (int i = 0; i < taskBuilder.getCommand().getEnvironment().getVariablesCount(); i++) { Protos.Environment.Variable variable = taskBuilder.getCommand().getEnvironment().getVariables(i); if (Objects.equals(variable.getName(), "PORT_TEST_PORT")) { Assert.assertEquals(variable.getValue(), "10000"); portInTaskEnv = true; for (int i = 0; i < taskBuilder.getHealthCheck().getCommand().getEnvironment().getVariablesCount(); i++) { Protos.Environment.Variable variable = taskBuilder.getHealthCheck().getCommand().getEnvironment().getVariables(i); if (Objects.equals(variable.getName(), "PORT_TEST_PORT")) { Assert.assertEquals(variable.getValue(), "10000"); portInHealthEnv = true;
List<Protos.Environment.Variable> portEnvVars = taskBuilder.getCommand().getEnvironment().getVariablesList() .stream() .filter(variable -> variable.getName().equals(expectedDynamicOverlayPortEnvvar)) .collect(Collectors.toList()); Assert.assertEquals(1, portEnvVars.size()); Protos.Environment.Variable variable = portEnvVars.get(0); Assert.assertEquals(variable.getName(), expectedDynamicOverlayPortEnvvar); Assert.assertEquals(variable.getValue(), expectedDynamicOverlayPort.toString()); Assert.assertEquals(variable.getName(), expectedDynamicOverlayPortEnvvar); Assert.assertEquals(variable.getValue(), expectedDynamicOverlayPort.toString());
List<Protos.Environment.Variable> portEnvVars = taskBuilder.getCommand().getEnvironment().getVariablesList() .stream() .filter(variable -> variable.getName().equals(expectedPortEnvVar)) .collect(Collectors.toList()); Assert.assertEquals(1, portEnvVars.size()); Protos.Environment.Variable variable = portEnvVars.get(0); Assert.assertEquals(variable.getName(), expectedPortEnvVar); Assert.assertEquals(variable.getValue(), requestedPort.toString());
@Test public void testHealthCheckPortEnvvarIsCorrectOnOverlay() throws Exception { DefaultPodInstance podInstance = getPodInstance("valid-port-healthcheck-overlay.yml"); PodInstanceRequirement podInstanceRequirement = PodInstanceRequirement.newBuilder(podInstance, TaskUtils.getTaskNames(podInstance)) .build(); PodInfoBuilder podInfoBuilder = getPodInfoBuilder(podInstanceRequirement); Protos.Resource offeredPorts = ResourceTestUtils.getUnreservedPorts(10000, 10000); Protos.Offer offer = OfferTestUtils.getOffer(offeredPorts); PortEvaluationStage portEvaluationStage = new PortEvaluationStage( getPortSpec(podInstance), Collections.singleton(TestConstants.TASK_NAME), Optional.empty(), Optional.empty()); EvaluationOutcome outcome = portEvaluationStage.evaluate( new MesosResourcePool(offer, Optional.of(Constants.ANY_ROLE)), podInfoBuilder); Assert.assertTrue(outcome.isPassing()); Assert.assertEquals(0, outcome.getOfferRecommendations().size()); Protos.TaskInfo.Builder taskBuilder = podInfoBuilder.getTaskBuilders().stream().findFirst().get(); Assert.assertTrue(taskBuilder.getCommand().getEnvironment().getVariablesList().stream() .filter(variable -> variable.getName().equals("PORT_TEST_PORT") && variable.getValue().equals("10000")) .count() == 1); Assert.assertTrue(taskBuilder.getHealthCheck().getCommand().getEnvironment().getVariablesList().stream() .filter(variable -> variable.getName().equals("PORT_TEST_PORT") && variable.getValue().equals("10000")) .count() == 1); }
@Test public void testReadinessCheckPortEnvvarIsCorrectOnOverlay() throws Exception { DefaultPodInstance podInstance = getPodInstance("valid-port-readinesscheck-overlay.yml"); PodInstanceRequirement podInstanceRequirement = PodInstanceRequirement.newBuilder(podInstance, TaskUtils.getTaskNames(podInstance)) .build(); PodInfoBuilder podInfoBuilder = getPodInfoBuilder(podInstanceRequirement); Protos.Resource offeredPorts = ResourceTestUtils.getUnreservedPorts(10000, 10000); Protos.Offer offer = OfferTestUtils.getCompleteOffer(offeredPorts); PortEvaluationStage portEvaluationStage = new PortEvaluationStage( getPortSpec(podInstance), Collections.singleton(TestConstants.TASK_NAME), Optional.empty(), Optional.empty()); EvaluationOutcome outcome = portEvaluationStage.evaluate( new MesosResourcePool(offer, Optional.of(Constants.ANY_ROLE)), podInfoBuilder); Assert.assertTrue(outcome.isPassing()); Assert.assertEquals(0, outcome.getOfferRecommendations().size()); Protos.TaskInfo.Builder taskBuilder = podInfoBuilder.getTaskBuilders().stream().findFirst().get(); Assert.assertTrue(taskBuilder.getCommand().getEnvironment().getVariablesList().stream() .filter(variable -> variable.getName().equals("PORT_TEST_PORT") && variable.getValue().equals("10000")) .count() == 1); Protos.CheckInfo readinessCheck = taskBuilder.hasCheck() ? taskBuilder.getCheck() : null; Assert.assertTrue(readinessCheck != null); Assert.assertTrue(readinessCheck.getCommand().getCommand().getEnvironment().getVariablesList().stream() .filter(variable -> variable.getName().equals("PORT_TEST_PORT") && variable.getValue().equals("10000")) .count() == 1); }
@Override public void expect(ClusterState state, SchedulerDriver mockDriver) throws AssertionError { StateStore stateStore = new StateStore(persisterWithTasks); Optional<Protos.TaskInfo> task = stateStore.fetchTask(taskName); Assert.assertTrue( String.format("Missing task: %s, known tasks are: %s", taskName, stateStore.fetchTaskNames()), task.isPresent()); Collection<Protos.Environment.Variable> env = task.get().getCommand().getEnvironment().getVariablesList(); Optional<String> actualValue = env.stream() .filter(e -> e.getName().equals(key)) .map(e -> e.getValue()) .findFirst(); Assert.assertTrue(String.format("Missing env entry %s, known entries are: %s", key, env.stream().map(e -> TextFormat.shortDebugString(e)).collect(Collectors.toList())), actualValue.isPresent()); Assert.assertEquals(value, actualValue.get()); } };
@Test public void ensureUnder1GBIsLessThan256MB() throws Exception { int ram = 512; Mockito.when(configuration.getMem()).thenReturn((double) ram); ExecutorEnvironmentalVariables env = new ExecutorEnvironmentalVariables(configuration); for (Protos.Environment.Variable var : env.getList()) { if (var.getName().equals(ExecutorEnvironmentalVariables.ES_HEAP)) { String val = var.getValue(); Pattern pattern = Pattern.compile("(\\d*)m"); Matcher matcher = pattern.matcher(val); assertTrue(matcher.matches()); assertEquals(Integer.toString(ram - ram / 4), matcher.group(1)); assertTrue(ram - Integer.parseInt(matcher.group(1)) < 256); assertTrue(ram - Integer.parseInt(matcher.group(1)) < ram); assertTrue(ram - Integer.parseInt(matcher.group(1)) > 0); } } } }
@Test public void addEnvVarToEnvironmentWithSecret() { Protos.Environment.Builder envBuilder = Protos.Environment.newBuilder(); envBuilder.addVariablesBuilder() .setName(SECRET_KEY) .setType(Protos.Environment.Variable.Type.SECRET) .setSecret(getReferenceSecret(SECRET_PATH)); Protos.Environment newEnv = EnvUtils.withEnvVar(envBuilder.build(), TEST_ENV_KEY, TEST_ENV_VALUE); Assert.assertEquals(newEnv.getVariablesCount(), 2); for(Protos.Environment.Variable envVar : newEnv.getVariablesList()) { if (envVar.getName().equals(SECRET_KEY)) { Assert.assertEquals(envVar.getSecret(), getReferenceSecret(SECRET_PATH)); } if (envVar.getName().equals(TEST_ENV_KEY)) { Assert.assertEquals(envVar.getValue(), TEST_ENV_VALUE); } } }
@Test public void ensureOver1GBHeapIs256MB() throws Exception { int ram = 2048; Mockito.when(configuration.getMem()).thenReturn((double) ram); ExecutorEnvironmentalVariables env = new ExecutorEnvironmentalVariables(configuration); for (Protos.Environment.Variable var : env.getList()) { if (var.getName().equals(ExecutorEnvironmentalVariables.ES_HEAP)) { String val = var.getValue(); Pattern pattern = Pattern.compile("(\\d*)m"); Matcher matcher = pattern.matcher(val); assertTrue(matcher.matches()); assertEquals(Integer.toString(ram - 256), matcher.group(1)); } } }
/** * Returns a Map representation of the provided {@link Environment}. * In the event of duplicate labels, the last duplicate wins. * This is the inverse of {@link #toProto(Map)}. */ public static Map<String, Environment.Variable> toMap(Environment environment) { // sort labels alphabetically for convenience in debugging/logging: Map<String, Environment.Variable> map = new TreeMap<>(); for (Environment.Variable variable : environment.getVariablesList()) { map.put(variable.getName(), variable); } return map; }
/** * Gets the zone of a task. * * @param taskInfo The {@link TaskInfo} to get zone information from. * @return A string indicating the zone the task is in. */ public static String getTaskZone(Protos.TaskInfo taskInfo) { return taskInfo.getCommand().getEnvironment().getVariablesList().stream() .filter(variable -> variable.getName().equals(EnvConstants.ZONE_TASKENV)).findFirst().get().getValue(); }
/** * Determines if a task is launched in any zones. * * @param taskInfo The {@link TaskInfo} to get zone information from. * @return A boolean indicating whether the task is in a zone. */ public static boolean taskHasZone(Protos.TaskInfo taskInfo) { return taskInfo.getCommand().getEnvironment().getVariablesList().stream() .anyMatch(variable -> variable.getName().equals(EnvConstants.ZONE_TASKENV)); }