/src/clj/backtype/storm/node.clj

http://github.com/nathanmarz/storm-deploy · Clojure · 178 lines · 152 code · 24 blank · 2 comment · 8 complexity · ba656a020aea8b7b6ba52a2cb6f2075a MD5 · raw file

  1. (ns backtype.storm.node
  2. (:import
  3. [java.util Map List]
  4. [org.jvyaml YAML]
  5. [java.io FileReader File])
  6. (:require
  7. [backtype.storm.crate.storm :as storm]
  8. [backtype.storm.crate.leiningen :as leiningen]
  9. [backtype.storm.crate.zeromq :as zeromq]
  10. [backtype.storm.crate.ganglia :as ganglia]
  11. [pallet.crate.git :as git]
  12. [pallet.crate.maven :as maven]
  13. [pallet.crate.java :as java]
  14. [pallet.crate.automated-admin-user :as automated-admin-user]
  15. [backtype.storm.crate.zookeeper :as zookeeper]
  16. [pallet.crate.ssh-key :as ssh-key]
  17. [pallet.action.service :as action-service]
  18. [pallet.resource.directory :as directory]
  19. [pallet.resource.service :as service]
  20. [pallet.resource.remote-file :as remote-file]
  21. [pallet.resource.exec-script :as exec-script])
  22. (:use
  23. [backtype.storm config]
  24. [backtype.storm.branch :only [branch>]]
  25. [pallet compute core resource phase]
  26. [pallet [utils :only [make-user]]]
  27. [org.jclouds.compute2 :only [nodes-in-group]]
  28. [clojure.walk]))
  29. ;; CONSTANTS
  30. (def clusters-conf
  31. (read-yaml-config "clusters.yaml"))
  32. (def storm-yaml-path
  33. (.getPath (ClassLoader/getSystemResource "storm.yaml"))
  34. )
  35. (def storm-conf (read-storm-config))
  36. (defn nimbus-name [name]
  37. (str "nimbus-" name))
  38. (defn configure-ssh-client [request & {:keys [host-key-checking]}]
  39. (let [yes-or-no #(if % "yes" "no")]
  40. (-> request
  41. (remote-file/remote-file
  42. "/root/.ssh/config"
  43. :content (str "StrictHostKeyChecking=" (yes-or-no host-key-checking))
  44. :mode 600))))
  45. (def *USER* nil)
  46. (defn base-server-spec []
  47. (server-spec
  48. :phases {:bootstrap (fn [req] (automated-admin-user/automated-admin-user
  49. req
  50. (:username *USER*)
  51. (:public-key-path *USER*)))
  52. :configure (phase-fn
  53. (java/java :openjdk))}))
  54. (defn zookeeper-server-spec []
  55. (server-spec
  56. :extends (base-server-spec)
  57. :phases {:configure (phase-fn
  58. (zookeeper/install :version "3.3.6")
  59. (zookeeper/configure
  60. :clientPort (storm-conf "storm.zookeeper.port")
  61. :maxClientCnxns 0)
  62. (zookeeper/init))
  63. }))
  64. (defn storm-base-server-spec [name]
  65. (server-spec
  66. :extends (base-server-spec)
  67. :phases {:post-configure (phase-fn
  68. (storm/write-storm-yaml
  69. name
  70. storm-yaml-path))
  71. :configure (phase-fn
  72. (configure-ssh-client :host-key-checking false))
  73. :exec (phase-fn
  74. (storm/exec-daemon)
  75. (ganglia/ganglia-finish))}))
  76. (defn supervisor-server-spec [name branch commit]
  77. (server-spec
  78. :extends (storm-base-server-spec name)
  79. :phases {:configure (phase-fn
  80. (ganglia/ganglia-node (nimbus-name name))
  81. (storm/install-supervisor
  82. branch commit
  83. "/mnt/storm"))
  84. :post-configure (phase-fn
  85. (ganglia/ganglia-finish)
  86. (storm/write-storm-exec
  87. "supervisor"))}))
  88. (defn maybe-install-drpc [req branch]
  89. (if (or (not branch) (= branch "master") (branch> branch "0.5.3"))
  90. (storm/install-drpc req)
  91. req
  92. ))
  93. (defn maybe-exec-drpc [req branch]
  94. (if (or (not branch) (= branch "master") (branch> branch "0.5.3"))
  95. (storm/exec-drpc req)
  96. req
  97. ))
  98. (defn nimbus-server-spec [name branch commit]
  99. (server-spec
  100. :extends (storm-base-server-spec name)
  101. :phases {:configure (phase-fn
  102. (ganglia/ganglia-master (nimbus-name name))
  103. (storm/install-nimbus
  104. branch commit
  105. "/mnt/storm")
  106. (storm/install-ui)
  107. (maybe-install-drpc branch))
  108. :post-configure (phase-fn
  109. (ganglia/ganglia-finish)
  110. (storm/write-storm-exec
  111. "nimbus")
  112. )
  113. :exec (phase-fn
  114. (storm/exec-ui)
  115. (maybe-exec-drpc branch))}))
  116. (defn node-spec-from-config [group-name inbound-ports]
  117. (letfn [(assoc-with-conf-key [image image-key conf-key & {:keys [f] :or {f identity}}]
  118. (if-let [val (clusters-conf (str group-name "." conf-key))]
  119. (assoc image image-key (f val))
  120. image))]
  121. (node-spec
  122. :image (-> {:inbound-ports (concat inbound-ports [22])
  123. ;; :security-groups ["backend"]
  124. }
  125. (assoc-with-conf-key :image-id "image")
  126. (assoc-with-conf-key :hardware-id "hardware")
  127. (assoc-with-conf-key :spot-price "spot.price" :f float)
  128. ))))
  129. (defn zookeeper
  130. ([name server-spec]
  131. (group-spec
  132. (str "zookeeper-" name)
  133. :node-spec (node-spec-from-config "zookeeper"
  134. [(storm-conf "storm.zookeeper.port")])
  135. :extends server-spec))
  136. ([name]
  137. (zookeeper name (zookeeper-server-spec))
  138. ))
  139. (defn nimbus* [name server-spec]
  140. (group-spec
  141. (nimbus-name name)
  142. :node-spec (node-spec-from-config "nimbus"
  143. [(storm-conf "nimbus.thrift.port")])
  144. :extends server-spec))
  145. (defn nimbus [name branch commit]
  146. (nimbus* name (nimbus-server-spec name branch commit)))
  147. (defn supervisor* [name server-spec]
  148. (group-spec
  149. (str "supervisor-" name)
  150. :node-spec (node-spec-from-config "supervisor"
  151. (storm-conf "supervisor.slots.ports"))
  152. :extends server-spec))
  153. (defn supervisor [name branch commit]
  154. (supervisor* name (supervisor-server-spec name branch commit)))