perfkitbenchmarker/resources/pinecone/pinecone.py (56 lines of code) (raw):
"""Define pinecone resources."""
from absl import flags
from perfkitbenchmarker import linux_virtual_machine
from perfkitbenchmarker import resource
from perfkitbenchmarker import vm_util
from perfkitbenchmarker.resources.pinecone import flags as pinecone_flags
FLAGS = flags.FLAGS
class PineconeServer(resource.BaseResource):
"""Object representing a Snowflake Data Warehouse Instance."""
CLOUD: list[str] = ['GCP', 'AWS', 'Azure']
SERVICE_TYPE = pinecone_flags.POD
RESOURCE_TYPE = 'PineconeServer'
client_vm: linux_virtual_machine.BaseLinuxVirtualMachine
def __init__(self, pinecone_spec):
super().__init__()
self.server_shards = pinecone_spec.server_shards
self.server_replicas = pinecone_spec.server_replicas
self.server_environment = pinecone_spec.server_environment
self.server_pod_type = pinecone_spec.server_pod_type
self.server_api_key = pinecone_spec.server_api_key
if not self.server_api_key:
self.server_api_key = self._GetAPIKeyFromFile()
self.index_name = 'pinecone-index-' + FLAGS.run_uri
def _Create(self):
"""Create a pinecone server."""
# Indexes are usually created in the benchmark.
pass
def _Exists(self):
"""Method to validate the existence of a Pinecone server.
Returns:
Boolean value indicating the existence of a pinecone server.
"""
return True
def _DeleteResource(self):
"""Delete a Pinecone index."""
self.client_vm.RemoteCommand(
f'curl -i -X DELETE "https://api.pinecone.io/indexes/{self.index_name}"'
f' -H "Api-Key: {self.server_api_key}" -H "X-Pinecone-API-Version:'
' 2024-07"',
ignore_failure=True,
)
def _Delete(self):
"""Delete a Pinecone index."""
# Pinecone override the DeleteResource.
pass
def GetResourceMetadata(self):
"""Returns a dictionary of metadata.
Child classes can extend this if needed.
Raises:
RelationalDbPropertyNotSetError: if any expected metadata is missing.
"""
metadata = {
'server_shards': self.server_shards,
'server_replicas': self.server_replicas,
'server_environment': self.server_environment,
'server_pod_type': self.server_pod_type,
'index_name': self.index_name,
}
return metadata
def _GetAPIKeyFromFile(self) -> str:
"""Get the API key from a file."""
return vm_util.IssueCommand(
['cat', pinecone_flags.PINECONE_API_KEY_PATH.value]
)[0].strip()
def SetVms(self, vm_groups):
self.client_vms = vm_groups[
'clients' if 'clients' in vm_groups else 'default'
]
self.client_vm = self.client_vms[0]
def GetPineconeResourceClass(
cloud: str,
) -> resource.AutoRegisterResourceMeta | None:
"""Gets the pinecone server class for the given cloud."""
return resource.GetResourceClass(PineconeServer, CLOUD=cloud)