func SetVMMetadata(c config.Cpi, extInput bosh.MethodArguments) error {

	var cid string
	if reflect.TypeOf(extInput[0]) != reflect.TypeOf(cid) {
		return fmt.Errorf("Cannot set VM metadata: received unexpected value for vm cid: %s", cid)
	}
	cid = extInput[0].(string)

	metadata, err := json.Marshal(extInput[1])
	if err != nil {
		return fmt.Errorf("Cannot set VM metadata: metadata is not valid JSON")
	} else {
		for _, v := range extInput[1].(map[string]interface{}) {
			switch v.(type) {
			case string, int:
			default:
				fmt.Println("Cannot set VM metadata: metadata must be a hash with string or integer values")
			}
		}
	}

	node, err := rackhdapi.GetNodeByVMCID(c, cid)
	nodeID := node.ID
	if err != nil {
		return err
	}

	return rackhdapi.SetNodeMetadata(c, nodeID, string(metadata))
}
				ghttp.CombineHandlers(
					ghttp.VerifyRequest("PATCH", fmt.Sprintf("/api/common/nodes/%s", nodes[0].ID)),
					ghttp.VerifyJSON(fmt.Sprintf(`{"status": "%s", "status_reason": "%s"}`, "blocked", "Node has missing disks")),
				),
			)

			rackhdapi.BlockNode(cpiConfig, nodes[0].ID)
			Expect(server.ReceivedRequests()).To(HaveLen(1))
		})
	})

	Describe("Setting node metadata", func() {
		It("Adds metadata to the node", func() {
			nodeID := "node_id"
			metadata := "{}"

			server.AppendHandlers(
				ghttp.CombineHandlers(
					ghttp.VerifyRequest("PATCH", fmt.Sprintf("/api/common/nodes/%s", nodeID)),
					ghttp.VerifyJSON(fmt.Sprintf(`{"metadata": %s}`, metadata)),
				),
			)

			err := rackhdapi.SetNodeMetadata(cpiConfig, nodeID, metadata)
			Expect(err).ToNot(HaveOccurred())

			Expect(server.ReceivedRequests()).To(HaveLen(1))
		})
	})
})