git.fiddlerwoaroof.com
cli.lisp
bed5aeeb
 (eval-when (:execute :load-toplevel :compile-toplevel)
   (net.didierverna.clon:nickname-package))
 
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")
8b29101b
       (flag :short-name "s" :long-name "stacks" :description "show stack information")
       (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 "r" :long-name "resources" :description "show stack resources")
       (flag :short-name "w" :long-name "watch" :description "watch a cloudformation stack until it's done processing")
       (flag :short-name "i" :long-name "info" :description "get parameters, status and output of a stack")
       #+null
       (flag :short-name "s" :long-name "start")
       (stropt :long-name "aws-region"
               :description "explicitly pick AWS Region"
               :env-var "AWS_DEFAULT_REGION")
       (stropt :long-name "aws-profile"
               :description "aws profile to use for authentication"
               :env-var "AWS_PROFILE")
       (stropt :long-name "aws-access-key-id"
               :description "aws access-key-id to use for authentication"
               :env-var "AWS_ACCESS_KEY_ID")
       (stropt :long-name "aws-secret-access-key"
               :description "aws secret-access-key to use for authentication"
               :env-var "AWS_SECRET_ACCESS_KEY")
       (stropt :long-name "aws-session-token"
               :description "aws session-token to use for authentication"
               :env-var "AWS_SESSION_TOKEN")
       #+null
       (flag :short-name "u" :long-name "update"))
cc02973e
     (group (:header "misc")
8b29101b
       (flag :long-name "rebuild")
       (flag :long-name "self-test")
       (flag :long-name "help"))))
cc02973e
 
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))
8b29101b
             (stack-info s t t t))
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)))
 
8b29101b
 (defun stack-info-main (name status parameters outputs resources)
   (stack-info (stack-for-name name) status parameters outputs resources))
5892c84f
 
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 ()
6ac6b7d7
   (cl+ssl:reload)
e4881c6a
   (let* ((context (net.didierverna.clon:make-context :synopsis *daydreamer-synopsis*))
cc02973e
          (files (clon:remainder :context context))
          (region (clon:getopt :long-name "aws-region"))
8b29101b
          (profile (clon:getopt :long-name "aws-profile"))
          (access-key-id (clon:getopt :long-name "aws-access-key-id"))
          (secret-access-key (clon:getopt :long-name "aws-secret-access-key"))
          (session-token (clon:getopt :long-name "aws-session-token")))
 
     (cond (access-key-id
            (setf aws:*session*
                  (aws:make-session
                   :credentials (if session-token
                                    (aws:make-credentials
                                     :access-key-id access-key-id
                                     :secret-access-key secret-access-key
                                     :session-token session-token
                                     )
                                    (aws:make-credentials
                                     :access-key-id access-key-id
                                     :secret-access-key secret-access-key
                                     :session-token nil
                                     ))
                   :region region)))
           ((and region profile)
            (aws:init-session
             :region region
             :profile profile))
           (region
            (aws:init-session
             :region region))
           (profile
            (aws:init-session
             :profile profile))
           (t
            (aws:init-session)))
cc02973e
 
8b29101b
     (format *error-output* "~&IN REGION: ~a~%WITH PROFILE: ~a~%"
             (aws:session-region aws:*session*)
             profile)
cc02973e
 
     (cond ((clon:getopt :long-name "help") (clon:help))
e4881c6a
           ((clon:getopt :long-name "watch") (daydreamer.main:watch-stack (car files)))
8e5bcff6
           ((clon:getopt :long-name "stacks") (stacks-main))
ea8450da
           ((clon:getopt :long-name "self-test") (run-tests))
e4881c6a
           ((clon:getopt :long-name "rebuild")
            (load (compile-file (load-time-value
bed5aeeb
                                 (asdf:system-relative-pathname :daydreamer "cli.lisp"))))
8b29101b
            (dump))
           (t
            (let ((info (clon:getopt :long-name "info"))
                  (parameters (clon:getopt :long-name "parameters"))
                  (outputs (clon:getopt :long-name "outputs"))
                  (resources (clon:getopt :long-name "resources")))
              (stack-info-main (car files)
                               info
                               (or info parameters)
                               (or info outputs)
                               resources))))))