Megatest

Changes On Branch v2.01
Login

Changes In Branch v2.01 Excluding Merge-Ins

This is equivalent to a diff from 6876e30f5e to 4642aef9b9

2019-09-20
04:03
Merged in v1.65 check-in: 24ae688ff1 user: matt tags: trunk
2019-08-30
11:43
sysmon min-project initial checkin. Leaf check-in: 4642aef9b9 user: mmgraham tags: v2.01
2019-07-31
08:54
Added plugins directory and readme. check-in: e96dd8ce30 user: mrwellan tags: v2.01
2019-07-26
11:50
Edited TODO with coarse list of stuff to be done for v2.01 check-in: b494d96ce5 user: mrwellan tags: v2.01
11:42
Merged v1.65 to trunk in prep for v2.01 check-in: 6876e30f5e user: mrwellan tags: trunk
2019-07-12
15:12
Changed login failed to login unsuccessfull check-in: f7a5f0b8f1 user: mrwellan tags: v1.65
2019-06-06
14:06
Merging v1.65 back to trunk check-in: 39a024c31f user: matt tags: trunk

Modified TODO from [e0a2376de1] to [1395fc5531].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

34
# 
#     You should have received a copy of the GNU General Public License
#     along with Megatest.  If not, see <http://www.gnu.org/licenses/>.

TODO
====

. Dashboard should resist running from non-homehost



Migration to inmem db plus per run db
-------------------------------------

. Re-work the dbstruct data structure?
.. Move main.db to global?
.. [ run-id.db inmemdb last-mod last-read last-sync inuse ]
. Re-work all queries to use run-id to dereference server
. Open main.db directly in calls to -runtests etc. No need to talk remote?
. remove common:faux-lock









<
|
|
|
|
<
|
<
<
<
|
<
<
>

14
15
16
17
18
19
20

21
22
23
24

25



26


27
28
# 
#     You should have received a copy of the GNU General Public License
#     along with Megatest.  If not, see <http://www.gnu.org/licenses/>.

TODO
====


. Bring back unit tests for api calls and get them clean
. Pick few units and convert to modules
. Integrate ULEX into Megatest
. Integrate ULEX into multi-area dashboard ???

. Update docs as needed



. Enhancements to ULEX itself


.. Explore using nanomsg as rpc seems a little slow?

Added plugins/README.md version [47d87307e7].



>
1
A handful of tools that complement the Megatest ecosystem.

Added plugins/sysmon/sysmon.scm version [dd6d04f89f].























































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
;;; dbi: Minimal gasket to postgresql, sqlite3 and mysql
;;;
;; Copyright (C) 2007-2016 Matt Welland
;; Redistribution and use in source and binary forms, with or without
;; modification, is permitted.
;;
;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
;; OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
;; USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
;; DAMAGE.

(use regex srfi-18 matchable)

(use (prefix ulex ulex:))

(use hostinfo)
(use shell)

(create-directory "ulexdb" #t)
(create-directory "pkts"   #f)

(define *area* (ulex:make-area
		dbdir:   (conc (current-directory) "/ulexdb")
		pktsdir: (conc (current-directory) "/pkts") 
		))
(define (toplevel-command . args) #f)
(use readline)

;; two reserved keys in the ulex registration hash table are:
;;   dbinitsql => a list of sql statements to be executed at db creation time
;;   dbinitfn  => a function of two params; dbh, the sql-de-lite db handle and
;;                dbfname, the database filename
;;


          ; totalmem usedmem sharedmem buffers cached adjbuffers adjcache totalswap usedswap freeswap


(ulex:register-batch
 *area*
 'dbwrite
 `((dbinitsql . ("CREATE TABLE IF NOT EXISTS cpuload (id INTEGER PRIMARY KEY, timestamp INTEGER, hostname TEXT, proc INTEGER, core INTEGER, oneminload NUMERIC);" 
       " CREATE TABLE IF NOT EXISTS mem (id INTEGER PRIMARY KEY, timestamp INTEGER, hostname TEXT, totalmem INTEGER, usedmem INTEGER, sharedmem INTEGER, buffers INTEGER, cached INTEGER, adjbuffers INTEGER, adjcache INTEGER, totalswap INTEGER, usedswap INTEGER, freeswap INTEGER);"))
   (savecpuload . "INSERT INTO cpuload (timestamp,hostname,proc,core,oneminload) VALUES (?,?,?,?,?)")
   (savemem . "INSERT INTO mem (timestamp,hostname,totalmem,usedmem,sharedmem,buffers,cached,adjbuffers,adjcache,totalswap,usedswap,freeswap) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)")
   ))
		 
(ulex:register-batch
 *area*
 'dbread
 `((dbinitsql . ("CREATE TABLE IF NOT EXISTS cpuload (id INTEGER PRIMARY KEY, timestamp INTEGER, hostname TEXT, proc INTEGER, core INTEGER, oneminload NUMERIC);" 
       " CREATE TABLE IF NOT EXISTS mem (id INTEGER PRIMARY KEY, timestamp INTEGER, hostname TEXT, totalmem INTEGER, usedmem INTEGER, sharedmem INTEGER, buffers INTEGER, cached INTEGER, adjbuffers INTEGER, adjcache INTEGER, totalswap INTEGER, usedswap INTEGER, freeswap INTEGER);"))
   (getnumcpuload    . "SELECT COUNT(*) FROM cpuload")
   (getsomecpuload   . "SELECT * FROM cpuload LIMIT 10")
   ))
		 
(define (worker mode-in)
 (let* ((start (current-milliseconds))
	 (iters-per-sample 10)
	 (mode (string->symbol mode-in))
	 (max-count (case mode
		      ((all) 60)
		     (else  1000)))
	(num-calls 0)
	(report (lambda ()		  
		  (let ((delta (- (current-milliseconds) start)))
		    (print "Completed " num-calls " in " delta
			   " for " (/ num-calls (/ delta 1000)) " calls per second")))))
    (if (eq? mode 'repl)
	(begin
	  (import extras) ;; might not be needed
	  ;; (import csi)
	  (import readline)
	  (import apropos)
	  (import (prefix ulex ulex:))
	  (install-history-file (get-environment-variable "HOME") ".example_history") ;;  [homedir] [filename] [nlines])
	  (current-input-port (make-readline-port "example> "))
	  (repl))
	(let loop ((count 0))
	     (case mode
	       ((all)
		     (let* ((start-time (current-milliseconds))
          (cpu-load-list (ulex:get-normalized-cpu-load-raw))
          (num-proc (cdr(assoc 'proc cpu-load-list)))
          (num-core (cdr(assoc 'core cpu-load-list)))
          (one-min-load (cdr(assoc '1m-load cpu-load-list)))
          (hostname (current-hostname))
          (free-list (string-split (capture free)))
          (totalmem (list-ref free-list 7))
          (usedmem (list-ref free-list 8))
          (sharedmem (list-ref free-list 9))
          (buffers (list-ref free-list 10))
          (cached (list-ref free-list 11))
          (adjbuffers (list-ref free-list 15))
          (adjcache (list-ref free-list 16))
          (totalswap (list-ref free-list 18))
          (usedswap (list-ref free-list 19))
          (freeswap (list-ref free-list 20))
         )
		      (ulex:call *area* "cpu_load.db" 'savecpuload (list start-time hostname num-proc num-core one-min-load))
		      (ulex:call *area* "mem.db" 'savemem (list start-time hostname totalmem usedmem sharedmem buffers cached adjbuffers adjcache totalswap usedswap freeswap))
		      (set! num-calls (+ num-calls 1))
          (thread-sleep! 5)
		      )
         )
     )
	  (if (< count max-count)
	      (loop (+ count 1)))))
    (report)
    (ulex:clear-server-pkt *area*)
    (thread-sleep! 5) ;; let others keep using this server (needs to be built in to ulex)
    (print "Done doing stuff")))

(define (run-worker)
  (thread-start!
   (make-thread (lambda ()
		  (thread-sleep! 5)
		  (worker "all"))
		"worker")))

(define (main . args)
    (if (member (car args) '("repl"))
	(print "NOTE: No exit timer started.")
	(thread-start! (make-thread (lambda ()
				      (thread-sleep! (* 60 5))
				      (ulex:clear-server-pkt *area*)
				      (thread-sleep! 5)
				      (exit 0)))))
    (print "Launching server")
    (ulex:launch *area*)
    (print "LAUNCHED.")
    (thread-sleep! 0.1) ;; chicken threads bit quirky? need little time for launch thread to get traction?
    (apply worker args)
    )

;;======================================================================
;; Strive for clean exit handling
;;======================================================================

;; Ulex shutdown is handled within Ulex itself.

#;(define (server-exit-procedure)
  (on-exit (lambda ()
	     ;; close the databases, ensure the pkt is removed!
	     ;; (thread-sleep! 2)
	     (ulex:shutdown *area*)
	     0)))

;; Copied from the SDL2 examples.
;;
;; Schedule quit! to be automatically called when your program exits normally.
#;(on-exit server-exit-procedure)

;; Install a custom exception handler that will call quit! and then
;; call the original exception handler. This ensures that quit! will
;; be called even if an unhandled exception reaches the top level.
#;(current-exception-handler
 (let ((original-handler (current-exception-handler)))
   (lambda (exception)
     (server-exit-procedure)
     (original-handler exception))))

(if (file-exists? ".examplerc")
    (load ".examplerc"))

(let ((args-in (argv))) ;; command-line-arguments)))
  (let ((args (match
	       args-in
	       (("csi" "--" args ...) args)
	       ((_ args ...) args)
	       (else args-in))))
    (if (null? args)
	(begin
	  (print "Usage: example [mode]")
	  (print "  where mode is one of:")
	  (print "   all      : do cpu and mem stat writes")
	  (exit))
	(apply main args))))