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_get_with_prefix(self): """ Tests getting a prefixed key of different data types from Consul's KEy-Value store. """ prefix = 'some-dummy/prefix/' agent = ConsulAgent(prefix=prefix) # Test string values key = 'string_key' stored_value = 'String Value' self.client.kv.put(prefix + key, stored_value) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, str) self.assertEqual(fetched_value, stored_value) # Test integer values key = 'int_key' stored_value = 23 # pylint: disable=redefined-variable-type self.client.kv.put(prefix + key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, int) self.assertEqual(fetched_value, stored_value) # Test float values key = 'float_key' stored_value = 23.23 self.client.kv.put(prefix + key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, float) self.assertEqual(fetched_value, stored_value) # Test list values key = 'list_key' stored_value = [{'nice': 'good'}, {'awesome': 'things'}] self.client.kv.put(prefix + key, json.dumps(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, list) self.assertEqual(fetched_value, stored_value) # Test dict values key = 'dict_key' stored_value = {'nice': 'good', 'awesome': 'things'} self.client.kv.put(prefix + key, json.dumps(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, dict) self.assertEqual(fetched_value, stored_value) # Test other (boolean) objects key = 'random_key' stored_value = True self.client.kv.put(prefix + key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, str) self.assertEqual(fetched_value, str(stored_value))
def test_get_no_prefix(self): """ Tests getting bare keys of different data types from Consul's Key-Value store. """ agent = ConsulAgent() # Test string values key = 'string_key' stored_value = 'String Value' self.client.kv.put(key, stored_value) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, str) self.assertEqual(fetched_value, stored_value) # Test integer values key = 'int_key' stored_value = 23 self.client.kv.put(key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, int) self.assertEqual(fetched_value, stored_value) # Test float values key = 'float_key' stored_value = 23.23 self.client.kv.put(key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, float) self.assertEqual(fetched_value, stored_value) # Test list values key = 'list_key' stored_value = [{'nice': 'good'}, {'awesome': 'things'}] self.client.kv.put(key, json.dumps(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, list) self.assertEqual(fetched_value, stored_value) # Test dict values key = 'dict_key' stored_value = {'nice': 'good', 'awesome': 'things'} self.client.kv.put(key, json.dumps(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, dict) self.assertEqual(fetched_value, stored_value) # Test other (boolean) objects key = 'random_key' stored_value = True self.client.kv.put(key, str(stored_value)) fetched_value = agent.get(key) self.assertIsInstance(fetched_value, str) self.assertEqual(fetched_value, str(stored_value))