/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package se.kth.karamel.client.model.yaml; import com.google.common.collect.Lists; import org.junit.Test; import org.yaml.snakeyaml.Yaml; import se.kth.karamel.backend.ClusterDefinitionService; import se.kth.karamel.common.clusterdef.Baremetal; import se.kth.karamel.common.clusterdef.Cookbook; import se.kth.karamel.common.clusterdef.Ec2; import se.kth.karamel.common.clusterdef.Gce; import se.kth.karamel.common.clusterdef.Nova; import se.kth.karamel.common.clusterdef.json.JsonCluster; import se.kth.karamel.common.clusterdef.json.JsonCookbook; import se.kth.karamel.common.clusterdef.yaml.YamlCluster; import se.kth.karamel.common.clusterdef.yaml.YamlGroup; import se.kth.karamel.common.clusterdef.yaml.YamlScope; import se.kth.karamel.common.exception.KaramelException; import se.kth.karamel.common.exception.MetadataParseException; import se.kth.karamel.common.exception.ValidationException; import se.kth.karamel.common.util.IoUtils; import se.kth.karamel.common.util.Settings; import se.kth.karamel.core.clusterdef.ClusterDefinitionValidator; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.*; /** * * @author kamal */ public class ClusterDefinitionTest { @Test public void testYamlToYamlObject() throws Exception { YamlCluster cluster; String yaml = IoUtils.readContentFromClasspath("se/kth/karamel/client/model/test-definitions/reference.yml"); cluster = ClusterDefinitionService.yamlToYamlObject(yaml); assertNotNull(cluster); assertEquals("ReferenceYaml", cluster.getName()); assertTrue(cluster.getProvider() instanceof Ec2); Ec2 provider = (Ec2) cluster.getProvider(); assertEquals("m1.small", provider.getType()); assertEquals("ami-0307ce74", provider.getAmi()); assertEquals("eu-west-1", provider.getRegion()); assertEquals("ubuntu", provider.getUsername()); assertTrue(0.1f == provider.getPrice()); assertEquals(cluster.getAttr("mysql/user"), "admin"); assertEquals(cluster.getAttr("ndb/ndbapi/public_ips"), "$ndb.public_ips"); assertEquals(Lists.newArrayList("123", "134", "145"), cluster.getAttr("hop/ports")); assertEquals(cluster.getAttr("hop/dn/http_port"), "50075"); assertEquals(cluster.getAttr("hop/yarn/ps_port"), "20888"); assertEquals(cluster.getAttr("hop/rm/http_port"), "8088"); assertEquals(cluster.getAttr("hop/nm/jmxport"), "8083"); assertEquals(cluster.getAttr("hop/nm/http_port"), "8042"); assertEquals(cluster.getAttr("hop/rm/jmxport"), "8042"); assertEquals(cluster.getAttr("hop/nm/jmxport"), "8083"); assertEquals(cluster.getAttr("hop/jhs/http_port"), "19888"); assertEquals(cluster.getAttr("ndb/mgmd/port"), "1186"); assertEquals(cluster.getAttr("ndb/ndbd/port"), "10000"); Map<String, Cookbook> cookbooks = cluster.getCookbooks(); assertTrue(cookbooks.containsKey("kagent")); assertEquals("testorg/testrepo", cookbooks.get("kagent").getGithub()); assertEquals("cookbooks/kagent-chef", cookbooks.get("kagent").getCookbook()); assertEquals("master", cookbooks.get("kagent").getBranch()); assertTrue(cookbooks.containsKey("hops")); assertEquals("testorg/testrepo", cookbooks.get("hops").getGithub()); assertEquals("cookbooks/hopshadoop/hops-hadoop-chef", cookbooks.get("hops").getCookbook()); assertEquals("master", cookbooks.get("hops").getBranch()); assertTrue(cookbooks.containsKey("hiway")); assertEquals("cookbooks/biobankcloud/hiway-chef", cookbooks.get("hiway").getCookbook()); Map<String, YamlGroup> groups = cluster.getGroups(); assertTrue(groups.containsKey("dashboard")); assertEquals(1, groups.get("dashboard").getSize()); assertEquals("3306", groups.get("dashboard").getAttr("ndb/mysqld")); assertTrue(groups.get("dashboard").getRecipes().contains("kagent")); assertTrue(groups.get("dashboard").getRecipes().contains("hopsworks")); assertTrue(groups.get("dashboard").getRecipes().contains("ndb::mysqld")); assertTrue(groups.containsKey("namenodes")); assertEquals(2, groups.get("namenodes").getSize()); assertTrue(groups.get("namenodes").getRecipes().contains("kagent")); assertTrue(groups.get("namenodes").getRecipes().contains("ndb::memcached")); assertTrue(groups.get("namenodes").getRecipes().contains("ndb::mysqld")); assertTrue(groups.get("namenodes").getRecipes().contains("ndb::mgmd")); assertTrue(groups.get("namenodes").getRecipes().contains("hops::nn")); assertTrue(groups.get("namenodes").getRecipes().contains("hops::rm")); assertTrue(groups.get("namenodes").getRecipes().contains("hops::jhs")); assertTrue(groups.get("namenodes").getProvider() instanceof Ec2); Ec2 provider2 = (Ec2) groups.get("namenodes").getProvider(); assertEquals("m3.medium", provider2.getType()); assertTrue(groups.containsKey("ndb")); assertEquals(2, groups.get("ndb").getSize()); assertTrue(groups.get("ndb").getRecipes().contains("kagent")); assertTrue(groups.get("ndb").getRecipes().contains("ndb::ndbd")); assertTrue(groups.get("ndb").getProvider() instanceof Baremetal); Baremetal provider3 = (Baremetal) groups.get("ndb").getProvider(); provider3.validate(); assertEquals("kamal", provider3.getUsername()); assertEquals(3, provider3.getIps().size()); assertTrue(provider3.getIps().contains("192.168.33.11-192.168.33.13")); assertTrue(provider3.getIps().contains("192.168.33.14")); assertTrue(provider3.getIps().contains("192.168.33.15")); assertTrue(groups.containsKey("datanodes")); assertEquals(4, groups.get("datanodes").getSize()); assertTrue(groups.get("datanodes").getRecipes().contains("kagent")); assertTrue(groups.get("datanodes").getRecipes().contains("hops::dn")); assertTrue(groups.get("datanodes").getRecipes().contains("hops::nm")); assertTrue(groups.get("datanodes").getProvider() instanceof Ec2); Ec2 provider4 = (Ec2) groups.get("datanodes").getProvider(); assertEquals("m3.medium", provider4.getType()); Gce provider5 = (Gce) groups.get("gcevms").getProvider(); assertEquals("n1-standard-1", provider5.getType()); assertEquals("ubuntu-1404-trusty-v20150316", provider5.getImage()); assertEquals("europe-west1-b", provider5.getZone()); Nova provider6 = (Nova) groups.get("novavms").getProvider(); assertEquals("1", provider6.getFlavor()); assertEquals("ubuntu-1404", provider6.getImage()); } @Test public void testJsonCookbook() throws IOException, KaramelException { Settings.CB_CLASSPATH_MODE = true; String yaml = IoUtils.readContentFromClasspath("se/kth/karamel/client/model/test-definitions/reference.yml"); YamlCluster cluster = ClusterDefinitionService.yamlToYamlObject(yaml); Map<String, Cookbook> cookbooks = cluster.getCookbooks(); assertTrue(cookbooks.containsKey("kagent")); Cookbook cookbook = cookbooks.get("kagent"); JsonCookbook jc = new JsonCookbook(cookbook.getUrls().id, "kagent", "kagent", new HashMap<String, Object>()); assertEquals("testorg/testrepo", jc.getUrls().orgRepo); assertEquals("cookbooks/kagent-chef", jc.getUrls().cookbookRelPath); } @Test public void foldOutAttrTest() throws MetadataParseException { YamlScope yamlScope = new YamlScope() { }; Map<String, Object> attrs = new HashMap<>(); yamlScope.foldOutAttr("mysql/user", "admin", attrs); assertFalse(attrs.isEmpty()); assertTrue(attrs.size() == 1); assertTrue(attrs.get("mysql") instanceof Map); Map<String, Object> mysql = (Map<String, Object>) attrs.get("mysql"); assertTrue(mysql.size() == 1); assertTrue(mysql.get("user") instanceof String); String user = (String) mysql.get("user"); assertEquals("admin", user); } @Test public void dumpMap() { Map<String, Object> cluster = new HashMap<>(); Map<String, Object> attrs = new HashMap<>(); Map<String, Object> ndb = new HashMap<>(); Map<String, String> nn = new HashMap<>(); nn.put("jmxport", "8077"); nn.put("http_port", "50070"); ndb.put("nn", nn); Map<String, Object> mysql = new HashMap<>(); Map<String, Object> server = new HashMap<>(); List<String> ports = Lists.newArrayList("5003", "5004", "5005"); server.put("ports", ports); server.put("username", "root"); mysql.put("server", server); ndb.put("mysql", mysql); attrs.put("ndb", ndb); cluster.put("attrs", attrs); Yaml yaml = new Yaml(); String output = yaml.dump(cluster); String expected = "attrs:\n" + " ndb:\n" + " nn: {jmxport: '8077', http_port: '50070'}\n" + " mysql:\n" + " server:\n" + " username: root\n" + " ports: ['5003', '5004', '5005']\n" + ""; // assertEquals(expected, output); } @Test(expected = ValidationException.class) public void testInvalidGroupSizeForBaremetal() throws IOException, KaramelException { Settings.CB_CLASSPATH_MODE = true; String yaml = IoUtils.readContentFromClasspath("se/kth/karamel/client/model/test-definitions/validations.yml"); ClusterDefinitionService.yamlToJson(yaml); } @Test(expected = ValidationException.class) public void testDuplciateRecipeInAGroup() throws IOException, KaramelException { Settings.CB_CLASSPATH_MODE = true; String yaml = IoUtils.readContentFromClasspath("se/kth/karamel/client/model/test-definitions/validations2.yml"); ClusterDefinitionService.yamlToJson(yaml); } @Test public void testGroupLevelRecipesInJson() throws KaramelException { Settings.CB_CLASSPATH_MODE = true; String json = " {\"name\":\"flink\"," + "\"cookbooks\":[" + "{\"id\":\"https://github.com/testorg/testrepo/tree/master/cookbooks/hopshadoop/apache-hadoop-chef\"," + "\"attrs\":{}}]," + "\"groups\":[" + "{\"name\":\"namenodes\"," + "\"cookbooks\":[" + "{\"id\":\"https://github.com/testorg/testrepo/tree/master/cookbooks/hopshadoop/apache-hadoop-chef\"," + "\"attrs\":{}," + "\"recipes\":[" + "{\"name\":\"hadoop::nn\"}]}," + "{\"id\":\"https://github.com/testorg/testrepo/tree/master/cookbooks/flink-chef\"," + "\"recipes\":[" + "{\"name\":\"flink\"}]}]," + "\"size\":1," + "\"ec2\":null," + "\"gce\":null," + "\"openstack\":null," + "\"baremetal\":{\"username\":null,\"ips\":[\"192.168.33.11\"]}}," + "{\"name\":\"datanodes\"," + "\"cookbooks\":[" + "{\"id\":\"https://github.com/testorg/testrepo/tree/master/cookbooks/hopshadoop/apache-hadoop-chef\"," + "\"attrs\":{}," + "\"recipes\":[{\"name\":\"hadoop::dn\"}]}]," + "\"size\":1," + "\"ec2\":null," + "\"gce\":null," + "\"openstack\":null," + "\"baremetal\":{\"username\":null,\"ips\":[\"192.168.33.12\"]}}]," + "\"ec2\":null," + "\"gce\":null," + "\"openstack\":null," + "\"baremetal\":{\"username\":\"vagrant\",\"ips\":[]}}"; JsonCluster jsonCluster = ClusterDefinitionService.jsonToJsonObject(json); ClusterDefinitionValidator.validate(jsonCluster); String yml = ClusterDefinitionService.jsonToYaml(jsonCluster); jsonCluster = ClusterDefinitionService.yamlToJsonObject(yml); List<JsonCookbook> cookbooks = jsonCluster.getCookbooks(); assertEquals(2, cookbooks.size()); // assertEquals("flink", cookbooks.get(1).getName()); } // @Test public void testCompactClusterDefinition() throws IOException, KaramelException { Settings.CB_CLASSPATH_MODE = false; String yaml = IoUtils.readContentFromClasspath("se/kth/karamel/client/model/test-definitions/hopsworks_compact.yml"); String json = ClusterDefinitionService.yamlToJson(yaml); System.out.println(json); } }