1 /*
2  * dmucs_host_state.cc: the DMUCS host state implementation.
3  *
4  * Copyright (C) 2005, 2006  Victor T. Norman
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; either version 2 of the License, or (at your
9  * option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14  * Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  */
20 
21 #include "dmucs_host_state.h"
22 #include "dmucs_db.h"
23 
24 
25 
26 DmucsHostStateAvail *DmucsHostStateAvail::instance_ = NULL;
27 
28 
29 DmucsHostStateAvail *
getInstance()30 DmucsHostStateAvail::getInstance()
31 {
32     if (instance_ == NULL) {
33 	instance_ = new DmucsHostStateAvail();
34     }
35     return instance_;
36 }
37 
38 
39 void
unavail(DmucsHost * host)40 DmucsHostStateAvail::unavail(DmucsHost *host)
41 {
42     /* Remove the CPUs from the cpus database. */
43     DmucsDb::getInstance()->delCpusFromTier(host, host->getTier(),
44 					    host->getIpAddrInt());
45     /* Move the host to the overloaded state: remove from availHosts_ and
46        add to overloadedHosts_. */
47     removeFromDb(host);
48     DmucsHostState::changeState(host, DmucsHostStateUnavail::getInstance());
49 }
50 
51 
52 void
silent(DmucsHost * host)53 DmucsHostStateAvail::silent(DmucsHost *host)
54 {
55     /* Remove the CPUs from the cpus database. */
56     DmucsDb::getInstance()->delCpusFromTier(host, host->getTier(),
57 					    host->getIpAddrInt());
58     /* Move the host to the overloaded state: remove from availHosts_ and
59        add to overloadedHosts_. */
60     removeFromDb(host);
61     DmucsHostState::changeState(host, DmucsHostStateSilent::getInstance());
62 }
63 
64 
65 void
overloaded(DmucsHost * host)66 DmucsHostStateAvail::overloaded(DmucsHost *host)
67 {
68     /* Remove the CPUs from the cpus database. */
69     DmucsDb::getInstance()->delCpusFromTier(host, host->getTier(),
70 					    host->getIpAddrInt());
71     /* Move the host to the overloaded state: remove from availHosts_ and
72        add to overloadedHosts_. */
73     removeFromDb(host);
74     DmucsHostState::changeState(host, DmucsHostStateOverloaded::getInstance());
75 }
76 
77 
78 void
removeFromDb(DmucsHost * host)79 DmucsHostStateAvail::removeFromDb(DmucsHost *host)
80 {
81     DmucsDb::getInstance()->delFromAvailDb(host);
82 }
83 
84 void
addToDb(DmucsHost * host)85 DmucsHostStateAvail::addToDb(DmucsHost *host)
86 {
87     DmucsDb::getInstance()->addToAvailDb(host);
88 }
89 
90 
91 /* ====================================================================== */
92 
93 DmucsHostStateUnavail *DmucsHostStateUnavail::instance_ = NULL;
94 
95 DmucsHostStateUnavail *
getInstance()96 DmucsHostStateUnavail::getInstance()
97 {
98     if (instance_ == NULL) {
99 	instance_ = new DmucsHostStateUnavail();
100     }
101     return instance_;
102 }
103 
104 void
avail(DmucsHost * host)105 DmucsHostStateUnavail::avail(DmucsHost *host)
106 {
107     removeFromDb(host);
108 
109     int tier = host->getTier();
110     if (tier == 0) {
111 	DmucsHostState::changeState(host,
112 				    DmucsHostStateOverloaded::getInstance());
113     } else {
114 	DmucsHostState::changeState(host, DmucsHostStateAvail::getInstance());
115     }
116 }
117 
118 
119 void
addToDb(DmucsHost * host)120 DmucsHostStateUnavail::addToDb(DmucsHost *host)
121 {
122     DmucsDb::getInstance()->addToUnavailDb(host);
123 }
124 
125 
126 void
removeFromDb(DmucsHost * host)127 DmucsHostStateUnavail::removeFromDb(DmucsHost *host)
128 {
129     DmucsDb::getInstance()->delFromUnavailDb(host);
130 }
131 
132 
133 /* ====================================================================== */
134 
135 DmucsHostStateSilent *DmucsHostStateSilent::instance_ = NULL;
136 
137 DmucsHostStateSilent *
getInstance()138 DmucsHostStateSilent::getInstance()
139 {
140     if (instance_ == NULL) {
141 	instance_ = new DmucsHostStateSilent();
142     }
143     return instance_;
144 }
145 
146 void
avail(DmucsHost * host)147 DmucsHostStateSilent::avail(DmucsHost *host)
148 {
149     removeFromDb(host);
150     DmucsHostState::changeState(host, DmucsHostStateAvail::getInstance());
151 }
152 
153 
154 void
unavail(DmucsHost * host)155 DmucsHostStateSilent::unavail(DmucsHost *host)
156 {
157     removeFromDb(host);
158     DmucsHostState::changeState(host, DmucsHostStateUnavail::getInstance());
159 }
160 
161 
162 void
addToDb(DmucsHost * host)163 DmucsHostStateSilent::addToDb(DmucsHost *host)
164 {
165     DmucsDb::getInstance()->addToSilentDb(host);
166 }
167 
168 
169 void
removeFromDb(DmucsHost * host)170 DmucsHostStateSilent::removeFromDb(DmucsHost *host)
171 {
172     DmucsDb::getInstance()->delFromSilentDb(host);
173 }
174 
175 
176 
177 /* ====================================================================== */
178 
179 
180 DmucsHostStateOverloaded *DmucsHostStateOverloaded::instance_ = NULL;
181 
182 DmucsHostStateOverloaded *
getInstance()183 DmucsHostStateOverloaded::getInstance()
184 {
185     if (instance_ == NULL) {
186 	instance_ = new DmucsHostStateOverloaded();
187     }
188     return instance_;
189 }
190 
191 void
avail(DmucsHost * host)192 DmucsHostStateOverloaded::avail(DmucsHost *host)
193 {
194     removeFromDb(host);
195     DmucsHostState::changeState(host, DmucsHostStateAvail::getInstance());
196 }
197 
198 
199 void
unavail(DmucsHost * host)200 DmucsHostStateOverloaded::unavail(DmucsHost *host)
201 {
202     removeFromDb(host);
203     DmucsHostState::changeState(host, DmucsHostStateUnavail::getInstance());
204 }
205 
206 
207 void
silent(DmucsHost * host)208 DmucsHostStateOverloaded::silent(DmucsHost *host)
209 {
210     removeFromDb(host);
211     DmucsHostState::changeState(host, DmucsHostStateSilent::getInstance());
212 }
213 
214 
215 void
addToDb(DmucsHost * host)216 DmucsHostStateOverloaded::addToDb(DmucsHost *host)
217 {
218     DmucsDb::getInstance()->addToOverloadedDb(host);
219 }
220 
221 
222 void
removeFromDb(DmucsHost * host)223 DmucsHostStateOverloaded::removeFromDb(DmucsHost *host)
224 {
225     DmucsDb::getInstance()->delFromOverloadedDb(host);
226 }
227