package org.hyperic.plugin.vrealize.automation;
import static com.vmware.hyperic.model.relations.RelationType.PARENT;
import static org.hyperic.plugin.vrealize.automation.VRAUtils.configFile;
import static org.hyperic.plugin.vrealize.automation.VRAUtils.getDnsNames;
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_VCO_TAG;
import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_APPLICATION;
import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_DATABASES_GROUP;
import static org.hyperic.plugin.vrealize.automation.VraConstants.TYPE_VRA_VCO_LOAD_BALANCER;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.PluginException;
import org.hyperic.hq.product.ServerResource;
import org.hyperic.util.config.ConfigResponse;
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 imakhlin
*/
public class DiscoveryVCOAppServer extends Discovery {
private static final Log log = LogFactory.getLog(DiscoveryVCOAppServer.class);
private static final String appName = CommonModelUtils.getParametrizedName(KEY_APPLICATION_NAME);
@Override
public List<ServerResource> getServerResources(ConfigResponse platformConfig)
throws PluginException {
log.debug("[getServerResources] platformConfig=" + platformConfig);
String platformFqdn = platformConfig.getValue("platform.fqdn");
VRAUtils.setLocalFqdn(platformFqdn);
log.debug("[getServerResources] platformFqdn=" + platformFqdn);
@SuppressWarnings("unchecked")
List<ServerResource> servers = super.getServerResources(platformConfig);
for (ServerResource server : servers) {
String srvName = server.getName();
String srvType = server.getType();
log.debug("[getServerResources] vCO server=" + srvName + " vCO Type=" + srvType);
String vcoConfFile = VRAUtils.getVcoConfFile(isWin32());
Properties cfg = configFile(vcoConfFile);
String jdbcURL = cfg.getProperty("database.url", "").replaceAll("\\:", ":");
log.debug("[getServerResources] jdbcURL='" + jdbcURL + "'");
String databaseServerFqdn = getDatabaseFqdn(jdbcURL);
log.debug("[getServerResources] databaseServerFqdn=" + databaseServerFqdn);
final Collection<String> vcoLoadBalancerFqdns = getVcoLoadBalancerFqdns(platformFqdn);
Resource modelResource =
getCommonModel(srvName, srvType, vcoLoadBalancerFqdns, databaseServerFqdn, platformFqdn);
String modelXml = marshallResource(modelResource);
setModelProperty(server, modelXml);
}
return servers;
}
/**
* @return
*/
private Collection<String> getVcoLoadBalancerFqdns(String vcoServerName) {
return getDnsNames(String.format("https://%s:8281", vcoServerName));
}
private static Resource getCommonModel(
String serverName,
String serverType,
Collection<String> loadBalancerFqdns,
String databaseServerFqdn,
String platformFqdn) {
ObjectFactory factory = new ObjectFactory();
Resource vcoServer = factory.createResource(!CREATE_IF_NOT_EXIST, serverType, serverName, ResourceTier.SERVER);
Resource serverGroup = factory.createLogicalResource(TYPE_VCO_TAG, appName);
Resource vraApp = factory.createApplicationResource(TYPE_VRA_APPLICATION, appName);
vcoServer.addRelations(factory.createRelation(serverGroup, PARENT));
serverGroup.addRelations(factory.createRelation(vraApp, PARENT));
createRelationshipLoadBalancer(loadBalancerFqdns, factory, vcoServer, serverGroup, vraApp);
createRelationshipDataBase(databaseServerFqdn, factory, vcoServer, vraApp, platformFqdn);
return vcoServer;
}
private static void createRelationshipDataBase(
String databaseServerFqdn,
ObjectFactory factory,
Resource vcoServer,
Resource vraApp,
String platformFqdn) {
Resource vraDatabasesGroup = factory.createLogicalResource(TYPE_VRA_DATABASES_GROUP, appName);
vraDatabasesGroup.addRelations(factory.createRelation(vraApp, RelationType.PARENT));
Resource databaseServerHostWin =
factory.createResource(!CREATE_IF_NOT_EXIST, VraConstants.TYPE_WINDOWS, databaseServerFqdn,
ResourceTier.PLATFORM);
Resource databaseServerHostLinux =
factory.createResource(!CREATE_IF_NOT_EXIST, VraConstants.TYPE_LINUX, databaseServerFqdn,
ResourceTier.PLATFORM);
databaseServerHostWin.addRelations(factory.createRelation(vraDatabasesGroup, RelationType.PARENT));
databaseServerHostLinux.addRelations(factory.createRelation(vraDatabasesGroup, RelationType.PARENT));
if (!VRAUtils.areFqdnsEquivalent(VRAUtils.getLocalFqdn(), databaseServerFqdn)) {
vcoServer.addRelations(
factory.createRelation(databaseServerHostWin,
VRAUtils.getDataBaseRalationType(databaseServerFqdn)),
factory.createRelation(databaseServerHostLinux,
VRAUtils.getDataBaseRalationType(databaseServerFqdn)));
}
}
private static void createRelationshipLoadBalancer(
Collection<String> loadBalancerFqdns,
ObjectFactory factory,
Resource vcoServer,
Resource serverGroup,
Resource vraApp) {
if (loadBalancerFqdns == null || loadBalancerFqdns.size() <= 0) {
log.debug("Unable to get the VCO load balancer FQDN name");
return;
}
Resource topLoadBalancerTag = factory.createLogicalResource(VraConstants.TYPE_LOAD_BALANCER_TAG, appName);
topLoadBalancerTag.addRelations(factory.createRelation(vraApp, PARENT));
Resource vcoLoadBalancerTag =
factory.createLogicalResource(VraConstants.TYPE_VRA_VCO_LOAD_BALANCER_TAG, appName);
vcoLoadBalancerTag.addRelations(factory.createRelation(topLoadBalancerTag, PARENT, CREATE_IF_NOT_EXIST));
for (String loadBalancerFqdn : loadBalancerFqdns) {
Resource vcoLoadBalancer =
factory.createResource(!CREATE_IF_NOT_EXIST, TYPE_VRA_VCO_LOAD_BALANCER, loadBalancerFqdn,
ResourceTier.SERVER);
vcoLoadBalancer.addRelations(factory.createRelation(vcoLoadBalancerTag, PARENT, CREATE_IF_NOT_EXIST),
(factory.createRelation(serverGroup, RelationType.PARENT, CREATE_IF_NOT_EXIST)));
vcoServer.addRelations(factory.createRelation(vcoLoadBalancer, RelationType.SIBLING));
}
}
private String getDatabaseFqdn(String jdbcConnectionString) {
// jdbcURL='jdbc:jtds:sqlserver://mssql-a2-bg-01.refarch.eng.vmware.com:1433/vCO;domain=refarch.eng.vmware.com;useNTLMv2=true'
return VRAUtils.getFqdn(jdbcConnectionString, AddressExtractorFactory.getDatabaseServerFqdnExtractor());
}
/* inline unit test
@Test
public void test() {
ServerResource server = new ServerResource();
server.setName("THE_SERVER");
server.setType("THE_SERVER_TYPE");
Collection<String> loadBalancerFqdns = new ArrayList<String>();
loadBalancerFqdns.add("vco.lb.com");
String jdbcUrl = getDatabaseFqdn("jdbc:jtds:sqlserver://mssql-a2-bg-01.refarch.eng.vmware.com:1433/vCO;domain=refarch.eng.vmware.com;useNTLMv2=true");
Resource modelResource = getCommonModel(server.getName(), server.getType(), loadBalancerFqdns, jdbcUrl);
String modelXml = marshallResource(modelResource);
Assert.assertNotNull(modelXml);
System.out.println(modelXml);
}
*/
}