0

この関数(パレットの一部)に渡すパラメーターを作成する方法を見つけようとしています。

(defn node-spec [& {:keys [image hardware location network qos] :as options}]
  {:pre [(or (nil? image) (map? image))]}
  options)

うまくいくのはこの種の使用法です:

(node-spec :location {:location-id "eu-west-1a"}, :image {:image-id "eu-west-1/ami-937474e7"} :network {})

ただし、これの:locationビットと:imageビットは、プロビジョニングするすべてのマシンに共通ですが、:network{}ビットはノードごとに異なります。だから私は一般的なビットを除外して次のようなことをしたいと思います:

(def my-common-location-and-image {:location {:location-id "eu-west-1a"}, :image {:image-id "eu-west-1/ami-937474e7"}} )
(node-spec (merge {:network {:security-groups [ "group1" ] }} my-common-location-and-image ))
(node-spec (merge {:network {:security-groups [ "group1" ] }} my-common-location-and-image ))

しかし、これは機能しません。マージされたマップは、その値が欠落している単一のキーとして解析されます。だから私は試しました

(node-spec :keys (merge {:network {:security-groups [ "group1" ] }} my-common-location-and-image ))

(node-spec :options (merge {:network {:security-groups [ "group1" ] }} my-common-location-and-image ))

しかし、それも機能しません。node-specパラメーターの破壊を逆転または乗り越えようとしているような気がします。私は何が間違っているのですか?または、キーと値のペアの一部を除外するという私の目標は不可能ですか?

4

1 に答える 1

0

問題は、node-spec関数がマップではなくシーケンスを予期していることです。これは、非構造化されるのは、キーと値のペアにグループ化できる一連のものであるためです。

したがって、これを渡す代わりに:

{:image {:image-id "eu-west-1/ami-937474e7"}, :location {:location-id "eu-west-1a"}, :network {:security-groups ["group1"]}}

これを渡す必要があります:

'(:image {:image-id "eu-west-1/ami-937474e7"} :location {:location-id "eu-west-1a"} :network {:security-groups ["group1"]})

これは、これが機能することを意味します。

(apply node-spec
       (reduce concat
               (merge {:network {:security-groups ["group1"]}}
                      my-common-location-and-image)))
于 2013-02-22T18:14:43.423 に答える