def _write_metadata_to_consul(self, configurations): """ Reflect passed configurations to Consul. Values on consul will be updated only if they changed in this version of the model using agent's `cas` parameter (Check-And-Set). If we successfully updated at least one field in Consul then the configurations' version number is gonna be incremented. :note: This still doesn't apply removed-configurations case. :param configurations: A dict object contains the configurations to be written on Consul. :return: A pair (version, changed) with the current version number and a bool to indicate whether the information was updated. """ agent = ConsulAgent(prefix=self.consul_prefix) version_updated = False version_number = agent.get('version') or 0 for key, value in configurations.items(): index, stored_value = agent.get(key, index=True) cas = index if stored_value is not None else 0 agent.put(key, value, cas=cas) if not version_updated and value != stored_value: version_updated = True version_number += 1 agent.put('version', version_number) return version_number, version_updated
def test_put_with_prefix(self): """ Will test the put functionality on Consul with different data types after prefixing the keys. """ prefix = 'some/testing-prefix' agent = ConsulAgent(prefix=prefix) # Put string values key = 'key' value = 'value' agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, value) # Put int values key = 'key' value = 1 # pylint: disable=redefined-variable-type agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, str(value)) # Put float values key = 'key' value = 1.1 agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, str(value)) # Put list values key = 'key' value = [1, 2, 3, 5] agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value)) # Put dict values key = 'key' value = {'key': 'value', 'another_key': 12} agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value)) # Put other values key = 'key' value = False agent.put(key, value) _, data = self.client.kv.get(prefix + key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value))
def test_put_no_prefix(self): """ Will test the put functionality on Consul with different data types with no prefix on keys. """ agent = ConsulAgent() # Put string values key = 'key' value = 'value' agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, value) # Put int values key = 'key' value = 1 agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, str(value)) # Put float values key = 'key' value = 1.1 agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, str(value)) # Put list values key = 'key' value = [1, 2, 3, 5] agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value)) # Put dict values key = 'key' value = {'key': 'value', 'another_key': 12} agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value)) # Put other values key = 'key' value = False agent.put(key, value) _, data = self.client.kv.get(key) fetched_value = data['Value'].decode() self.assertEqual(fetched_value, json.dumps(value))