package org.hyperic.plugin.vrealize.automation; import static com.vmware.hyperic.model.relations.RelationType.PARENT; import static org.hyperic.plugin.vrealize.automation.VRAUtils.marshallResource; import static org.hyperic.plugin.vrealize.automation.VRAUtils.setModelProperty; import static org.hyperic.plugin.vrealize.automation.VraConstants.CREATE_IF_NOT_EXIST; import static org.hyperic.plugin.vrealize.automation.VraConstants.KEY_APPLICATION_NAME; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_DEM_SERVER_GROUP; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_LOAD_BALANCER_TAG; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_APPLICATION; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_IAAS_WEB; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_IAAS_WEB_LOAD_BALANCER; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_IAAS_WEB_LOAD_BALANCER_TAG; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_IAAS_WEB_TAG; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_MANAGER_SERVER; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_MANAGER_SERVER_LOAD_BALANCER; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_MANAGER_SERVER_LOAD_BALANCER_TAG; import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_MANAGER_SERVER_TAG; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.product.ServerResource; import com.vmware.hyperic.model.relations.CommonModelUtils; import com.vmware.hyperic.model.relations.ObjectFactory; import com.vmware.hyperic.model.relations.RelationType; import com.vmware.hyperic.model.relations.Resource; import com.vmware.hyperic.model.relations.ResourceTier; /** * @author Tomer Shetah */ public class DiscoveryDEM extends Discovery { private static final Log log = LogFactory.getLog(DiscoveryDEM.class); private static final String appName = CommonModelUtils.getParametrizedName(KEY_APPLICATION_NAME); @Override protected ServerResource newServerResource( long pid, String exe) { ServerResource server = super.newServerResource(pid, exe); log.debug("[newServerResource] pid=" + pid); String configFilePath = exe + ".config"; log.debug("[newServerResource] configFile=" + configFilePath); String vRAIaasWebLB = VRAUtils.executeXMLQuery("//appSettings/add[@key='repositoryAddress']/@value", configFilePath); if (!StringUtils.isEmpty(vRAIaasWebLB)) { vRAIaasWebLB = VRAUtils.getFqdn(vRAIaasWebLB); } log.debug("[newServerResource] vRAIaasWebLB (repositoryAddress) = '" + vRAIaasWebLB + "'"); String managerServerLoadBalancerFqdn = VRAUtils.executeXMLQuery("//system.serviceModel/client/endpoint/@address", configFilePath); if (!StringUtils.isEmpty(managerServerLoadBalancerFqdn)) { managerServerLoadBalancerFqdn = VRAUtils.getFqdn(managerServerLoadBalancerFqdn); } log.debug("[newServerResource] l (DynamicOps_Vmps_Agent_Core_VMPSAgentService_ProxyAgentService) = '" + managerServerLoadBalancerFqdn + "'"); Resource modelResource = getCommonModel(server, vRAIaasWebLB, managerServerLoadBalancerFqdn); String modelXml = marshallResource(modelResource); setModelProperty(server, modelXml); return server; } private static Resource getCommonModel( ServerResource server, String vRAIaasWebLB, String managerServerLoadBalancerFqdn) { ObjectFactory objectFactory = new ObjectFactory(); Resource demServer = objectFactory.createResource(false, server.getType(), server.getName(), ResourceTier.SERVER); Resource demGroup = objectFactory.createLogicalResource(TYPE_DEM_SERVER_GROUP, appName); Resource application = objectFactory.createApplicationResource(TYPE_VRA_APPLICATION, appName); demServer.addRelations(objectFactory.createRelation(demGroup, RelationType.PARENT)); demGroup.addRelations(objectFactory.createRelation(application, RelationType.PARENT)); Resource loadBalancerSuperTag = objectFactory.createLogicalResource(TYPE_LOAD_BALANCER_TAG, CommonModelUtils.getParametrizedName(KEY_APPLICATION_NAME)); createRelationIaasWebOrLoadBalancer(vRAIaasWebLB, objectFactory, demServer, loadBalancerSuperTag); createRelationManagerServerOrLoadBalancer(managerServerLoadBalancerFqdn, objectFactory, demServer, loadBalancerSuperTag); return demServer; } private static void createRelationManagerServerOrLoadBalancer( String managerServerOrLoadBalancerFqdn, ObjectFactory objectFactory, Resource demServer, Resource loadBalancerSuperTag) { if (StringUtils.isEmpty(managerServerOrLoadBalancerFqdn)) { return; } Resource managerServerLoadBalancer = objectFactory.createResource(!CREATE_IF_NOT_EXIST, TYPE_VRA_MANAGER_SERVER_LOAD_BALANCER, managerServerOrLoadBalancerFqdn, ResourceTier.SERVER); Resource vraManagerServerLoadBalancerTag = objectFactory.createLogicalResource(TYPE_VRA_MANAGER_SERVER_LOAD_BALANCER_TAG, appName); managerServerLoadBalancer.addRelations(objectFactory.createRelation(vraManagerServerLoadBalancerTag, PARENT)); vraManagerServerLoadBalancerTag.addRelations(objectFactory.createRelation(loadBalancerSuperTag, PARENT)); Resource managerServer = objectFactory.createResource(true, TYPE_VRA_MANAGER_SERVER, managerServerOrLoadBalancerFqdn, ResourceTier.SERVER); Resource managerServerTag = objectFactory.createLogicalResource(TYPE_VRA_MANAGER_SERVER_TAG, appName); managerServer.addRelations(objectFactory.createRelation(managerServerTag, RelationType.PARENT)); demServer.addRelations(objectFactory.createRelation(managerServerLoadBalancer, RelationType.SIBLING), objectFactory.createRelation(managerServer, RelationType.SIBLING)); managerServerLoadBalancer.addRelations(objectFactory.createRelation(managerServerTag, RelationType.PARENT)); } private static void createRelationIaasWebOrLoadBalancer( String vRAIaasWebOrLoadBalancerFqdn, ObjectFactory objectFactory, Resource demServer, Resource loadBalancerSuperTag) { if (StringUtils.isEmpty(vRAIaasWebOrLoadBalancerFqdn)) { return; } Resource vraIaasWebLoadBalancer = objectFactory.createResource(!CREATE_IF_NOT_EXIST, TYPE_VRA_IAAS_WEB_LOAD_BALANCER, vRAIaasWebOrLoadBalancerFqdn, ResourceTier.SERVER); Resource vraIaasWebLoadBalancerTag = objectFactory.createLogicalResource(TYPE_VRA_IAAS_WEB_LOAD_BALANCER_TAG, appName); vraIaasWebLoadBalancer.addRelations(objectFactory.createRelation(vraIaasWebLoadBalancerTag, PARENT)); vraIaasWebLoadBalancerTag.addRelations(objectFactory.createRelation(loadBalancerSuperTag, PARENT)); demServer.addRelations(objectFactory.createRelation(vraIaasWebLoadBalancer, RelationType.SIBLING)); Resource vRAIaasWebServer = objectFactory.createResource(CREATE_IF_NOT_EXIST, TYPE_VRA_IAAS_WEB, vRAIaasWebOrLoadBalancerFqdn, ResourceTier.SERVER); Resource vRAIaasWebServerTag = objectFactory.createLogicalResource(TYPE_VRA_IAAS_WEB_TAG, appName); vRAIaasWebServer.addRelations(objectFactory.createRelation(vRAIaasWebServerTag, RelationType.PARENT)); demServer.addRelations(objectFactory.createRelation(vRAIaasWebServer, RelationType.SIBLING)); vraIaasWebLoadBalancer.addRelations( objectFactory.createRelation(vRAIaasWebServerTag, RelationType.PARENT, Boolean.TRUE)); } /* inline unit test @Test public void test() { ServerResource server = new ServerResource(); server.setName("111"); server.setType("222"); Resource modelResource = getCommonModel(server, "AAA", "BBB"); String modelXml = marshallResource(modelResource); Assert.assertNotNull(modelXml); System.out.println(modelXml); } */ }