def run(self, args, **kwargs): file_path = os.path.normpath(pjoin(os.getcwd(), args.file)) if not os.path.exists(args.file): raise ValueError('File "%s" doesn\'t exist' % (file_path)) if not os.path.isfile(args.file): raise ValueError('"%s" is not a file' % (file_path)) with open(file_path, 'r') as f: kvps = json.loads(f.read()) instances = [] for item in kvps: name = item['name'] value = item['value'] instance = KeyValuePair() instance.id = name # TODO: refactor and get rid of id instance.name = name instance.value = value self.manager.update(instance, **kwargs) instances.append(instance) return instances
def delete_value(self, name): """ Delete the provided key. :param name: Name of the key to delete. :type name: ``str`` :return: ``True`` on sucess, ``False`` otherwise. :rtype: ``bool`` """ name = self._get_full_key_name(name=name) client = self._get_api_client() instance = KeyValuePair() instance.id = name instance.name = name self._logger.audit('Deleting value from the datastore (name=%s)', name) try: client.keys.delete(instance=instance) except Exception: return False return True
def delete_value(self, name, local=True): """ Delete the provided key. By default, value is deleted from a namespace local to the sensor. If you want to delete a global value, pass local=False to this method. :param name: Name of the key to delete. :type name: ``str`` :param local: Delete a value in a namespace local to the sensor. Defaults to True. :type: local: ``bool`` :return: ``True`` on success, ``False`` otherwise. :rtype: ``bool`` """ if local: name = self._get_key_name_with_sensor_prefix(name=name) client = self._get_api_client() instance = KeyValuePair() instance.id = name instance.name = name self._logger.audit('Deleting value from the datastore (name=%s)', name) try: client.keys.delete(instance=instance) except Exception: return False return True
def test_datastore_operations_get_value(self): mock_api_client = mock.Mock() kvp1 = KeyValuePair() kvp1.name = 'test1' kvp1.value = 'bar' mock_api_client.keys.get_by_id.return_value = kvp1 self._set_mock_api_client(mock_api_client) value = self._sensor_service.get_value(name='test1', local=False) self.assertEqual(value, kvp1.value)
def run(self, key, action, st2host='localhost', value=""): try: client = Client() except Exception as e: return e if action == 'get': kvp = client.keys.get_by_name(key) if not kvp: raise Exception('Key error with %s.' % key) return kvp.value else: instance = client.keys.get_by_name(key) or KeyValuePair() instance.id = key instance.name = key instance.value = value kvp = client.keys.update(instance) if action in [ 'create', 'update' ] else None if action == 'delete': return kvp else: return kvp.serialize()
def set_value(self, name, value, ttl=None): """ Set a value for the provided key. :param name: Key name. :type name: ``str`` :param value: Key value. :type value: ``str`` :param ttl: Optional TTL (in seconds). :type ttl: ``int`` :return: ``True`` on sucess, ``False`` otherwise. :rtype: ``bool`` """ value = str(value) name = self._get_full_key_name(name=name) client = self._get_api_client() self._logger.audit('Setting value in the datastore (name=%s)', name) instance = KeyValuePair() instance.id = name instance.name = name instance.value = value if ttl: instance.ttl = ttl client.keys.update(instance=instance) return True
def set_value(self, name, value, ttl=None, local=True): """ Set a value for the provided key. By default, value is set in a namespace local to the sensor. If you want to set a global value, pass local=False to this method. :param name: Key name. :type name: ``str`` :param value: Key value. :type value: ``str`` :param ttl: Optional TTL (in seconds). :type ttl: ``int`` :param local: Set value in a namespace local to the sensor. Defaults to True. :type: local: ``bool`` :return: ``True`` on success, ``False`` otherwise. :rtype: ``bool`` """ if local: name = self._get_key_name_with_sensor_prefix(name=name) value = str(value) client = self._get_api_client() self._logger.audit('Setting value in the datastore (name=%s)', name) instance = KeyValuePair() instance.id = name instance.name = name instance.value = value if ttl: instance.ttl = ttl client.keys.update(instance=instance) return True
def test_datastore_operations_list_values(self): # Verify prefix filtering mock_api_client = mock.Mock() mock_api_client.keys.get_all.return_value = [] self._set_mock_api_client(mock_api_client) self._sensor_service.list_values(local=True, prefix=None) mock_api_client.keys.get_all.assert_called_with( prefix='core.TestSensor:') self._sensor_service.list_values(local=True, prefix='ponies') mock_api_client.keys.get_all.assert_called_with( prefix='core.TestSensor:ponies') self._sensor_service.list_values(local=False, prefix=None) mock_api_client.keys.get_all.assert_called_with(prefix=None) self._sensor_service.list_values(local=False, prefix='ponies') mock_api_client.keys.get_all.assert_called_with(prefix='ponies') # No values in the datastore mock_api_client = mock.Mock() mock_api_client.keys.get_all.return_value = [] self._set_mock_api_client(mock_api_client) values = self._sensor_service.list_values(local=True) self.assertEqual(values, []) values = self._sensor_service.list_values(local=False) self.assertEqual(values, []) # Values in the datastore kvp1 = KeyValuePair() kvp1.name = 'test1' kvp1.value = 'bar' kvp2 = KeyValuePair() kvp2.name = 'test2' kvp2.value = 'bar' mock_return_value = [kvp1, kvp2] mock_api_client.keys.get_all.return_value = mock_return_value self._set_mock_api_client(mock_api_client) values = self._sensor_service.list_values(local=True) self.assertEqual(len(values), 2) self.assertEqual(values, mock_return_value)
def run(self, key, action, st2host='localhost', value=""): st2_endpoints = { 'action': "http://%s:9101" % st2host, 'reactor': "http://%s:9102" % st2host, 'datastore': "http://%s:9103" % st2host } try: client = Client(st2_endpoints) except Exception as e: return e if action == 'get': kvp = client.keys.get_by_name(key) if not kvp: raise Exception('Key error with %s.' % key) return kvp.value else: instance = KeyValuePair() if action == 'create': instance.id = key else: instance.id = client.keys.get_by_name(key).id instance.name = key instance.value = value try: kvstore = getattr(client.keys, action) kvp = kvstore(instance) except Exception as e: raise if action == 'delete': return kvp else: return kvp.serialize()
def run(self, args, **kwargs): instance = KeyValuePair() instance.id = args.name # TODO: refactor and get rid of id instance.name = args.name instance.value = args.value return self.manager.update(instance, **kwargs)
# since this is not the first event in the ordered list, # we can ignore this event. if not kvp and rule['ordered_events'][0] != event_id: print('Event does not match aggregation criteria.') sys.exit() # Start over if first event in the ordered list. if rule['ordered_events'][0] == event_id: data = {'subject': subject, 'events': [(event_id, str(timestamp))]} if kvp: print('Restarting aggregation state.') kvp.value = json.dumps(data) client.keys.update(kvp) else: print('Starting new aggregation state.') kvp = KeyValuePair(name=key_name, value=json.dumps(data)) kvp = client.keys.create(kvp) sys.exit() # Process event data = json.loads(kvp.value) events = [event[0] for event in data['events']] occurred = zip(events, rule['ordered_events']) num_occurred = len(occurred) # Determine if the next expected event matches. if rule['ordered_events'][num_occurred] == event_id: # Delete data if time window passes. started = datetime.datetime.strptime(data['events'][0][1], '%Y-%m-%d %H:%M:%S.%f') delta = datetime.timedelta(seconds=rule['time_window_in_sec'])