git.fiddlerwoaroof.com
Raw Blame History
(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)
  (:import-from :serapeum :op)
  (:import-from :clon :defsynopsis :group :flag :stropt)
  (:use :cl :st)
  (:export options
           #:*daydreamer-synopsis*
           #:dump))

(in-package :daydreamer.cli)


(defparameter *daydreamer-synopsis*
  (defsynopsis (:postfix "ARGS...")
    (group (:header "actions")
           (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 "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" :default-value "us-west-2")
           (flag :short-name "u" :long-name "update"))
    (group (:header "misc")
           (flag :long-name "rebuild")
           (flag :long-name "self-test")
           (flag :long-name "help"))))

(defun stacks-main ()
  (mapcar (lambda (s)
            (format t "~3&STACK ~a ~a~2%"
                    (daydreamer.aws-result:stack-name s)
                    (daydreamer.aws-result:stack-status s))
            (stack-info s))
          (mapcar 'daydreamer.aws-result:extract-stack
                  (daydreamer.aws-result:extract-list
                   (cdar
                    (aws/cloudformation:describe-stacks))))))

(defun stack-parameters-main (name)
  (stack-parameters (stack-for-name name)))

(defun stack-outputs-main (name)
  (stack-outputs (stack-for-name name)))

(defun stack-info-main (name)
  (stack-info (stack-for-name name)))

(defun run-tests ()
  (st:test :package (find-package :daydreamer.aws-result))
  (st:test :package (find-package :daydreamer.main))
  (st:test :package (find-package :daydreamer.cli)))

(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)))

(defun main ()
  (let* ((context (net.didierverna.clon:make-context :synopsis *daydreamer-synopsis*))
         (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))
          ((clon:getopt :long-name "info") (stack-info-main (car files)))
          ((clon:getopt :long-name "watch") (daydreamer.main:watch-stack (car files)))
          ((clon:getopt :long-name "stacks") (stacks-main))
          ((clon:getopt :long-name "outputs") (stack-outputs-main (car files)))
          ((clon:getopt :long-name "parameters") (stack-parameters-main (car files)))
          ((clon:getopt :long-name "self-test") (run-tests))
          ((clon:getopt :long-name "rebuild")
           (load (compile-file (load-time-value
                                 (asdf:system-relative-pathname :daydreamer "cli.lisp"))))
           (dump)))))