Я пытаюсь создать скрипт на 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.
Кто-то знает, что я делаю не так?
Спасибо !!