Невозможно перечислить экземпляры Redis в моем проекте gcp с помощью API redis python - PullRequest
0 голосов
/ 11 марта 2020

Это исходный код, который я написал после документации Redis_API здесь. Какую ошибку я делаю https://googleapis.dev/python/redis/latest/gapic/v1/api.html

from google.oauth2.service_account import Credentials
from google.cloud import redis_v1

LOGGER = logging.getLogger(__name__)

class GcpMemorystore:
    def __init__(self, credentials, project_id: str, zone: str):
        self.credentials = credentials
        self.project_id = project_id
        self.zone = zone
        self.redisClient = redis_v1.CloudRedisClient().from_service_account_json(credentials)


    """List all Redis instances"""
    def list_all_instances(self, prefix=None):
        """
        Delete all Objects from all buckets
        followed by deletion of all subsequent buckets
        :param prefix:
        :return:
        """
        #instances = self.redisClient.list_instances().client.from_service_account_json(self.credentials)
        parent = self.redisClient.location_path( self.project_id, self.zone )
        instances = self.redisClient.list_instances()
        print(instances)

Однако всякий раз, когда я запускаю этот код Я продолжаю получать в этой ошибке

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    GcpMemorystore.list_all_instances(service_account_file)
  File "/Users/shoaib_nasir/PycharmProjects/gcp-cost-saver/GcpResources/gcp_memorystore.py", line 25, in list_all_instances
    parent = self.redisClient.location_path( '[eng-node]', '[us-central1-a]' )
AttributeError: 'str' object has no attribute 'redisClient'
(venv) CA-SHOAIBN-M:gcp-cost-saver shoaib_nasir$ 

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

На самом деле мне удалось заставить его работать и заметил несколько проблем. Во-первых, у меня возникла проблема с учетными данными, а во-вторых, я передавал «зону» вызову API, вместо этого мне приходилось передавать регион, где region = "us-central1"

class GcpMemorystore:
    def __init__(self, credentials, project_id: str, region: str):
        self.credentials = credentials
        self.project_id = project_id
        self.region = region
        self.redisClient = redis_v1beta1.CloudRedisClient(credentials=credentials) 


    """List all Redis instances"""
    def list_all_instances(self, prefix=None):
        parent = self.redisClient.location_path(self.project_id, self.region)
        return self.redisClient.list_instances(parent).pages:

и вызывать метод класса работал нормально для меня

redis_list = GcpMemorystore(credentials, project_id, region).list_all_instances()
0 голосов
/ 11 марта 2020

В соответствии с ошибкой вы вызываете метод из конструктора класса, превращая его в простую функцию. Вот почему self - это просто строка, которую вы передали в вызов.

Либо передайте экземпляр класса в качестве первого аргумента, либо гораздо лучше вызовите метод непосредственно из экземпляра класса.

...