import requests
 from cloudify import ctx
+from cloudify.exceptions import NonRecoverableError
 
-# it is safe to assume that consul agent is at localhost:8500 along with cloudify manager
-CONSUL_SERVICE_URL = "http://localhost:8500/v1/catalog/service/{0}"
-CONSUL_KV_MASK = "http://localhost:8500/v1/kv/{0}"
+# it is safe to assume that consul agent is at consul:8500
+# define consul alis in /etc/hosts on cloudify manager vm
+# $ cat /etc/hosts
+# 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 consul
+
+CONSUL_SERVICE_URL = "http://consul:8500/v1/catalog/service/{0}"
+CONSUL_KV_MASK = "http://consul:8500/v1/kv/{0}"
 
 
 def discover_service_url(service_name):
     service_url = CONSUL_SERVICE_URL.format(service_name)
     ctx.logger.info("getting service_url at {0}".format(service_url))
 
-    response = requests.get(service_url)
+    try:
+        response = requests.get(service_url)
+    except requests.ConnectionError as ex:
+        raise NonRecoverableError(
+            "ConnectionError - failed to get {0}: {1}".format(service_url, str(ex)))
 
     ctx.logger.info("got {0} for service_url at {1} response: {2}"
                     .format(response.status_code, service_url, response.text))
     kv_url = CONSUL_KV_MASK.format(key)
     ctx.logger.info("getting kv at {0}".format(kv_url))
 
-    response = requests.get(kv_url)
+    try:
+        response = requests.get(kv_url)
+    except requests.ConnectionError as ex:
+        raise NonRecoverableError(
+            "ConnectionError - failed to get {0}: {1}".format(kv_url, str(ex)))
 
     ctx.logger.info("got {0} for kv at {1} response: {2}"
                     .format(response.status_code, kv_url, response.text))
 
 import json
 
 import pytest
+import requests
+from cloudify.exceptions import NonRecoverableError
 from cloudify.state import current_ctx
 
 from dcaepolicyplugin import discovery, tasks
 from tests.mock_setup import (MONKEYED_POLICY_ID, POLICY_ID, MonkeyedNode,
                               MonkeyedResponse)
 
-POLICY_HANDLER_FROM_KV = "http:policy_handler_from_kv:25577"
+POLICY_HANDLER_FROM_KV = "http://policy_handler_from_kv:25577"
 
 
 def monkeyed_discovery_get_failure(full_path):
     """monkeypatch for the GET to consul"""
-    return MonkeyedResponse(full_path)
+    raise requests.ConnectionError("monkey-boom")
 
 
 def test_discovery_failure(monkeypatch):
     )
     try:
         current_ctx.set(node_policy.ctx)
-        tasks.PolicyHandler._lazy_init()
-        assert tasks.PolicyHandler.DEFAULT_URL == tasks.PolicyHandler._url
+        with pytest.raises(NonRecoverableError) as excinfo:
+            tasks.PolicyHandler._lazy_init()
+
+        CtxLogger.log_ctx_info("test_discovery_failure: {0}".format(str(excinfo.value)))
+        assert str(excinfo.value).startswith("ConnectionError")
+
 
     finally:
         tasks.PolicyHandler._url = None
 
         assert MonkeyedPolicyBody.is_the_same_dict(result, expected)
         assert MonkeyedPolicyBody.is_the_same_dict(expected, result)
 
-        node_ms = MonkeyedNode('test_ms_id', 'test_ms_name', "ms.nodes.type", None,
-            [{TARGET_NODE_ID: node_policy.node_id,
-              TARGET_NODE_NAME: node_policy.node_name}])
+    finally:
+        MockCloudifyContextFull.clear()
+        current_ctx.clear()
+
+
+def test_policy_get_fail(monkeypatch):
+    """test policy_get operation on non dcae.nodes.policy node"""
+    tasks.PolicyHandler._url = tasks.PolicyHandler.DEFAULT_URL
+    monkeypatch.setattr('requests.get', monkeyed_policy_handler_get)
+
+    node_policy = MonkeyedNode(
+        'test_dcae_policy_node_id',
+        'test_dcae_policy_node_name',
+        tasks.DCAE_POLICY_TYPE,
+        {POLICY_ID: MONKEYED_POLICY_ID}
+    )
+
+    node_ms = MonkeyedNode(
+        'test_ms_id', 'test_ms_name', "ms.nodes.type", None,
+        [{TARGET_NODE_ID: node_policy.node_id, TARGET_NODE_NAME: node_policy.node_name}]
+    )
+
+    try:
         current_ctx.set(node_ms.ctx)
         CtxLogger.log_ctx_info("ctx of node_ms not policy type")
         with pytest.raises(NonRecoverableError) as excinfo:
 
 def monkeyed_policy_handler_find(full_path, json, headers):
     """monkeypatch for the GET to policy-engine"""
-    return MonkeyedResponse(full_path, headers,
+    return MonkeyedResponse(
+        full_path, headers,
         {LATEST_POLICIES: {
-            MONKEYED_POLICY_ID: MonkeyedPolicyBody.create_policy(MONKEYED_POLICY_ID)}})
+            MONKEYED_POLICY_ID: MonkeyedPolicyBody.create_policy(MONKEYED_POLICY_ID)}}
+    )
 
 
 def test_policies_find(monkeypatch):
         assert MonkeyedPolicyBody.is_the_same_dict(result, expected)
         assert MonkeyedPolicyBody.is_the_same_dict(expected, result)
 
-        node_ms_multi = MonkeyedNode('test_ms_multi_id', 'test_ms_multi_name', "ms.nodes.type",
-                                     None,
-                                     [{TARGET_NODE_ID: node_policies.node_id,
-                                       TARGET_NODE_NAME: node_policies.node_name}])
+    finally:
+        MockCloudifyContextFull.clear()
+        current_ctx.clear()
+
+
+def test_policies_find_fail(monkeypatch):
+    """test policy_get operation on non dcae.nodes.policies node"""
+    tasks.PolicyHandler._url = tasks.PolicyHandler.DEFAULT_URL
+    monkeypatch.setattr('requests.post', monkeyed_policy_handler_find)
+
+    node_policies = MonkeyedNode(
+        'test_dcae_policies_node_id',
+        'test_dcae_policies_node_name',
+        tasks.DCAE_POLICIES_TYPE,
+        {
+            tasks.POLICY_FILTER: {
+                POLICY_NAME: MONKEYED_POLICY_ID,
+                tasks.CONFIG_ATTRIBUTES: json.dumps({
+                    CONFIG_NAME: "alex_config_name"
+                })
+            }
+        }
+    )
+    node_ms_multi = MonkeyedNode(
+        'test_ms_multi_id', 'test_ms_multi_name', "ms.nodes.type",
+        None,
+        [{TARGET_NODE_ID: node_policies.node_id, TARGET_NODE_NAME: node_policies.node_name}]
+    )
+
+    try:
         current_ctx.set(node_ms_multi.ctx)
         CtxLogger.log_ctx_info("ctx of node_ms_multi not policy type")
         with pytest.raises(NonRecoverableError) as excinfo: