Index: api.scm ================================================================== --- api.scm +++ api.scm @@ -15,11 +15,10 @@ ;; These are called by the server on recipt of /api calls (define (api:execute-requests db cmd params) (debug:print-info 1 "api:execute-requests cmd=" cmd " params=" params) - (db:process-cached-writes db) (case (string->symbol cmd) ;; KEYS ((get-key-val-pairs) (apply db:get-key-val-pairs db params)) ;; TESTS ;; json doesn't do vectors, convert to list @@ -29,10 +28,13 @@ ((test-set-state-status-by-id) (apply db:test-set-state-status-by-id db params)) ;; RUNS ((get-run-info) (let ((res (apply db:get-run-info db params))) (list (vector-ref res 0) (vector->list (vector-ref res 1))))) + ((register-run) (apply db:register-run db params)) + ((login) ;(apply db:login db params) + (debug:print 0 "WOOHOO: Got login") #t) (else (list "ERROR" 0)))) ;; http-server send-response ;; api:process-request Index: db.scm ================================================================== --- db.scm +++ db.scm @@ -131,11 +131,11 @@ (sqlite3:finalize! tgetstmt) (sqlite3:finalize! tputstmt) (if (> trecchgd 0)(debug:print 0 "sync'd " trecchgd " changed records in tests table")) ;; Next sync runs table (let* ((rrecchgd 0) - (rdats #f) + (rdats '()) (keys (db:get-keys fromdb)) (rstdfields (conc "id," (string-intersperse keys ",") ",runname,state,status,owner,event_time,comment,fail_count,pass_count")) (rnumfields (length (string-split rstdfields ","))) (runslots (string-intersperse (make-list rnumfields "?") ",")) (rgetstmt (sqlite3:prepare todb (conc "SELECT " rstdfields " FROM runs WHERE id=?;"))) @@ -1803,18 +1803,18 @@ (define (cdb:get-test-info-by-id serverdat test-id) (let ((test-dat (cdb:client-call serverdat 'immediate #f *default-numtries* open-run-close db:get-test-info-by-id #f test-id))) (hash-table-set! *test-info* test-id (vector (current-seconds) test-dat)) ;; cached for use where up-to-date info is not needed test-dat)) -;; db should be db open proc or #f -(define (cdb:remote-run proc db . params) - (if (or *db-write-access* - (not (member proc *db:all-write-procs*))) - (apply cdb:client-call *runremote* 'immediate #f *default-numtries* open-run-close proc #f params) - (begin - (debug:print 0 "ERROR: Attempt to access read-only database") - #f))) +;; ;; db should be db open proc or #f +;; (define (cdb:remote-run proc db . params) +;; (if (or *db-write-access* +;; (not (member proc *db:all-write-procs*))) +;; (apply cdb:client-call *runremote* 'immediate #f *default-numtries* open-run-close proc #f params) +;; (begin +;; (debug:print 0 "ERROR: Attempt to access read-only database") +;; #f))) (define (db:test-get-logfile-info db run-id test-name) (let ((res #f)) (sqlite3:for-each-row (lambda (path final_logf) @@ -1957,10 +1957,18 @@ ;; (if (> cache-size *max-cache-size*) ;; (set! *max-cache-size* cache-size))) ;; #t) ;; #f))) +(define (db:login db keyval calling-path calling-version client-signature) + (if (and (equal? calling-path *toppath*) + (equal? megatest-version calling-version)) + (begin + (hash-table-set! *logged-in-clients* client-key (current-seconds)) + '(#t "successful login")) ;; path matches - pass! Should vet the caller at this time ... + (list #f (conc "Login failed due to mismatch paths: " calling-path ", " *toppath*)))) + (define (db:process-write db request-item) (let ((stmt-key (vector-ref request-item 0)) (query (vector-ref request-item 1)) (params (vector-ref request-item 2)) (queryh (sqlite3:prepare db query))) @@ -1971,10 +1979,11 @@ (define *number-of-writes* 0) (define *writes-total-delay* 0) (define *total-non-write-delay* 0) (define *number-non-write-queries* 0) + ;; The queue is a list of vectors where the zeroth slot indicates the type of query to ;; apply and the second slot is the time of the query and the third entry is a list of ;; values to be applied ;; @@ -2068,19 +2077,22 @@ (set! *verbosity* (car params)) (server:reply return-address qry-sig #t (list #t *verbosity*))) ((killserver) (let ((hostname (car *runremote*)) (port (cadr *runremote*)) - (pid (car params))) + (pid (car params)) + (th1 (make-thread (lambda ()(thread-sleep! 3)(debug:print 0 "Server exiting!")(exit 0)) "Server exit thread"))) (debug:print 0 "WARNING: Server on " hostname ":" port " going down by user request!") (debug:print-info 1 "current pid=" (current-process-id)) (open-run-close tasks:server-deregister tasks:open-db hostname port: port) (set! *server-run* #f) (thread-sleep! 3) - (process-signal pid signal/kill) + (if pid + (process-signal pid signal/kill) + (thread-start! th1)) (server:reply return-address qry-sig #t '(#t "exit process started")))) (else ;; not a command, i.e. is a query (debug:print 0 "ERROR: Unrecognised query/command " stmt-key) (server:reply return-address qry-sig #f 'failed))))) (else Index: http-transport.scm ================================================================== --- http-transport.scm +++ http-transport.scm @@ -380,11 +380,12 @@ res))))) (define (http-transport:client-connect iface port) (let* ((login-res #f) (uri-dat (make-request method: 'POST uri: (uri-reference (conc "http://" iface ":" port "/ctrl")))) - (serverdat (list iface port uri-dat))) + (uri-api-dat (make-request method: 'POST uri: (uri-reference (conc "http://" iface ":" port "/api")))) + (serverdat (list iface port uri-dat uri-api-dat))) (set! login-res (client:login serverdat)) (if (and (not (null? login-res)) (car login-res)) (begin (debug:print-info 2 "Logged in and connected to " iface ":" port) Index: rmt.scm ================================================================== --- rmt.scm +++ rmt.scm @@ -60,10 +60,17 @@ ;; ;; A C T U A L A P I C A L L S ;; ;;====================================================================== +;;====================================================================== +;; A D M I N +;;====================================================================== + +(define (rmt:login) + (rmt:send-receive 'login (list *toppath* megatest-version *my-client-signature*))) + ;;====================================================================== ;; K E Y S ;;====================================================================== (define (rmt:get-key-val-pairs run-id) @@ -101,10 +108,14 @@ (define (rmt:get-run-info run-id) (let ((res (rmt:send-receive 'get-run-info (list run-id)))) (vector (car res) (list->vector (cadr res))))) + +(define (rmt:register-run keyvals runname state status user) + (rmt:send-receive 'register-run (list keyvals runname state status user))) + ;;====================================================================== ;; S T E P S ;;====================================================================== Index: tests/unittests/server.scm ================================================================== --- tests/unittests/server.scm +++ tests/unittests/server.scm @@ -1,70 +1,77 @@ ;;====================================================================== ;; S E R V E R ;;====================================================================== + +(set! *transport-type* 'http) (test "setup for run" #t (begin (setup-for-run) (string? (getenv "MT_RUN_AREA_HOME")))) (test "server-register, get-best-server" #t (let ((res #f)) (open-run-close tasks:server-register tasks:open-db 1 "bob" 1234 100 'live 'http) (set! res (open-run-close tasks:get-best-server tasks:open-db)) (number? (vector-ref res 3)))) -(test "de-register server" #t (let ((res #f)) +(test "de-register server" #f (let ((res #f)) (open-run-close tasks:server-deregister tasks:open-db "bob" port: 1234) (vector? (open-run-close tasks:get-best-server tasks:open-db)))) (define server-pid #f) -(test "launch server" #t (let ((pid (process-fork (lambda () - ;; (daemon:ize) - (server:launch 'http))))) - (set! server-pid pid) - (number? pid))) + +;; Not sure how the following should work, replacing it with system of megatest -server +;; (test "launch server" #t (let ((pid (process-fork (lambda () +;; ;; (daemon:ize) +;; (server:launch 'http))))) +;; (set! server-pid pid) +;; (number? pid))) +(system "megatest -server - -debug 2 &") (thread-sleep! 3) ;; need to wait for server to start. Yes, a better way is needed. -(test "get-best-server" #t (let ((dat (open-run-close tasks:get-best-server tasks:open-db))) - (set! *runremote* (list (vector-ref dat 1)(vector-ref dat 2))) ;; host ip pullport pubport - (and (string? (car *runremote*)) - (number? (cadr *runremote*))))) - -(test #f #t (car (cdb:login *runremote* *toppath* *my-client-signature*))) -(test #f #t (let ((res (client:login *runremote*))) - (car res))) - - -(test #f #t (cdb:client-call *runremote* 'immediate #t 1 (lambda ()(display "Got here eh!?") #t))) - -;; (set! *verbosity* 20) -(test #f *verbosity* (cadr (cdb:set-verbosity *runremote* *verbosity*))) -(test #f #f (cdb:roll-up-pass-fail-counts *runremote* 1 "test1" "" "PASS")) -;; (set! *verbosity* 1) -;; (cdb:set-verbosity *runremote* *verbosity*) - - - -(test "get-keys" "SYSTEM" (car (db:get-keys *db*))) - -(define remargs (args:get-args - '("bar" "foo" ":runname" "bob" ":SYSTEM" "ubuntu" ":RELEASE" "v1.2" ":datapath" "blah/foo" "nada") - (list ":runname" ":state" ":status") - (list "-h") - args:arg-hash - 0)) - -(test "register-run" #t (number? - (db:register-run *db* - '(("SYSTEM" "key1")("RELEASE" "key2")) - "myrun" - "new" - "n/a" - "bob"))) - -(test #f #t (cdb:tests-register-test *runremote* 1 "nada" "")) -(test #f 1 (cdb:remote-run db:get-test-id #f 1 "nada" "")) -(test #f "NOT_STARTED" (vector-ref (open-run-close db:get-test-info #f 1 "nada" "") 3)) -(test #f "NOT_STARTED" (vector-ref (cdb:get-test-info *runremote* 1 "nada" "") 3)) +(test "get-best-server" #t (begin + (client:launch) + (let ((dat (open-run-close tasks:get-best-server tasks:open-db))) + (vector? dat)))) +;; (print "dat: " dat) +;; (set! *runremote* (list (vector-ref dat 1)(vector-ref dat 2) #f)) ;; host ip pullport pubport +;; (and (string? (car *runremote*)) +;; (number? (cadr *runremote*))))) + +(test #f #t (string? (car *runremote*))) +;; (test #f #f (rmt:get-test-info-by-id 99)) +(test #f #t (rmt:login)) ;; *runremote* *toppath* *my-client-signature*))) + +;; ;; (set! *verbosity* 20) +;; (test #f *verbosity* (cadr (cdb:set-verbosity *runremote* *verbosity*))) +;; (test #f #f (cdb:roll-up-pass-fail-counts *runremote* 1 "test1" "" "PASS")) +;; ;; (set! *verbosity* 1) +;; ;; (cdb:set-verbosity *runremote* *verbosity*) +;; +;; +;; +;; (test "get-keys" "SYSTEM" (car (db:get-keys *db*))) +;; +;; (define remargs (args:get-args +;; '("bar" "foo" ":runname" "bob" ":SYSTEM" "ubuntu" ":RELEASE" "v1.2" ":datapath" "blah/foo" "nada") +;; (list ":runname" ":state" ":status") +;; (list "-h") +;; args:arg-hash +;; 0)) +;; +;; (test "register-run" #t (number? +;; (rmt:register-run '(("SYSTEM" "key1")("RELEASE" "key2")) +;; "myrun" +;; "new" +;; "n/a" +;; "bob"))) +;; +;; (test #f #t (cdb:tests-register-test *runremote* 1 "nada" "")) +;; (test #f 1 (cdb:remote-run db:get-test-id #f 1 "nada" "")) +;; (test #f "NOT_STARTED" (vector-ref (open-run-close db:get-test-info #f 1 "nada" "") 3)) +;; (test #f "NOT_STARTED" (vector-ref (cdb:get-test-info *runremote* 1 "nada" "") 3)) ;;====================================================================== ;; D B ;;====================================================================== + +(test #f #f (cdb:kill-server *runremote* #f)) ;; *toppath* *my-client-signature* #f)))