Search in sources :

Example 1 with VsphereClient

use of com.vmware.flowgate.vcworker.client.VsphereClient in project flowgate by vmware.

the class VCDataService method queryHostMetaData.

public void queryHostMetaData(SDDCSoftwareConfig vc) {
    Map<String, ServerMapping> serverMappingMap = getVaildServerMapping(vc);
    if (serverMappingMap == null || serverMappingMap.isEmpty()) {
        logger.info("serverMapping is invaild");
        return;
    }
    try (VsphereClient vsphereClient = connectVsphere(vc)) {
        String vcInstanceUUID = vsphereClient.getVCUUID();
        Collection<HostSystem> hosts = vsphereClient.getAllHost();
        if (hosts == null || hosts.isEmpty()) {
            logger.error("vsphere: " + vsphereClient.getVCUUID() + " get hosts is null");
            return;
        }
        Collection<ClusterComputeResource> clusters = vsphereClient.getAllClusterComputeResource();
        Map<String, ClusterComputeResource> clusterMap = new HashMap<String, ClusterComputeResource>();
        if (clusters == null) {
            logger.error("vsphere: " + vsphereClient.getVCUUID() + " get clusters is null");
            return;
        }
        for (ClusterComputeResource cluster : clusters) {
            clusterMap.put(cluster._getRef().getValue(), cluster);
        }
        for (HostSystem host : hosts) {
            String mobId = host._getRef().getValue();
            if (serverMappingMap.containsKey(mobId)) {
                ServerMapping serverMapping = serverMappingMap.get(mobId);
                String assetId = serverMapping.getAsset();
                Asset hostMappingAsset = restClient.getAssetByID(assetId).getBody();
                if (hostMappingAsset == null) {
                    logger.error("serverMapping: " + serverMapping.getId() + " get asset: " + assetId + " is null");
                    continue;
                }
                HostInfo hostInfo = new HostInfo();
                HashMap<String, String> hostJustification = hostMappingAsset.getJustificationfields();
                if (hostJustification != null && !hostJustification.isEmpty()) {
                    String oldHostInfoString = hostJustification.get(FlowgateConstant.HOST_METADATA);
                    if (oldHostInfoString != null) {
                        try {
                            hostInfo = mapper.readValue(oldHostInfoString, HostInfo.class);
                        } catch (IOException ioException) {
                            logger.error("Cannot process message", ioException);
                            continue;
                        }
                    }
                }
                boolean hostNeedUpdate = false;
                boolean clusterNeedUpdate = false;
                hostNeedUpdate = feedHostMetaData(host, hostInfo);
                if (clusters != null && !clusters.isEmpty()) {
                    clusterNeedUpdate = feedClusterMetaData(clusterMap, host, hostInfo, vcInstanceUUID);
                }
                if (hostNeedUpdate || clusterNeedUpdate) {
                    try {
                        String vcHostObjStr = mapper.writeValueAsString(hostInfo);
                        hostJustification.put(FlowgateConstant.HOST_METADATA, vcHostObjStr);
                        hostMappingAsset.setJustificationfields(hostJustification);
                    } catch (JsonProcessingException jsonProcessingException) {
                        logger.error("Format host info map error", jsonProcessingException);
                        continue;
                    }
                    restClient.saveAssets(hostMappingAsset);
                } else {
                    logger.debug("host: " + mobId + " No update required");
                    continue;
                }
            }
        }
    } catch (ConnectionException connectionException) {
        checkAndUpdateIntegrationStatus(vc, connectionException.getMessage());
        return;
    } catch (ExecutionException executionException) {
        if (executionException.getCause() instanceof InvalidLogin) {
            logger.error("Failed to push data to " + vc.getServerURL(), executionException);
            checkAndUpdateIntegrationStatus(vc, "Invalid username or password.");
            return;
        }
    } catch (Exception exception) {
        logger.error("Failed to sync the host metadata to VC ", exception);
        return;
    }
}
Also used : ClusterComputeResource(com.vmware.vim.binding.vim.ClusterComputeResource) HashMap(java.util.HashMap) ServerMapping(com.vmware.flowgate.common.model.ServerMapping) VsphereClient(com.vmware.flowgate.vcworker.client.VsphereClient) IOException(java.io.IOException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) IOException(java.io.IOException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ExecutionException(java.util.concurrent.ExecutionException) HttpClientErrorException(org.springframework.web.client.HttpClientErrorException) HostSystem(com.vmware.vim.binding.vim.HostSystem) InvalidLogin(com.vmware.vim.binding.vim.fault.InvalidLogin) Asset(com.vmware.flowgate.common.model.Asset) ExecutionException(java.util.concurrent.ExecutionException) HostInfo(com.vmware.flowgate.vcworker.model.HostInfo) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException)

Example 2 with VsphereClient

use of com.vmware.flowgate.vcworker.client.VsphereClient in project flowgate by vmware.

the class VCDataService method syncCustomAttributes.

private void syncCustomAttributes(SDDCSoftwareConfig vc) {
    try (VsphereClient vsphereClient = connectVsphere(vc)) {
        for (String key : VCConstants.hostCustomAttrMapping.values()) {
            vsphereClient.createCustomAttribute(key, VCConstants.HOSTSYSTEM);
        }
        // Add the PDU information;
        vsphereClient.createCustomAttribute(VCConstants.ASSET_PDUs, VCConstants.HOSTSYSTEM);
        // Add host switch information;
        vsphereClient.createCustomAttribute(VCConstants.ASSET_SWITCHs, VCConstants.HOSTSYSTEM);
    } catch (ConnectionException connectionException) {
        checkAndUpdateIntegrationStatus(vc, connectionException.getMessage());
        return;
    } catch (ExecutionException executionException) {
        if (executionException.getCause() instanceof InvalidLogin) {
            logger.error("Failed to push data to " + vc.getServerURL(), executionException);
            IntegrationStatus integrationStatus = vc.getIntegrationStatus();
            if (integrationStatus == null) {
                integrationStatus = new IntegrationStatus();
            }
            integrationStatus.setStatus(IntegrationStatus.Status.ERROR);
            integrationStatus.setDetail("Invalid username or password.");
            integrationStatus.setRetryCounter(FlowgateConstant.DEFAULTNUMBEROFRETRIES);
            updateIntegrationStatus(vc);
            return;
        }
    } catch (Exception exception) {
        logger.error("Failed to sync the host metadata to VC ", exception);
        return;
    }
    try (HostTagClient client = new HostTagClient(vc.getServerURL(), vc.getUserName(), vc.getPassword(), !vc.isVerifyCert())) {
        client.initConnection();
        TagModel tag = client.getTagByName(VCConstants.locationAntiAffinityTagName);
        String categoryID;
        if (tag == null) {
            CategoryModel category = client.getTagCategoryByName(VCConstants.categoryName);
            if (category == null) {
                categoryID = client.createTagCategory(VCConstants.categoryName, VCConstants.categoryDescription, Cardinality.MULTIPLE);
            } else {
                categoryID = category.getId();
            }
            client.createTag(VCConstants.locationAntiAffinityTagName, VCConstants.locationAntiAffinityTagDescription, categoryID);
        }
    } catch (Exception exception) {
        logger.error("Faild to check the predefined tag information", exception);
    }
}
Also used : VsphereClient(com.vmware.flowgate.vcworker.client.VsphereClient) IntegrationStatus(com.vmware.flowgate.common.model.IntegrationStatus) InvalidLogin(com.vmware.vim.binding.vim.fault.InvalidLogin) HostTagClient(com.vmware.flowgate.vcworker.client.HostTagClient) CategoryModel(com.vmware.cis.tagging.CategoryModel) ExecutionException(java.util.concurrent.ExecutionException) TagModel(com.vmware.cis.tagging.TagModel) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) IOException(java.io.IOException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ExecutionException(java.util.concurrent.ExecutionException) HttpClientErrorException(org.springframework.web.client.HttpClientErrorException)

Example 3 with VsphereClient

use of com.vmware.flowgate.vcworker.client.VsphereClient in project flowgate by vmware.

the class VCDataService method syncCustomerAttrsData.

private void syncCustomerAttrsData(SDDCSoftwareConfig vcInfo) {
    restClient.setServiceKey(serviceKeyConfig.getServiceKey());
    try (VsphereClient vsphereClient = connectVsphere(vcInfo)) {
        ServerMapping[] mappings = null;
        try {
            mappings = restClient.getServerMappingsByVC(vcInfo.getId()).getBody();
        } catch (HttpClientErrorException clientError) {
            if (clientError.getRawStatusCode() != HttpStatus.NOT_FOUND.value()) {
                throw clientError;
            }
            mappings = new ServerMapping[0];
        }
        HashMap<String, ServerMapping> mobIdDictionary = new HashMap<String, ServerMapping>();
        for (ServerMapping mapping : mappings) {
            mobIdDictionary.put(mapping.getVcMobID(), mapping);
        }
        List<ServerMapping> validMapping = new ArrayList<ServerMapping>();
        Collection<HostSystem> hosts = vsphereClient.getAllHost();
        Map<String, HostSystem> hostDictionary = new HashMap<String, HostSystem>();
        for (HostSystem host : hosts) {
            String mobId = host._getRef().getValue();
            String hostName = host.getName();
            if (mobIdDictionary.containsKey(mobId)) {
                ServerMapping serverMapping = mobIdDictionary.get(mobId);
                if (!serverMapping.getVcHostName().equals(hostName)) {
                    // need to update the hostname.
                    serverMapping.setVcHostName(hostName);
                    restClient.saveServerMapping(serverMapping);
                }
                if (serverMapping.getAsset() != null) {
                    validMapping.add(serverMapping);
                } else {
                    // check the hostNameIP mapping
                    String ipaddress = IPAddressUtil.getIPAddress(hostName);
                    if (null != ipaddress) {
                        AssetIPMapping[] ipMappings = restClient.getHostnameIPMappingByIP(ipaddress).getBody();
                        if (null != ipMappings && ipMappings.length > 0) {
                            // update the mapping
                            String assetName = ipMappings[0].getAssetname();
                            Asset asset = restClient.getAssetByName(assetName).getBody();
                            if (asset != null) {
                                serverMapping.setAsset(asset.getId());
                                restClient.saveServerMapping(serverMapping);
                                validMapping.add(serverMapping);
                                feedAssetMetricsFormulars(asset);
                            }
                        } else {
                            // seems we don't have the ip hostname mapping. Notify infoblox to check the ip
                            logger.info("Notify infoblox to check ip: " + ipaddress);
                            publisher.publish(null, ipaddress);
                        }
                    }
                }
                hostDictionary.put(mobId, host);
            } else {
                ServerMapping newMapping = new ServerMapping();
                newMapping.setVcHostName(hostName);
                newMapping.setVcID(vcInfo.getId());
                newMapping.setVcMobID(mobId);
                newMapping.setVcInstanceUUID(vsphereClient.getVCUUID());
                String ipaddress = IPAddressUtil.getIPAddress(hostName);
                logger.info(String.format("hostName %s, ipaddress: %s", hostName, ipaddress));
                // publish message to queue.
                if (null != ipaddress) {
                    logger.info("Notify infoblox");
                    publisher.publish(null, hostName);
                    AssetIPMapping[] ipMappings = restClient.getHostnameIPMappingByIP(ipaddress).getBody();
                    if (null != ipMappings && ipMappings.length > 0) {
                        // update the mapping
                        String assetName = ipMappings[0].getAssetname();
                        Asset asset = restClient.getAssetByName(assetName).getBody();
                        if (asset != null) {
                            newMapping.setAsset(asset.getId());
                            feedAssetMetricsFormulars(asset);
                        }
                    }
                }
                restClient.saveServerMapping(newMapping);
            }
        }
        // feed meta data to VC.
        Asset[] assets = restClient.getAssetsByVCID(vcInfo.getId()).getBody();
        Map<String, Asset> assetDictionary = new HashMap<String, Asset>();
        for (Asset asset : assets) {
            assetDictionary.put(asset.getId(), asset);
        }
        feedData(assetDictionary, validMapping, hostDictionary);
        validClusterHostsLocationAntiaffinity(vcInfo, assetDictionary, validMapping);
    } catch (ConnectionException connectionException) {
        checkAndUpdateIntegrationStatus(vcInfo, connectionException.getMessage());
        return;
    } catch (ExecutionException executionException) {
        if (executionException.getCause() instanceof InvalidLogin) {
            logger.error("Failed to push data to " + vcInfo.getServerURL(), executionException);
            IntegrationStatus integrationStatus = vcInfo.getIntegrationStatus();
            if (integrationStatus == null) {
                integrationStatus = new IntegrationStatus();
            }
            integrationStatus.setStatus(IntegrationStatus.Status.ERROR);
            integrationStatus.setDetail("Invalid username or password.");
            integrationStatus.setRetryCounter(FlowgateConstant.DEFAULTNUMBEROFRETRIES);
            updateIntegrationStatus(vcInfo);
            return;
        }
    } catch (Exception exception) {
        logger.error("Failed to push data to " + vcInfo.getServerURL(), exception);
    }
}
Also used : HttpClientErrorException(org.springframework.web.client.HttpClientErrorException) HashMap(java.util.HashMap) VsphereClient(com.vmware.flowgate.vcworker.client.VsphereClient) ServerMapping(com.vmware.flowgate.common.model.ServerMapping) IntegrationStatus(com.vmware.flowgate.common.model.IntegrationStatus) ArrayList(java.util.ArrayList) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) IOException(java.io.IOException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ExecutionException(java.util.concurrent.ExecutionException) HttpClientErrorException(org.springframework.web.client.HttpClientErrorException) AssetIPMapping(com.vmware.flowgate.common.model.AssetIPMapping) HostSystem(com.vmware.vim.binding.vim.HostSystem) InvalidLogin(com.vmware.vim.binding.vim.fault.InvalidLogin) Asset(com.vmware.flowgate.common.model.Asset) ExecutionException(java.util.concurrent.ExecutionException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException)

Example 4 with VsphereClient

use of com.vmware.flowgate.vcworker.client.VsphereClient in project flowgate by vmware.

the class VCDataService method queryHostMetrics.

public void queryHostMetrics(SDDCSoftwareConfig vc) {
    Map<String, ServerMapping> serverMappingMap = getVaildServerMapping(vc);
    if (serverMappingMap == null || serverMappingMap.isEmpty()) {
        logger.info("No serverMapping found for vc {}", vc.getName());
        return;
    }
    try (VsphereClient vsphereClient = connectVsphere(vc)) {
        Collection<HostSystem> hosts = vsphereClient.getAllHost();
        if (hosts == null || hosts.isEmpty()) {
            logger.error("vsphere: {} get hosts is null", vc.getName());
            return;
        }
        for (HostSystem host : hosts) {
            String mobId = host._getRef().getValue();
            if (serverMappingMap.containsKey(mobId)) {
                ServerMapping serverMapping = serverMappingMap.get(mobId);
                String assetId = serverMapping.getAsset();
                Asset hostMappingAsset = restClient.getAssetByID(assetId).getBody();
                if (hostMappingAsset == null) {
                    logger.error("The asset {} doesn't exist in serverMapping {}.", assetId, serverMapping.getId());
                    continue;
                }
                feedHostUsageData(vsphereClient, assetId, host._getRef());
            }
        }
    } catch (ConnectionException connectionException) {
        checkAndUpdateIntegrationStatus(vc, connectionException.getMessage());
        return;
    } catch (ExecutionException executionException) {
        if (executionException.getCause() instanceof InvalidLogin) {
            logger.error("Failed to login {}: {}", vc.getServerURL(), executionException);
            checkAndUpdateIntegrationStatus(vc, "Invalid username or password.");
            return;
        }
    } catch (Exception exception) {
        logger.error("Failed to sync the host metrics to VC ", exception);
        return;
    }
}
Also used : ServerMapping(com.vmware.flowgate.common.model.ServerMapping) VsphereClient(com.vmware.flowgate.vcworker.client.VsphereClient) HostSystem(com.vmware.vim.binding.vim.HostSystem) InvalidLogin(com.vmware.vim.binding.vim.fault.InvalidLogin) Asset(com.vmware.flowgate.common.model.Asset) ExecutionException(java.util.concurrent.ExecutionException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) ConnectionException(com.vmware.vim.vmomi.client.exception.ConnectionException) IOException(java.io.IOException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ExecutionException(java.util.concurrent.ExecutionException) HttpClientErrorException(org.springframework.web.client.HttpClientErrorException)

Aggregations

JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)4 VsphereClient (com.vmware.flowgate.vcworker.client.VsphereClient)4 InvalidLogin (com.vmware.vim.binding.vim.fault.InvalidLogin)4 ConnectionException (com.vmware.vim.vmomi.client.exception.ConnectionException)4 IOException (java.io.IOException)4 ExecutionException (java.util.concurrent.ExecutionException)4 HttpClientErrorException (org.springframework.web.client.HttpClientErrorException)4 Asset (com.vmware.flowgate.common.model.Asset)3 ServerMapping (com.vmware.flowgate.common.model.ServerMapping)3 HostSystem (com.vmware.vim.binding.vim.HostSystem)3 IntegrationStatus (com.vmware.flowgate.common.model.IntegrationStatus)2 HashMap (java.util.HashMap)2 CategoryModel (com.vmware.cis.tagging.CategoryModel)1 TagModel (com.vmware.cis.tagging.TagModel)1 AssetIPMapping (com.vmware.flowgate.common.model.AssetIPMapping)1 HostTagClient (com.vmware.flowgate.vcworker.client.HostTagClient)1 HostInfo (com.vmware.flowgate.vcworker.model.HostInfo)1 ClusterComputeResource (com.vmware.vim.binding.vim.ClusterComputeResource)1 ArrayList (java.util.ArrayList)1