Фильтровать список экземпляров, используя несколько выражений в Python - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать скрипт на python для отображения списка машин, отфильтрованных по критериям.

Я пытался искать в Google несколько часов, но я не нашел ничего работающего, и в документации GCP нет примеров. Я нашел, как сделать фильтры, которые частично фильтруют список, но когда я объединяю два из них, чтобы создать весь фильтр, происходит сбой.

У меня есть этот пример кода:

from pprint import pprint

from googleapiclient import discovery
from oauth2client import service_account
import .json


config = json.load(open('config.cfg'))

credentials = service_account.ServiceAccountCredentials.from_json_keyfile_dict(
                  keyfile_dict=config.get('gcp_credentials')
              )

service = discovery.build('compute', 'v1', credentials=credentials)

# Project ID for this request.
project = config['gcp_credentials']['project_id']

# The name of the zone for this request.
zone = 'europe-west1-b'

request = service.instances().list(project=project, zone=zone, filter="name:machine-name*")
while request is not None:
  response = request.execute()

  for instance in response['items']:
    pprint(instance['name'] + ', ' + instance['status'])

  request = service.instances().list_next(previous_request=request, previous_response=response)

В качестве фильтров я пробовал эти четыре варианта:

"name eq .*machine-name.*"
"name: machine-name*"
"status = TERMINATED"
"status eq TERMINATED"

Все работают, как ожидалось, и фильтруют данные, и когда я объединяю два стандартных фильтра, тогда работает:

"(name: machine-name*) AND (status = TERMINATED)"

Но если я попытаюсь объединить фильтр регулярных выражений со стандартным или другим фильтром регулярных выражений, произойдет сбой, например:

"(name eq .*machine-name.*) AND (status = TERMINATED)"
"(name eq .*machine-name.*) AND (status eq TERMINATED)"

и если я уберу некоторые или все скобки, это не даст сбоя, но я получу пустой список:

"(name eq .*machine-name.* AND status = TERMINATED)"
"name eq .*machine-name.* AND status eq TERMINATED"

Также я пытался использовать звездочку перед именем машины в рабочем фильтре:

"(name: *machine-name*) AND (status = TERMINATED)"

Для фильтрации машин, имена которых содержат этот текст, но я также получил пустой список.

То, что я хочу, это просто фильтровать по нескольким ключам и содержать значения. Например, имя, которое содержит имя машины (не просто начинается, как фильтр «имя: имя машины *»), и их статус - RUNNING или TERMINATED.

Кто-то знает, что я делаю не так?

Спасибо !!

...