git.fiddlerwoaroof.com
Raw Blame History
(defpackage :mfa-tool.aws-dispatcher
  (:use :cl)
  (:export #:aws-dispatcher #:update-stacks #:select-stack #:stacks #:stack
           #:put-stack
           #:refresh-stack))
(in-package :mfa-tool.aws-dispatcher)

(defclass aws-dispatcher ()
  ((%region :reader region :accessor %region
            :initarg :region)
   (%credentials :reader credentials
                 :initarg :credentials))
  (:default-initargs
   :region :|us-east-1|
   :credentials (error "AWS-DISPATCHER requires a :CREDENTIALS initarg")))

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

(defclass refresh-stack ()
  ((%stack :reader stack :initarg :stack)))
(defprint-slots refresh-stack (%stack))
(defun refresh-stack (stack)
  (fw.lu:new 'refresh-stack stack))

(defclass put-stack ()
  ((%stack :reader stack :initarg :stack)))
(defun put-stack (stack)
  (fw.lu:new 'put-stack stack))

(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)))
(defprint-slots select-stack (%stacks))

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

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

(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))))))))
   :name "Stack Fetcher"))