blob: 599275595439c335f5e23c5f91f8d345d8d0ee89 [file] [log] [blame]
/** @file
A brief file description
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
#ifndef _WEB_OVERVIEW_H_
#define _WEB_OVERVIEW_H_
#include "ink_hash_table.h"
#include "ink_mutex.h"
#include "WebGlobals.h"
#include "TextBuffer.h"
#include "List.h"
#include "WebHttpContext.h"
#include "WebHttpMessage.h"
#include "ExpandingArray.h"
#include "ClusterCom.h"
#include "P_RecCore.h"
/****************************************************************************
*
* WebOverview.h - code to overview page
*
*
****************************************************************************/
//
// There is one instance of the class overviewPage in the LocalManger
// process. The overviewPage instance stores a record of type
// overviewRecord for each node that has been seen in the cluster.
// The node records contain a list of active alarms on that node.
//
// overviewPage is responsible for the synchronization issues for both
// it self and all of its overviewRecords. Whenever updates are made
// to instances of either class, overviewPage's accessLock must be held.
//
// Pointers to overviewRecords are stored in overviewPage::nodeRecords
// hash table which is indexed on the nodes ip address (as an
// unsigned long). A second mapping is also maintained in sortRecords.
//
//
// Additional Notes
//
// These classes have expanded over time. overviewPage and
// overviewRecord are now clearing houses of cluster information
// for the UI.
// To simplify the locking issues, pointer to overviewRecords should
// NOT be returned by overviewPage. overviewRecords are internal
// to overviewPage and any data needed from an overviewRecord
// should be returned as a copy (or a const ptr)
// through an accessor function
enum PowerLampState
{ LAMP_ON, LAMP_OFF, LAMP_WARNING };
// information about a specific node in the cluster
class overviewRecord
{
public:
overviewRecord(unsigned long inet_addr, bool local, ClusterPeerInfo * cpi = NULL);
~overviewRecord();
void updateStatus(time_t currentTime, ClusterPeerInfo * cpi);
void getStatus(char **hotsname, bool * up, bool * alarms, PowerLampState * proxyUp);
bool ipMatch(char *ipStr); // is this the ip address of this node
bool up;
bool localNode;
char *hostname; // FQ hostname of the node
unsigned long inetAddr; // IP address of the node
bool varStrFromName(const char *varName, char *bufVal, int bufLen);
RecCounter readCounter(const char *name, bool * found);
RecInt readInteger(const char *name, bool * found);
RecFloat readFloat(const char *name, bool * found);
RecString readString(const char *name, bool * found);
RecData readData(RecDataT varType, const char *name, bool * found);
bool varIntFromName(const char *varName, RecInt * value);
bool varFloatFromName(const char *varName, RecFloat * value);
bool varCounterFromName(const char *varName, RecCounter * value);
private:
RecRecords node_rec_data; // a copy from ClusterPeerInfo
int recordArraySize; // the size of node_data.recs
int node_rec_first_ix; // Kludge, but store the first order ix for later use
overviewRecord(const overviewRecord &);
};
// information about the entire cluster
class overviewPage
{
public:
overviewPage();
~overviewPage();
void checkForUpdates();
char *resolvePeerHostname(const char *peerIP);
char *resolvePeerHostname_ml(const char *peerIP);
int getClusterHosts(ExpandingArray * hosts);
MgmtInt readInteger(const char *nodeName, const char *name, bool * found = NULL);
MgmtFloat readFloat(const char *nodeName, const char *name, bool * found = NULL);
MgmtString readString(const char *nodeName, const char *name, bool * found = NULL);
void addSelfRecord();
int varClusterDataFromName(RecDataT varType, char *nodeVar, RecData *sum);
private:
ink_mutex accessLock;
// Private fcns
overviewPage(const overviewPage &);
void addRecord(ClusterPeerInfo * cpi);
overviewRecord *findNodeByName(const char *nodeName);
void addReading(MgmtInt reading, textBuffer * output, int nDigits, const char **gifs, const char **alts);
void addLoadBar(textBuffer * output, MgmtInt load);
void sortHosts();
bool moreInfoButton(const char *submission, textBuffer * output);
void addHostPanel(WebHttpContext * whc, overviewRecord * host);
// Private variables
InkHashTable *nodeRecords; // container for overviewRecords
unsigned long ourAddr; // the IP address of this node
ExpandingArray sortRecords; // A second, sorted container for nodeRecords
int numHosts; // number of peers we know about including ourself
int clusterSumData(RecDataT varType, const char *nodeVar, RecData *sum);
};
extern overviewPage *overviewGenerator; // global handle to overiewPage?
// defn found in WebOverview.cc
int hostSortFunc(const void *arg1, const void *arg2);
#endif