com.pivotal.gemfire.tools.pulse.testbed.PropMockDataUpdater.java Source code

Java tutorial

Introduction

Here is the source code for com.pivotal.gemfire.tools.pulse.testbed.PropMockDataUpdater.java

Source

/*
 * Copyright (c) 2010-2015 Pivotal Software, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you
 * may not use this file except in compliance with the License. You
 * may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License. See accompanying
 * LICENSE file.
 */

package com.pivotal.gemfire.tools.pulse.testbed;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.ResourceBundle;

import org.json.JSONException;
import org.json.JSONObject;

import com.pivotal.gemfire.tools.pulse.internal.data.Cluster;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.Alert;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.Client;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.GatewayReceiver;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.GatewaySender;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.Member;
import com.pivotal.gemfire.tools.pulse.internal.data.Cluster.Region;
import com.pivotal.gemfire.tools.pulse.internal.data.IClusterUpdater;
import com.pivotal.gemfire.tools.pulse.internal.data.PulseConstants;
import com.pivotal.gemfire.tools.pulse.internal.data.Repository;
import com.pivotal.gemfire.tools.pulse.internal.log.PulseLogWriter;
import com.pivotal.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Locator;
import com.pivotal.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Peer;
import com.pivotal.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Server;

public class PropMockDataUpdater implements IClusterUpdater {
    private static final int MAX_HOSTS = 40;
    private static final PulseLogWriter LOGGER = PulseLogWriter.getLogger();
    private final ResourceBundle resourceBundle = Repository.get().getResourceBundle();
    private static final int POLL_INTERVAL = 5000;
    public static final int MAX_SAMPLE_SIZE = 180;
    public static final int ALERTS_MAX_SIZE = 1000;
    public static final int PAGE_ALERTS_MAX_SIZE = 100;

    private Cluster cluster = null;
    private TestBed testbed;
    private final String testbedFile = System.getProperty("pulse.propMockDataUpdaterFile");;

    public PropMockDataUpdater(Cluster cluster) {
        this.cluster = cluster;
        try {
            loadPropertiesFile();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void loadPropertiesFile() throws FileNotFoundException, IOException {
        this.testbed = new TestBed(testbedFile, true);
    }

    /**
     * function used for updating Cluster data
     * for Mock
     */
    @Override
    public boolean updateData() {
        cluster.setConnectedFlag(true);
        Random r = new Random(System.currentTimeMillis());
        long totalHeapSize = Math.abs(r.nextInt(3200 - 2048) + 2048);
        cluster.setTotalHeapSize(totalHeapSize);
        long usedHeapSize = Math.abs(r.nextInt(2048));
        cluster.setUsedHeapSize(usedHeapSize);
        float writePerSec = Math.abs(r.nextInt(100));
        cluster.setWritePerSec(writePerSec);

        //propfile
        cluster.setSubscriptionCount(testbed.getRootDs().getClients().size());
        cluster.setRegisteredCQCount((long) testbed.getRootDs().getCQs().size());
        cluster.setRunningFunctionCount(testbed.getRootDs().getFunction().size());

        cluster.setClusterId(Math.abs(r.nextInt(100)));
        cluster.getWritePerSecTrend().add(writePerSec);
        cluster.setDiskWritesRate(writePerSec);

        long garbageCollectionCount = Math.abs(r.nextInt(100));
        cluster.setGarbageCollectionCount(garbageCollectionCount);
        cluster.getGarbageCollectionTrend().add(garbageCollectionCount);

        long readPerSec = Math.abs(r.nextInt(100));
        cluster.setReadPerSec(readPerSec);
        cluster.getReadPerSecTrend().add(readPerSec);

        long diskReadsRate = readPerSec;
        cluster.setDiskReadsRate(diskReadsRate);
        cluster.setDiskReadsRate(readPerSec);
        long queriesPerSec = Math.abs(r.nextInt(100));
        cluster.setQueriesPerSec(queriesPerSec);
        cluster.getQueriesPerSecTrend().add(queriesPerSec);

        long loadPerSec = Math.abs(r.nextInt(100));
        cluster.setLoadPerSec(loadPerSec);
        cluster.setTotalHeapSize(totalHeapSize);
        long totalBytesOnDisk = totalHeapSize;
        cluster.setTotalBytesOnDisk(totalBytesOnDisk);

        cluster.getTotalBytesOnDiskTrend().add(totalBytesOnDisk);

        cluster.getMemoryUsageTrend().add(usedHeapSize);
        cluster.getThroughoutWritesTrend().add(writePerSec);

        cluster.setMemberCount(0);

        Map<String, Cluster.Member> membersHMap = cluster.getMembersHMap();
        Collection<Cluster.Region> regionsList = cluster.getClusterRegions().values();
        Map<String, Boolean> wanInformation = cluster.getWanInformation();

        // Create 3 members first time around
        int locatorCount = 0;
        if (membersHMap.size() == 0) {
            for (Locator locator : testbed.getRootDs().getLocators()) {
                String id = "(Launcher_Locator-1099-13-40-24-5368)-" + locatorCount++;
                String name = locator.getName();
                membersHMap.put(id + name, initializeMember(id, name, true, true, true, false, locator.getHost()));
            }
            cluster.setLocatorCount(testbed.getRootDs().getLocators().size());

            int serverCount = 0;
            for (Server server : testbed.getRootDs().getServers()) {
                String id = "(Launcher_Server-1099-13-40-24-5368)-" + serverCount++;
                String name = server.getName();
                membersHMap.put(id + name, initializeMember(id, name, false, true, false, true, server.getHost()));
            }
            cluster.setServerCount(testbed.getRootDs().getServers().size());

            int peerCount = 0;
            for (Peer peer : testbed.getRootDs().getPeers()) {
                String id = "(Launcher_Peer-1099-13-40-24-5368)-" + peerCount++;
                String name = peer.getName();
                membersHMap.put(id + name, initializeMember(id, name, false, true, false, false, peer.getHost()));
            }

            for (Entry<String, Member> memberSet : membersHMap.entrySet()) {
                HashMap<String, Cluster.Region> memberRegions = new HashMap<String, Cluster.Region>();
                HashMap<String, Cluster.Client> memberClientsHM = new HashMap<String, Cluster.Client>();

                Random randomGenerator = new Random();

                //Read from property file
                int randomInt = (randomGenerator.nextInt(5)) + 1;
                List<com.pivotal.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Region> thisMemberRegions = testbed
                        .getRootDs().getRegions(memberSet.getValue().getName());

                int regionExists = 0;
                int index = 0;
                for (com.pivotal.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Region thisMemberRegion : thisMemberRegions) {
                    Region region = initMemberRegion(index++, thisMemberRegion.getName(),
                            memberSet.getValue().getName(), thisMemberRegion.getEntryCount(),
                            thisMemberRegion.getType(), thisMemberRegion.getMembers().size()); //read from property file
                    if (regionsList.size() > 0) {
                        for (Region clusterRegion : regionsList) {
                            if ((region.getName()).equals(clusterRegion.getName())) {
                                clusterRegion.getMemberName().add(memberSet.getValue().getName());
                                //clusterRegion.memberCount = clusterRegion.memberCount + 1;
                                //int mcount = clusterRegion.getMemberCount() + 1;
                                //clusterRegion.setMemberCount(mcount);
                                regionExists = 1;
                                break;
                            }
                        }
                        if (regionExists == 0) {
                            cluster.addClusterRegion(region.getFullPath(), region);
                            regionsList = cluster.getClusterRegions().values();
                        }
                    } else {
                        cluster.addClusterRegion(region.getFullPath(), region);
                        regionsList = cluster.getClusterRegions().values();
                    }
                    memberRegions.put(region.getFullPath(), region);
                    //totalRegionCount = regionsList.size();
                    cluster.setTotalRegionCount(regionsList.size());
                }
                membersHMap.get(memberSet.getKey()).setMemberRegions(memberRegions);

                if (memberSet.getValue().isCache()) {
                    Client client = initMemberClient(0, memberSet.getValue().getHost()); //read from prop File
                    memberClientsHM.put(client.getId(), client);
                    randomInt = randomGenerator.nextInt(10);
                    for (int y = 1; y < randomInt; y++) {
                        Client newClient = initMemberClient(y, memberSet.getValue().getHost());
                        memberClientsHM.put(newClient.getId(), newClient);
                    }
                    membersHMap.get(memberSet.getKey()).updateMemberClientsHMap(memberClientsHM);
                    /*clientConnectionCount = clientConnectionCount
                        + membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size();*/
                    long clientConnectionCount = cluster.getClientConnectionCount()
                            + membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size();
                    cluster.setClientConnectionCount(clientConnectionCount);
                }

            }
        }
        wanInformation.clear(); //read from property file
        int wanInfoSize = Math.abs(r.nextInt(10));
        wanInfoSize++;
        for (int i = 0; i < wanInfoSize; i++) {
            String name = "Mock Cluster" + i;
            Boolean value = false;
            if (i % 2 == 0) {
                value = true;
            }
            wanInformation.put(name, value);
        }
        //memberCount = membersHMap.size();
        cluster.setMemberCount(membersHMap.size());

        totalHeapSize = 0;
        for (Entry<String, Member> memberSet : membersHMap.entrySet()) {
            refresh(membersHMap.get(memberSet.getKey()));
            Member member = membersHMap.get(memberSet.getKey());
            totalHeapSize += member.getCurrentHeapSize();
        }

        for (Region region : regionsList) {
            region.setGetsRate((Math.abs(r.nextInt(100))) + 1);
            region.setPutsRate((Math.abs(r.nextInt(100))) + 1);
            region.getGetsPerSecTrend().add(region.getGetsRate());
            region.getPutsPerSecTrend().add(region.getPutsRate());
        }

        return true;
    }

    private Region initMemberRegion(int count, String regionName, String memName, int entryCount, String type,
            int memberCount) {
        Region memberRegion = new Region();
        memberRegion.setName(regionName);
        memberRegion.setFullPath("/" + regionName);
        Random randomGenerator = new Random();
        memberRegion.setSystemRegionEntryCount(entryCount);
        // memberRegion.setEntrySize("N/A");
        memberRegion.setEntrySize(Math.abs(randomGenerator.nextInt(10)));
        memberRegion.setDiskStoreName("ABC");
        memberRegion.setScope("DISTRIBUTED_NO_ACK");
        memberRegion.setDiskSynchronous(true);
        memberRegion.setRegionType(type);
        if (type.contains("PERSISTENT"))
            memberRegion.setPersistentEnabled(true);
        else
            memberRegion.setPersistentEnabled(false);
        if (count % 2 == 0) {
            memberRegion.setWanEnabled(true);
        } else {
            memberRegion.setWanEnabled(false);
        }
        memberRegion.setWanEnabled(true);
        /*memberRegion.setSystemRegionEntryCount(Long.valueOf(String.valueOf(Math
            .abs(randomGenerator.nextInt(100)))));*/
        memberRegion.getMemberName().add(memName);
        memberRegion.setMemberCount(memberCount);
        return memberRegion;
    }

    private Client initMemberClient(int count, String host) {

        Client memberClient = new Client();
        Random r = new Random(System.currentTimeMillis());
        memberClient.setName("Name_" + count);
        long processCpuTime = (long) (r.nextDouble() * 100);
        memberClient.setProcessCpuTime(processCpuTime);
        memberClient.setCpuUsage(0);
        memberClient.setGets(Math.abs(r.nextInt(100)));
        memberClient.setHost(host);
        memberClient.setId(String.valueOf(1000 + count));
        memberClient.setPuts(Math.abs(r.nextInt(100)));
        memberClient.setCpus(Math.abs(r.nextInt(20)));
        memberClient.setQueueSize(Math.abs(r.nextInt(100)));
        if ((count % 2) == 0) {
            memberClient.setStatus("up");
        } else {
            memberClient.setStatus("down");
        }
        memberClient.setThreads(Math.abs(r.nextInt(100)));
        memberClient.setUptime(Math.abs(System.currentTimeMillis() - r.nextLong()));

        return memberClient;
    }

    private Member initializeMember(String id, String name, boolean manager, boolean isCache, boolean isLocator,
            boolean isServer, String host) {
        Member m = new Member();

        m.setId(id);
        m.setName(name);

        //m.setHost(getHostName(System.currentTimeMillis()));
        m.setHost(host);

        m.setMaxHeapSize(247);

        Random r = new Random(System.currentTimeMillis());

        m.setCache(isCache);
        m.setLocator(isLocator);
        m.setServer(isServer);
        m.setManager(manager);

        m.setLoadAverage((double) Math.abs(r.nextInt(100)));
        m.setNumThreads(Math.abs(r.nextInt(100)));
        m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100)));
        m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount());

        m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100)));
        m.setTotalDiskUsage(Math.abs(r.nextInt(100)));

        m.setThroughputWrites(Math.abs(r.nextInt(10)));
        m.getThroughputWritesTrend().add(m.getThroughputWrites());

        GatewayReceiver gatewayReceiver = m.getGatewayReceiver();
        if (gatewayReceiver == null) {
            gatewayReceiver = new Cluster.GatewayReceiver();
            m.setGatewayReceiver(gatewayReceiver);
        }
        String port = cluster.getPort();
        if (port == null || "".equals(port))
            port = "1099";
        gatewayReceiver.setListeningPort(Integer.parseInt(port));
        gatewayReceiver.setLinkThroughput((float) Math.abs(r.nextInt(10)));
        gatewayReceiver.setAvgBatchProcessingTime((long) Math.abs(r.nextInt(10)));
        gatewayReceiver.setId(String.valueOf(Math.abs(r.nextInt(10))));
        gatewayReceiver.setQueueSize(Math.abs(r.nextInt(10)));
        gatewayReceiver.setStatus(true);
        gatewayReceiver.setBatchSize(Math.abs(r.nextInt(10)));

        int gatewaySenderCount = Math.abs(r.nextInt(10));

        List<GatewaySender> list = m.getGatewaySenderList();

        for (int i = 0; i < gatewaySenderCount; i++) {
            list.add(createGatewaySenderCount(r));
        }

        Map<String, List<Member>> physicalToMember = cluster.getPhysicalToMember();

        List<Cluster.Member> memberArrList = physicalToMember.get(m.getHost());
        if (memberArrList != null) {
            memberArrList.add(m);
        } else {
            ArrayList<Cluster.Member> memberList = new ArrayList<Cluster.Member>();
            memberList.add(m);
            physicalToMember.put(m.getHost(), memberList);
        }
        int memberCount = cluster.getMemberCount();
        memberCount++;
        cluster.setMemberCount(memberCount);
        return m;
    }

    private GatewaySender createGatewaySenderCount(Random r) {

        GatewaySender gatewaySender = new GatewaySender();

        gatewaySender.setBatchSize(Math.abs(r.nextInt(10)));
        gatewaySender.setId(String.valueOf(Math.abs(r.nextInt(10))));
        gatewaySender.setLinkThroughput((float) Math.abs(r.nextInt(10)));
        gatewaySender.setPersistenceEnabled(true);
        gatewaySender.setPrimary(true);
        gatewaySender.setQueueSize(Math.abs(r.nextInt(10)));
        gatewaySender.setSenderType(false);
        gatewaySender.setStatus(true);

        return gatewaySender;
    }

    /*
    private String getHostName(long rndSeed) {
      Random rnd = new Random(rndSeed);
      String hName = null;
        
      int index = Math.abs(rnd.nextInt(MAX_HOSTS));
        
      ArrayList<String> hostNames = cluster.getHostNames();
        
      if (hostNames.size() <= index) {
        hName = "host" + hostNames.size();
        hostNames.add(hName);
      } else {
        hName = hostNames.get(index);
      }
        
      Map<String, ArrayList<Member>> physicalToMember = cluster.getPhysicalToMember();
        
      ArrayList<Member> memberArrList = physicalToMember.get(hName);
      if (memberArrList != null) {
        if (memberArrList.size() > 4){
    hName = getHostName(rndSeed + rnd.nextLong());
        }
      }
      return hName;
    }*/

    private void refresh(Member m) {
        if (LOGGER.infoEnabled()) {
            LOGGER.info(resourceBundle.getString("LOG_MSG_REFRESHING_MEMBER_DATA") + " : " + m.getName());
        }

        Random r = new Random(System.currentTimeMillis());

        m.setUptime(System.currentTimeMillis());
        m.setQueueBacklog("" + Math.abs(r.nextInt(500)));
        m.setCurrentHeapSize(Math.abs(r.nextInt(Math.abs((int) m.getMaxHeapSize()))));
        m.setTotalDiskUsage(Math.abs(r.nextInt(100)));

        Float cpuUsage = r.nextFloat() * 100;
        m.getCpuUsageSamples().add(cpuUsage);
        m.setCpuUsage(cpuUsage);

        m.getHeapUsageSamples().add(m.getCurrentHeapSize());
        m.setLoadAverage((double) Math.abs(r.nextInt(100)));
        m.setNumThreads(Math.abs(r.nextInt(100)));
        m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100)));
        m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount());

        m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100)));

        m.setThroughputWrites(Math.abs(r.nextInt(10)));
        m.getThroughputWritesTrend().add(m.getThroughputWrites());

        m.setGetsRate(Math.abs(r.nextInt(5000)));
        m.getGetsPerSecond().add(m.getGetsRate());

        m.setPutsRate(Math.abs(r.nextInt(5000)));
        m.getPutsPerSecond().add(m.getPutsRate());

        Alert[] alerts = cluster.getAlertsList();
        List<Alert> alertsList = new ArrayList<Alert>(Arrays.asList(alerts));

        if (r.nextBoolean()) {
            // Generate alerts
            if (r.nextBoolean()) {
                if (r.nextInt(10) > 5) {
                    alertsList.add(createAlert(Alert.SEVERE, m.getName(), alertsList.size()));
                    if (alertsList.size() > ALERTS_MAX_SIZE) {
                        alertsList.remove(0);
                    }
                }
            }

            if (r.nextBoolean()) {
                if (r.nextInt(10) > 5) {
                    alertsList.add(createAlert(Alert.ERROR, m.getName(), alertsList.size()));
                    if (alertsList.size() > ALERTS_MAX_SIZE) {
                        alertsList.remove(0);
                    }
                }
            }

            if (r.nextBoolean()) {
                if (r.nextInt(10) > 5) {
                    alertsList.add(createAlert(Alert.WARNING, m.getName(), alertsList.size()));
                    if (alertsList.size() > ALERTS_MAX_SIZE) {
                        alertsList.remove(0);
                    }
                }
            }
        }
    }

    private Alert createAlert(int sev, String memberName, int index) {

        Alert alert = new Alert();
        alert.setSeverity(sev);
        alert.setId(index);
        alert.setMemberName(memberName);
        alert.setTimestamp(new Date());

        switch (sev) {
        case Alert.SEVERE:
            alert.setDescription(PulseConstants.ALERT_DESC_SEVERE);
            break;
        case Alert.ERROR:
            alert.setDescription(PulseConstants.ALERT_DESC_ERROR);
            break;
        case Alert.WARNING:
            alert.setDescription(PulseConstants.ALERT_DESC_WARNING);
            break;
        }
        return alert;
    }

    @Override
    public JSONObject executeQuery(String queryText, String members, int limit) throws JSONException {
        // TODO for Sushant/Sachin - Add implementation for MockUpdater for Automation
        return null;
    }

}