git.fiddlerwoaroof.com
cli.lisp
e4881c6a
 (defpackage :daydreamer.cli
   (:import-from :daydreamer.main :stack-parameters :stack-outputs :stack-for-name :stack-info)
   (:import-from :daydreamer.aws-result :start-date-time :end-date-time)
cc02973e
   (:import-from :serapeum :op)
   (:import-from :clon :defsynopsis :group :flag :stropt)
ea8450da
   (:use :cl :st)
cc02973e
   (:export options
e4881c6a
            #:*daydreamer-synopsis*
cc02973e
            #:dump))
 
e4881c6a
 (in-package :daydreamer.cli)
cc02973e
 
e4881c6a
 
 (defparameter *daydreamer-synopsis*
cc02973e
   (defsynopsis (:postfix "ARGS...")
     (group (:header "actions")
8e5bcff6
            (flag :short-name "s" :long-name "stacks" :description "show stack information")
cc02973e
            (flag :short-name "p" :long-name "parameters" :description "show stack parameters")
            (flag :short-name "o" :long-name "outputs" :description "show stack outputs")
            (flag :short-name "w" :long-name "watch" :description "watch a cloudformation stack until it's done processing")
5892c84f
            (flag :short-name "i" :long-name "info" :description "get parameters, status and output of a stack")
            #+null
cc02973e
            (flag :short-name "s" :long-name "start")
            (stropt :long-name "aws-region" :default-value "us-west-2")
            (flag :short-name "u" :long-name "update"))
     (group (:header "misc")
ea8450da
            (flag :long-name "rebuild")
            (flag :long-name "self-test")
cc02973e
            (flag :long-name "help"))))
 
8e5bcff6
 (defun stacks-main ()
   (mapcar (lambda (s)
             (format t "~3&STACK ~a ~a~2%"
e4881c6a
                     (daydreamer.aws-result:stack-name s)
                     (daydreamer.aws-result:stack-status s))
8e5bcff6
             (stack-info s))
e4881c6a
           (mapcar 'daydreamer.aws-result:extract-stack
                   (daydreamer.aws-result:extract-list
8e5bcff6
                    (cdar
                     (aws/cloudformation:describe-stacks))))))
 
cc02973e
 (defun stack-parameters-main (name)
   (stack-parameters (stack-for-name name)))
 
 (defun stack-outputs-main (name)
   (stack-outputs (stack-for-name name)))
 
5892c84f
 (defun stack-info-main (name)
   (stack-info (stack-for-name name)))
 
ea8450da
 (defun run-tests ()
e4881c6a
   (st:test :package (find-package :daydreamer.aws-result))
   (st:test :package (find-package :daydreamer.main))
   (st:test :package (find-package :daydreamer.cli)))
ea8450da
 
e4881c6a
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defun dump ()
     "Create an executable with the command-line interface defined above."
     (handler-bind ((sb-ext:name-conflict (lambda (c)
                                            (declare (ignore c))
                                            (invoke-restart-interactively 'sb-ext:resolve-conflict))))
       (let ((sb-ext:*on-package-variance* '(:warn t #+nil(:daydreamer.aws-result
                                                            :daydreamer.main
                                                            :daydreamer.cli)
                                                   #+nil(:error t))))
         (asdf:load-system :daydreamer :force t)))
     (clon:dump "daydreamer" main)))
ea8450da
 
cc02973e
 (defun main ()
e4881c6a
   (let* ((context (net.didierverna.clon:make-context :synopsis *daydreamer-synopsis*))
cc02973e
          (files (clon:remainder :context context))
          (region (clon:getopt :long-name "aws-region"))
          (aws-sdk/api:*session* (aws-sdk/session:make-session :region region)))
 
     (format *error-output* "~&IN REGION: ~a~%" region)
 
     (cond ((clon:getopt :long-name "help") (clon:help))
5892c84f
           ((clon:getopt :long-name "info") (stack-info-main (car files)))
e4881c6a
           ((clon:getopt :long-name "watch") (daydreamer.main:watch-stack (car files)))
8e5bcff6
           ((clon:getopt :long-name "stacks") (stacks-main))
cc02973e
           ((clon:getopt :long-name "outputs") (stack-outputs-main (car files)))
ea8450da
           ((clon:getopt :long-name "parameters") (stack-parameters-main (car files)))
           ((clon:getopt :long-name "self-test") (run-tests))
e4881c6a
           ((clon:getopt :long-name "rebuild")
            (load (compile-file (load-time-value
                                  (asdf:system-relative-pathname :daydreamer "cli.lisp"))))
            (dump)))))