@Override public ServiceDocument getDocumentTemplate() { CompositeDescription template = (CompositeDescription) super.getDocumentTemplate(); com.vmware.photon.controller.model.ServiceUtils.setRetentionLimit(template); template.name = "name (string)"; template.status = Status.PUBLISHED; template.lastPublished = System.currentTimeMillis(); template.descriptionLinks = Arrays.asList("containerDescriptionLink (string)"); template.customProperties = new HashMap<>(1); template.customProperties.put("propKey string", "customPropertyValue string"); template.bindings = new ArrayList<>(); Binding.ComponentBinding cb = new Binding.ComponentBinding("component", new ArrayList<>(Arrays.asList(new Binding(Arrays.asList("field"), "${expr}", new BindingPlaceholder("expr", "1"))))); template.bindings.add(cb); return template; }
@Override public Map<String, AffinityConstraint> getAffinityConstraints() { return componentDescription.bindings.stream() .filter(b -> b.isProvisioningTimeBinding()) .map(b -> BindingUtils .extractComponentNameFromBindingExpression( b.placeholder.bindingExpression)) .distinct() .collect(Collectors.toMap( Function.identity(), AffinityConstraint::new)); }
binding = new Binding(currentFieldPath, fieldExpression, new BindingPlaceholder(placeholder, defaultValue)); } else {
if (binding.isProvisioningTimeBinding()) { continue;
private static Binding binding(List<String> targetFieldPath, String placeholder, String defaultValue) { return new Binding(targetFieldPath, String.format("${%s}", placeholder), new BindingPlaceholder(placeholder, defaultValue)); } }
Map<String, Object> evaluatedBindingMap = new HashMap<>(); for (Binding binding : bindings) { if (!binding.isProvisioningTimeBinding()) { continue;
private static Binding binding(List<String> targetFieldPath, String placeholder) { return new Binding(targetFieldPath, String.format("${%s}", placeholder), new BindingPlaceholder(placeholder)); }
.filter(b -> b.isProvisioningTimeBinding()).collect(Collectors.toList());
private static Binding binding(List<String> targetFieldPath, String placeholder) { return new Binding(targetFieldPath, String.format("${%s}", placeholder), new BindingPlaceholder(placeholder)); }
@Test public void extractBindingsSimpleProvisioningTimeBinding() { final String componentName = "component-name"; //CHECKSTYLE:OFF Map<String, Object> input = new HashMap<String, Object>() {{ put(BindingUtils.COMPONENTS, new HashMap<String, Object>() {{ put(componentName, new HashMap<String, Object>() {{ put(BindingUtils.DATA, new HashMap<String, Object>() {{ put("field1", 3); put("field2", "${_resource~component1~field1}"); }}); }}); }}); }}; //CHECKSTYLE:ON List<Binding.ComponentBinding> componentBindings = BindingUtils.extractBindings(input); assertEquals(1, componentBindings.size()); //the binding should be removed from the map assertEquals(1, ((Map) ((Map) ((Map) input.get(BindingUtils.COMPONENTS)).get(componentName)) .get(BindingUtils.DATA)) .size()); assertEquals(componentName, componentBindings.get(0).componentName); assertEquals("_resource~component1~field1", componentBindings.get(0).bindings.get(0).placeholder.bindingExpression); assertTrue(componentBindings.get(0).bindings.get(0).isProvisioningTimeBinding()); }
@Test public void testEvaluateSingleBindingWithAdditionalContent() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.hostname = "10.0.0.1"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; Binding binding = new Binding(Arrays.asList("hostname"), "${A~hostname}:2376", new BindingPlaceholder("A~hostname")); List<Binding> bindings = Arrays.asList(binding); Binding.ComponentBinding componentBinding = new Binding.ComponentBinding("B", bindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(firstDescription, secondDescription), Arrays.asList(componentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); firstDescription = (ContainerDescription) compositeTemplate.components.get("A").data; secondDescription = (ContainerDescription) compositeTemplate.components.get("B").data; assertNotNull(secondDescription.hostname); assertEquals("10.0.0.1:2376", secondDescription.hostname); }
.collect(Collectors.partitioningBy(b -> b.isProvisioningTimeBinding())); assertFalse(binding.isProvisioningTimeBinding()); assertEquals("db~_cluster", binding.placeholder.bindingExpression); assertTrue(binding.isProvisioningTimeBinding()); assertEquals("_resource~db~address", binding.placeholder.bindingExpression); assertTrue(binding.isProvisioningTimeBinding()); assertEquals("_resource~db~env~MYSQL_USER", binding.placeholder.bindingExpression);