aboutsummaryrefslogtreecommitdiff
path: root/dmucs_host_state.h
blob: b74951a4f259907b39cb21402a1e0e466bc1300f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef _DMUCS_HOST_STATE_H_
#define _DMUCS_HOST_STATE_H_ 1

/*
 * dmucs_host_state.cc: the DMUCS host state definition.
 *
 * Copyright (C) 2005, 2006  Victor T. Norman
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */


#include "dmucs_host.h"



/*
 * States of DmucsHosts:
 * o available -- we got a status "avail" message for the host and/or we are
 *   periodically receiving load average messages from it.  (Note: we may
 *   not always receive the status message -- when the host comes up before
 *   the Dmucs server.  In that case, we treat the load average message as
 *   a status "avail" message.
 * o unavailable -- we got a status "unavail" message from the host.  We
 *   may still be receiving load average messages from it, but it has been
 *   made "administratively" unavailable.
 * o overloaded -- the load average messages we receive indicate that the
 *   machine is very busy, and shouldn't be used for compiles.
 * o silent -- we got a status "avail" message from the host, but now we
 *   are not getting any load average messages from it.
 */

class DmucsHostState
{
public:
    virtual void avail(DmucsHost *host) {}
    virtual void unavail(DmucsHost *host) {}
    virtual void silent(DmucsHost *host) {}
    virtual void overloaded(DmucsHost *host) {}
    virtual void addToDb(DmucsHost *host) {}
    virtual void removeFromDb(DmucsHost *host) {}
    virtual const char *dump() { return "Unknown"; }
    virtual int asInt() { return (int) STATUS_UNKNOWN; }

protected:
    void changeState(DmucsHost *host, DmucsHostState *newState) {
	host->changeState(newState);
    }
};


class DmucsHostStateAvail : public DmucsHostState
{
public:
    virtual void unavail(DmucsHost *host);
    virtual void silent(DmucsHost *host);
    virtual void overloaded(DmucsHost *host);
    virtual int asInt() { return (int) STATUS_AVAILABLE; }
    virtual void addToDb(DmucsHost *host);
    virtual void removeFromDb(DmucsHost *host);
    virtual const char *dump() { return "Available"; }

    static DmucsHostStateAvail *getInstance();

private:
    DmucsHostStateAvail() {}

    static DmucsHostStateAvail *instance_;
};

class DmucsHostStateUnavail : public DmucsHostState
{
public:
    virtual void avail(DmucsHost *host);
    virtual int asInt() { return (int) STATUS_UNAVAILABLE; }
    virtual void addToDb(DmucsHost *host);
    virtual void removeFromDb(DmucsHost *host);
    virtual const char *dump() { return "Unavail"; }

    static DmucsHostStateUnavail *getInstance();

private:
    DmucsHostStateUnavail() {}
    
    static DmucsHostStateUnavail *instance_;
};

class DmucsHostStateSilent : public DmucsHostState
{
public:
    virtual void avail(DmucsHost *host);
    virtual void unavail(DmucsHost *host);
    virtual int asInt() { return (int) STATUS_SILENT; };
    virtual void addToDb(DmucsHost *host);
    virtual void removeFromDb(DmucsHost *host);
    virtual const char *dump() { return "Silent"; }

    static DmucsHostStateSilent *getInstance();

private:
    DmucsHostStateSilent() {}
    
    static DmucsHostStateSilent *instance_;
};

class DmucsHostStateOverloaded : public DmucsHostState
{
public:
    virtual void avail(DmucsHost *host);
    virtual void unavail(DmucsHost *host);
    virtual void silent(DmucsHost *host);
    virtual int asInt() { return (int) STATUS_OVERLOADED; }
    virtual void addToDb(DmucsHost *host);
    virtual void removeFromDb(DmucsHost *host);
    virtual const char *dump() { return "Overloaded"; }

    static DmucsHostStateOverloaded *getInstance();

private:
    DmucsHostStateOverloaded() {}
    
    static DmucsHostStateOverloaded *instance_;
};

#endif