git.fiddlerwoaroof.com
src/aws-dispatcher.lisp
0d44e5e6
 (defpackage :mfa-tool.aws-dispatcher
   (:use :cl)
4450c21d
   (:export #:aws-dispatcher #:update-stacks #:select-stack #:stacks #:stack
81fd0fa2
            #:put-stack
            #:refresh-stack))
0d44e5e6
 (in-package :mfa-tool.aws-dispatcher)
 
 (defclass aws-dispatcher ()
   ((%region :reader region :accessor %region
             :initarg :region)
    (%credentials :reader credentials
                  :initarg :credentials))
   (:default-initargs
4dde8453
    :region :|us-east-1|
0d44e5e6
    :credentials (error "AWS-DISPATCHER requires a :CREDENTIALS initarg")))
 
4450c21d
 (defmacro defprint-slots (class slots)
   `(defmethod print-object ((o ,class) s)
      (with-slots ,slots o
        (print-unreadable-object (o s :type t :identity t)
          (format s "~@{~s~^, ~}"
                  ,@slots)))))
 (defprint-slots daydreamer.aws-result:stack
     (daydreamer.aws-result::%stack-name))
 
81fd0fa2
 (defclass refresh-stack ()
   ((%stack :reader stack :initarg :stack)))
 (defprint-slots refresh-stack (%stack))
 (defun refresh-stack (stack)
   (fw.lu:new 'refresh-stack stack))
 
4450c21d
 (defclass put-stack ()
   ((%stack :reader stack :initarg :stack)))
 (defun put-stack (stack)
   (fw.lu:new 'put-stack stack))
 
0d44e5e6
 (defclass update-stacks ()
   ((%stacks :initarg :stacks :reader stacks)))
 (defun update-stacks (stacks)
   (fw.lu:new 'update-stacks stacks))
 
 (defclass select-stack ()
   ((%stacks :initarg :stack :reader stack)))
4450c21d
 (defprint-slots select-stack (%stacks))
0d44e5e6
 
 (defun select-stack (stack)
   (fw.lu:new 'select-stack stack))
 
 (defclass update-region ()
   ((%new-region :initarg :region :reader region)))
 (defun update-region (region)
   (fw.lu:new 'update-region region))
 
 (defmethod mfa-tool.store:dispatch :around ((store aws-dispatcher) action)
   (let ((aws-sdk:*session* (aws-sdk:make-session :credentials (credentials store)
                                                  :region (region store))))
     (call-next-method)))
 
 (defmethod mfa-tool.store:execute ((store aws-dispatcher) (action update-region))
   (setf (%region store) (region action)))
 
 (defmethod mfa-tool.store:dispatch :after ((store aws-dispatcher) (action update-region))
   (mfa-tool.store:dispatch store :|Get Stacks|))
 
81fd0fa2
 (defmethod mfa-tool.store:dispatch :after ((store aws-dispatcher) (action refresh-stack))
   (let ((new-value (daydreamer.aws-result:extract-stack
                     (car
                      (daydreamer.aws-result:extract-list
                       (cdar
                        (aws/cloudformation:describe-stacks
                         :stack-name (daydreamer.aws-result:stack-name
                                      (stack action)))))))))
     (mfa-tool.store:dispatch store (put-stack new-value))))
 
0d44e5e6
 (defmethod mfa-tool.store:dispatch :after ((store aws-dispatcher) (action (eql :|Get Stacks|)))
   (bt:make-thread
    (lambda ()
      (let ((aws-sdk:*session* (aws-sdk:make-session :credentials (credentials store)
                                                     :region (region store))))
        (mfa-tool.store:dispatch store
                                 (update-stacks (mapcar 'daydreamer.aws-result:extract-stack
                                                        (daydreamer.aws-result:extract-list
                                                         (cdar
                                                          (aws/cloudformation:describe-stacks))))))))
f51198cd
    :name "Stack Fetcher"))