git.fiddlerwoaroof.com
Browse code

chore: rearrange to exclude things from lispworks, don't crash

extract-stack used to crash on unexpected data from AWS

Ed Langley authored on 08/10/2019 03:05:43
Showing 4 changed files
... ...
@@ -91,6 +91,15 @@
91 91
    (%template-description :initarg :template-description :reader template-description)
92 92
    (%parameters :initarg :parameters :reader parameters :initform (list))))
93 93
 
94
+(defmethod initialize-instance ((instance stack) &rest initargs &key &allow-other-keys)
95
+  (let ((available-initargs (alexandria:mappend 'closer-mop:slot-definition-initargs
96
+                                                (closer-mop:class-slots (find-class 'stack)))))
97
+    (apply #'call-next-method
98
+           instance
99
+           (loop for (key value) on initargs by #'cddr
100
+                 when (member key available-initargs)
101
+                   nconc (list key value)))))
102
+
94 103
 (defclass timeline ()
95 104
   ((%start-date-time :initarg :start-date-time :reader start-date-time)
96 105
    (%end-date-time :initarg :end-date-time :reader end-date-time)
... ...
@@ -113,11 +122,16 @@
113 122
                                       aws-result)
114 123
                               (make-hash-table)))))
115 124
 
116
-(defun extract-list (aws-result)
117
-  (mapcar (destructuring-lambda ((list-item-marker . items))
118
-            (if (string= list-item-marker "member")
119
-                items
120
-                (error 'invalid-result)))
125
+(defun extract-list (aws-result &optional (extractor 'identity))
126
+  (mapcan (alexandria:compose (lambda (v)
127
+                                (loop (restart-case (return (list (funcall extractor v)))
128
+                                        (skip ()
129
+                                          :report "Skip current item"
130
+                                          (return ())))))
131
+                              (destructuring-lambda ((list-item-marker . items))
132
+                                (if (string= list-item-marker "member")
133
+                                    items
134
+                                    (error 'invalid-result))))
121 135
           aws-result))
122 136
 
123 137
 (defun extract-stack (aws-result)
... ...
@@ -1,3 +1,6 @@
1
+(eval-when (:execute :load-toplevel :compile-toplevel)
2
+  (net.didierverna.clon:nickname-package))
3
+
1 4
 (defpackage :daydreamer.cli
2 5
   (:import-from :daydreamer.main :stack-parameters :stack-outputs :stack-for-name :stack-info)
3 6
   (:import-from :daydreamer.aws-result :start-date-time :end-date-time)
... ...
@@ -71,7 +74,7 @@
71 74
   (let* ((context (net.didierverna.clon:make-context :synopsis *daydreamer-synopsis*))
72 75
          (files (clon:remainder :context context))
73 76
          (region (clon:getopt :long-name "aws-region"))
74
-         (aws-sdk/api:*session* (aws-sdk/session:make-session :region region)))
77
+         (aws-sdk:*session* (aws-sdk:make-session :region region)))
75 78
 
76 79
     (format *error-output* "~&IN REGION: ~a~%" region)
77 80
 
... ...
@@ -84,6 +87,6 @@
84 87
           ((clon:getopt :long-name "self-test") (run-tests))
85 88
           ((clon:getopt :long-name "rebuild")
86 89
            (load (compile-file (load-time-value
87
-                                 (asdf:system-relative-pathname :daydreamer "cli.lisp"))))
90
+                                (asdf:system-relative-pathname :daydreamer "cli.lisp"))))
88 91
            (dump)))))
89 92
 
... ...
@@ -5,36 +5,42 @@
5 5
 (sb-posix:setenv "CC" "clang" 1)
6 6
 
7 7
 (defsystem :daydreamer
8
-  :description ""
9
-  :author "Ed L <gh@elangley.org>"
10
-  :license "MIT"
11
-  :defsystem-depends-on (#:cffi-grovel)
12
-  :depends-on (#:alexandria
13
-               #:uiop
14
-               #:serapeum
15
-               #:fwoar-lisputils
16
-               #:net.didierverna.clon
17
-               #:cl-base64
18
-               #:local-time
19
-               #:osicat
20
-               #:local-time-duration
21
-               #:aws-sdk/services/cloudformation
22
-               #:aws-sdk/services/monitoring
23
-               #:aws-sdk/services/elasticmapreduce
24
-               #:should-test
25
-               #:yason
26
-               #:hunchentoot
27
-               #:data-lens
28
-               #:cffi)
29
-  :serial t
30
-  :components ((:file "aws-result")
31
-               (:file "main")
32
-               (:file "cli"))
8
+    :description ""
9
+    :author "Ed L <gh@elangley.org>"
10
+    :license "MIT"
11
+    :defsystem-depends-on (#:cffi-grovel)
12
+    :depends-on (#:alexandria
13
+                 #:uiop
14
+                 #:serapeum
15
+                 #:fwoar-lisputils
16
+                 (:feature (:not :lispworks)
17
+                           #:net.didierverna.clon)
18
+                 #:cl-base64
19
+                 #:local-time
20
+                 #:osicat
21
+                 #:local-time-duration
22
+                 #:closer-mop
23
+                 #:aws-sdk                 
24
+                 #:aws-sdk/services/cloudformation
25
+                 #:aws-sdk/services/monitoring
26
+                 #:aws-sdk/services/elasticmapreduce
27
+                 #:should-test
28
+                 #:yason
29
+                 #:hunchentoot
30
+                 #:data-lens
31
+                 #:cffi)
32
+    :serial t
33
+    :components ((:file "aws-result")
34
+                 (:file "main")
35
+                 (:file "cli" :if-feature (:not :lispworks)))
33 36
 
34
-  :entry-point "daydreamer.cli::main"
35
-  :output-files (cffi-toolchain:static-program-op (o c)
36
-                                                  (format t "~&*dpd* ~s~%%" (merge-pathnames "daydreamer"
37
-                                                                                             *default-pathname-defaults*))
38
-                                                  (list
39
-                                                   (merge-pathnames "daydreamer"
40
-                                                                    *default-pathname-defaults*))))
37
+    :entry-point "daydreamer.cli::main"
38
+    #-lispworks 
39
+    :output-files
40
+    #-lispworks
41
+    (cffi-toolchain:static-program-op (o c)
42
+                                      (format t "~&*dpd* ~s~%%" (merge-pathnames "daydreamer"
43
+                                                                                 *default-pathname-defaults*))
44
+                                      (list
45
+                                       (merge-pathnames "daydreamer"
46
+                                                        *default-pathname-defaults*))))
... ...
@@ -1,8 +1,5 @@
1 1
 ;; MIT license Edward Langley (c) 2018
2 2
 
3
-(eval-when (:execute :load-toplevel :compile-toplevel)
4
-  (net.didierverna.clon:nickname-package))
5
-
6 3
 (defpackage :daydreamer.main
7 4
   (:use :cl :fw.lu :alexandria :st :daydreamer.aws-result)
8 5
   (:export main dump