@SuppressWarnings("unchecked") public static List<Binding.ComponentBinding> extractBindings( Map<String, Object> initialMap) { List<Binding.ComponentBinding> bindingsPerComponent = new LinkedList<>(); for (Entry<String, Object> e : initialMap.entrySet()) { if (e.getKey().equals(COMPONENTS)) { Map<String, Object> components = (Map<String, Object>) e.getValue(); for (Entry<String, Object> ce : components.entrySet()) { List<Binding> bindings = extractBindings(ce.getKey(), ce.getValue()); if (bindings != null && !bindings.isEmpty()) { bindingsPerComponent.add(new ComponentBinding(ce.getKey(), bindings)); } } } } return bindingsPerComponent; // return initialMap.entrySet().stream() // .filter(e -> e.getKey().equals(COMPONENTS)) // .flatMap(e -> ((Map<String, Object>) e.getValue()).entrySet().stream()) // .map(e -> new Binding.ComponentBinding(e.getKey(), // extractBindings(e.getKey(), e.getValue()))) // .filter(b -> (b.bindings != null && !b.bindings.isEmpty())) // .collect(Collectors.toList()); }
@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; }
@Test public void testEvaluateSingleClosureBinding() { Closure closure = new Closure(); closure.name = "Closure"; JsonPrimitive inStr = new JsonPrimitive("localhost"); closure.inputs = new HashMap<>(); closure.inputs.put("hostname", inStr); ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "Container"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("hostname"), "Closure~inputs~hostname")); Binding.ComponentBinding componentBinding = new Binding.ComponentBinding("Container", bindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(closure, secondDescription), Arrays.asList(componentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); closure = (Closure) compositeTemplate.components.get("Closure").data; secondDescription = (ContainerDescription) compositeTemplate.components .get("Container").data; assertEquals(closure.inputs.get("hostname").getAsString(), secondDescription.hostname); }
ContainerDescription desc3 = createContainerDescription("name3"); ComponentBinding cbDesc1 = new ComponentBinding(desc1.name, Arrays.asList( binding(Collections.emptyList(), RESOURCE + FIELD_SEPARATOR + desc2.name + "~address"), )); ComponentBinding cbDesc2 = new ComponentBinding(desc2.name, Arrays.asList( binding(Collections.emptyList(), RESOURCE + FIELD_SEPARATOR + desc3.name + "~address")
@Test public void testEvaluateComplexBindingsRecursively() { /** * A has a binding to B and B has a binding to C */ ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; ContainerDescription thirdDescription = new ContainerDescription(); thirdDescription.name = "C"; thirdDescription.memoryLimit = 5L; List<Binding> aBindings = Arrays .asList(binding(Arrays.asList("memory_limit"), "B~memory_swap_limit")); Binding.ComponentBinding aComponentBinding = new Binding.ComponentBinding("A", aBindings); List<Binding> bBindings = Arrays .asList(binding(Arrays.asList("memory_swap_limit"), "C~memory_limit")); Binding.ComponentBinding bComponentBinding = new Binding.ComponentBinding("B", bBindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(firstDescription, secondDescription, thirdDescription), Arrays.asList(bComponentBinding, aComponentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); firstDescription = (ContainerDescription) compositeTemplate.components.get("A").data; secondDescription = (ContainerDescription) compositeTemplate.components.get("B").data; thirdDescription = (ContainerDescription) compositeTemplate.components.get("C").data; assertEquals(firstDescription.memoryLimit, thirdDescription.memoryLimit); assertEquals(secondDescription.memorySwapLimit, thirdDescription.memoryLimit); }
@Test public void testEvaluateBindingsRecursively() { /** * A has a binding to B and B has a binding to C */ ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; ContainerDescription thirdDescription = new ContainerDescription(); thirdDescription.name = "C"; thirdDescription.memoryLimit = 5L; List<Binding> aBindings = Arrays .asList(binding(Arrays.asList("memory_limit"), "B~memory_limit")); Binding.ComponentBinding aComponentBinding = new Binding.ComponentBinding("A", aBindings); List<Binding> bBindings = Arrays .asList(binding(Arrays.asList("memory_limit"), "C~memory_limit")); Binding.ComponentBinding bComponentBinding = new Binding.ComponentBinding("B", bBindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(firstDescription, secondDescription, thirdDescription), Arrays.asList(bComponentBinding, aComponentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); firstDescription = (ContainerDescription) compositeTemplate.components.get("A").data; secondDescription = (ContainerDescription) compositeTemplate.components.get("B").data; thirdDescription = (ContainerDescription) compositeTemplate.components.get("C").data; assertEquals(firstDescription.memoryLimit, thirdDescription.memoryLimit); assertEquals(secondDescription.memoryLimit, thirdDescription.memoryLimit); }
@Test public void testEvaluateBindingsCyclicDependencyButResolvable() { /** * A has a binding to B and B has a binding to A, but different fields */ ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.hostname = "firstHostname"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; secondDescription.memoryLimit = 5L; List<Binding> bBindings = Arrays.asList(binding(Arrays.asList("hostname"), "A~hostname")); Binding.ComponentBinding bComponentBinding = new Binding.ComponentBinding("B", bBindings); List<Binding> aBindings = Arrays .asList(binding(Arrays.asList("memory_limit"), "B~memory_limit")); Binding.ComponentBinding aComponentBinding = new Binding.ComponentBinding("A", aBindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(firstDescription, secondDescription), Arrays.asList(bComponentBinding, aComponentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); firstDescription = (ContainerDescription) compositeTemplate.components.get("A").data; secondDescription = (ContainerDescription) compositeTemplate.components.get("B").data; assertEquals(firstDescription.hostname, secondDescription.hostname); assertEquals(firstDescription.memoryLimit, secondDescription.memoryLimit); }
@Test public void testEvaluateBindingsToString() { /** * B's hostname should be A's _cluster, but hostname is string and _cluster is Integer */ ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription._cluster = 5; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("hostname"), "A~_cluster")); 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(firstDescription._cluster.toString(), secondDescription.hostname); }
@Test public void testEvaluateMultipleBindingsSimple() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription._cluster = 5; firstDescription.memoryLimit = 5L; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("_cluster"), "A~_cluster"), binding(Arrays.asList("memory_limit"), "A~memory_limit")); 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; assertEquals(firstDescription._cluster, secondDescription._cluster); assertEquals(firstDescription.memoryLimit, secondDescription.memoryLimit); }
@Test public void testEvaluateBindingsParseInt() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription._cluster = 5; firstDescription.hostname = "12"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("_cluster"), "A~hostname")); 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._cluster); assertEquals(firstDescription.hostname, secondDescription._cluster.toString()); }
@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); }
@Test public void testEvaluateSingleBindingNestedTarget() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.logConfig = new LogConfig(); ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; secondDescription.hostname = "hostname"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("log_config", "type"), "B~hostname")); Binding.ComponentBinding componentBinding = new Binding.ComponentBinding("A", 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; assertEquals(firstDescription.logConfig.type, secondDescription.hostname); }
@Test public void testEvaluateSingleBindingDifferentNumberTypes() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription._cluster = 5; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays .asList(binding(Arrays.asList("memory_limit"), "A~_cluster")); 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.memoryLimit); assertEquals(firstDescription._cluster.toString(), secondDescription.memoryLimit.toString()); }
@Test public void testEvaluateSingleBindingNestedSourceMap() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.customProperties = new HashMap<>(); firstDescription.customProperties.put("key", "value"); ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("hostname"), "A~customProperties~key")); 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; assertEquals(firstDescription.customProperties.get("key"), secondDescription.hostname); }
@Test public void testEvaluateSingleBindingSimple() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription._cluster = 5; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("_cluster"), "A~_cluster")); 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; assertEquals(firstDescription._cluster, secondDescription._cluster); }
@Test public void testEvaluateSingleBindingWithDefaultValue() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList( binding(Arrays.asList("_cluster"), "A~_cluster", "5")); 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; assertNull(firstDescription._cluster); assertEquals(new Integer(5), secondDescription._cluster); }
@Test public void testEvaluateSingleBindingCustomProperty() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.customProperties = new HashMap<>(); firstDescription.customProperties.put("key", "20"); ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays.asList(binding(Arrays.asList("_cluster"), "A~key")); 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; assertEquals(new Integer(20), secondDescription._cluster); }
@Test public void testEvaluateSingleBindingNestedSource() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; firstDescription.logConfig = new LogConfig(); firstDescription.logConfig.type = "type"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bindings = Arrays .asList(binding(Arrays.asList("hostname"), "A~logConfig~type")); 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; assertEquals(firstDescription.logConfig.type, secondDescription.hostname); }
@Test(expected = LocalizableValidationException.class) public void testEvaluateBindingsCyclicDependency() { ContainerDescription firstDescription = new ContainerDescription(); firstDescription.name = "A"; ContainerDescription secondDescription = new ContainerDescription(); secondDescription.name = "B"; List<Binding> bBindings = Arrays.asList( binding(Arrays.asList("_cluster"), "A~_cluster")); Binding.ComponentBinding bComponentBinding = new Binding.ComponentBinding("B", bBindings); List<Binding> aBindings = Arrays.asList(binding(Arrays.asList("_cluster"), "B~_cluster")); Binding.ComponentBinding aComponentBinding = new Binding.ComponentBinding("A", aBindings); CompositeTemplate compositeTemplate = createCompositeTemplate(Arrays .asList(firstDescription, secondDescription), Arrays.asList(bComponentBinding, aComponentBinding)); BindingEvaluator.evaluateBindings(compositeTemplate); }