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