class HazelcastCloudProviderTest(TestCase):
    expected_addresses = dict()
    cloud_discovery = None
    provider = None

    def setUp(self):
        self.expected_addresses[Address("10.0.0.1",
                                        5701)] = Address("198.51.100.1", 5701)
        self.expected_addresses[Address("10.0.0.1",
                                        5702)] = Address("198.51.100.1", 5702)
        self.expected_addresses[Address("10.0.0.2",
                                        5701)] = Address("198.51.100.2", 5701)
        self.cloud_discovery = HazelcastCloudDiscovery("", "", 0)
        self.cloud_discovery.discover_nodes = lambda: self.expected_addresses
        self.provider = HazelcastCloudAddressProvider("", "", 0)
        self.provider.cloud_discovery = self.cloud_discovery

    def test_load_addresses(self):
        addresses = self.provider.load_addresses()

        self.assertEqual(3, len(addresses))
        for address in self.expected_addresses.keys():
            addresses.remove(address)
        self.assertEqual(0, len(addresses))

    def test_load_addresses_with_exception(self):
        self.provider.cloud_discovery.discover_nodes = self.mock_discover_nodes_with_exception
        addresses = self.provider.load_addresses()
        self.assertEqual(0, len(addresses))

    def mock_discover_nodes_with_exception(self):
        raise Exception("Expected exception")
 def setUp(self):
     self.expected_addresses[Address("10.0.0.1", 5701)] = Address("198.51.100.1", 5701)
     self.expected_addresses[Address("10.0.0.1", 5702)] = Address("198.51.100.1", 5702)
     self.expected_addresses[Address("10.0.0.2", 5701)] = Address("198.51.100.2", 5701)
     self.expected_addresses[self.private_address] = self.public_address
     self.cloud_discovery = HazelcastCloudDiscovery("", 0)
     self.cloud_discovery.discover_nodes = lambda: self.expected_addresses
     self.provider = HazelcastCloudAddressProvider("", 0)
     self.provider.cloud_discovery = self.cloud_discovery
    def _init_cloud_address_provider(self, cloud_config):
        if cloud_config.enabled:
            discovery_token = cloud_config.discovery_token
            host, url = HazelcastCloudDiscovery.get_host_and_url(self.config.get_properties(), discovery_token)
            return HazelcastCloudAddressProvider(host, url, self._get_connection_timeout(), self._logger_extras)

        cloud_token = self.properties.get(self.properties.HAZELCAST_CLOUD_DISCOVERY_TOKEN)
        if cloud_token != "":
            host, url = HazelcastCloudDiscovery.get_host_and_url(self.config.get_properties(), cloud_token)
            return HazelcastCloudAddressProvider(host, url, self._get_connection_timeout(), self._logger_extras)

        return None
    def _create_address_provider(self):
        config = self._config
        cluster_members = config.cluster_members
        address_list_provided = len(cluster_members) > 0
        cloud_discovery_token = config.cloud_discovery_token
        cloud_enabled = cloud_discovery_token is not None
        if address_list_provided and cloud_enabled:
            raise IllegalStateError(
                "Only one discovery method can be enabled at a time. "
                "Cluster members given explicitly: %s, Hazelcast Cloud enabled: %s"
                % (address_list_provided, cloud_enabled))

        if cloud_enabled:
            connection_timeout = self._get_connection_timeout(config)
            return HazelcastCloudAddressProvider(cloud_discovery_token,
                                                 connection_timeout)

        return DefaultAddressProvider(cluster_members)
class HazelcastCloudProviderTest(TestCase):
    expected_addresses = dict()
    cloud_discovery = None
    provider = None
    private_address = Address("127.0.0.1", 5701)
    public_address = Address("192.168.0.1", 5701)

    def setUp(self):
        self.expected_addresses[Address("10.0.0.1", 5701)] = Address("198.51.100.1", 5701)
        self.expected_addresses[Address("10.0.0.1", 5702)] = Address("198.51.100.1", 5702)
        self.expected_addresses[Address("10.0.0.2", 5701)] = Address("198.51.100.2", 5701)
        self.expected_addresses[self.private_address] = self.public_address
        self.cloud_discovery = HazelcastCloudDiscovery("", 0)
        self.cloud_discovery.discover_nodes = lambda: self.expected_addresses
        self.provider = HazelcastCloudAddressProvider("", 0)
        self.provider.cloud_discovery = self.cloud_discovery

    def test_load_addresses(self):
        addresses, secondaries = self.provider.load_addresses()

        self.assertEqual(4, len(addresses))
        self.assertEqual(0, len(secondaries))
        six.assertCountEqual(self, list(self.expected_addresses.keys()), addresses)

    def test_load_addresses_with_exception(self):
        self.provider.cloud_discovery.discover_nodes = self.mock_discover_nodes_with_exception
        addresses, secondaries = self.provider.load_addresses()
        self.assertEqual(0, len(addresses))
        self.assertEqual(0, len(secondaries))

    def test_translate_when_address_is_none(self):
        actual = self.provider.translate(None)

        self.assertIsNone(actual)

    def test_translate(self):
        actual = self.provider.translate(self.private_address)

        self.assertEqual(self.public_address, actual)

    def test_refresh_and_translate(self):
        self.provider.refresh()
        actual = self.provider.translate(self.private_address)

        self.assertEqual(self.public_address, actual)

    def test_translate_when_not_found(self):
        not_available_address = Address("127.0.0.3", 5701)
        actual = self.provider.translate(not_available_address)

        self.assertIsNone(actual)

    def test_refresh_with_exception(self):
        cloud_discovery = HazelcastCloudDiscovery("", 0)
        cloud_discovery.discover_nodes = self.mock_discover_nodes_with_exception
        provider = HazelcastCloudAddressProvider("", 0)
        provider.cloud_discovery = cloud_discovery
        provider.refresh()

    def mock_discover_nodes_with_exception(self):
        raise Exception("Expected exception")
 def test_refresh_with_exception(self):
     cloud_discovery = HazelcastCloudDiscovery("", 0)
     cloud_discovery.discover_nodes = self.mock_discover_nodes_with_exception
     provider = HazelcastCloudAddressProvider("", 0)
     provider.cloud_discovery = cloud_discovery
     provider.refresh()
 def setUp(self):
     self.network_config = ClientNetworkConfig()
     self.cloud_address_provider = HazelcastCloudAddressProvider("", "", 0)
     self.cloud_address_provider.load_addresses = lambda: [
         Address("10.0.0.1", 5701)
     ]