GCP/Py: определить, когда экземпляр вычислительного движка действительно готов к использованию (не "RUNNING")
Я возился с примером кода, который предоставляет Google, и я пытаюсь определить, когда экземпляр готов к работе. У них операция 'DONE'
статус, и у них есть экземпляр 'RUNNING'
статус, но все еще есть задержка, пока я не смогу использовать экземпляр. Как лучше всего ждать этого, не дожидаясь установленного периода времени (потому что это пустая трата времени, если экземпляр будет готов раньше)?
Я модифицировал их wait_for_operation
функция, поэтому она использует isUp
:
# [START wait_for_operation]
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
print("result:")
print(result)
if 'error' in result:
raise Exception(result['error'])
print("before ex")
instStatus = compute.instances().get(
project=project,
zone=zone,
instance='inst-test1').execute()
print("after ex")
if instStatus['status'] == 'RUNNING':
if isUp("10.xxx.xx.xx"):
print("instStatus = ")
print(instStatus)
return result
else:
print("wasn't replying to ping")
time.sleep(1)
# [END wait_for_operation]
def isUp(hostname):
giveFeedback = False
if platform.system() == "Windows":
response = os.system("ping "+hostname+" -n 1")
else:
response = os.system("ping -c 1 " + hostname)
isUpBool = False
if response == 0:
if giveFeedback:
print( hostname + 'is up!')
isUpBool = True
else:
if giveFeedback:
print( hostname + 'is down!')
return isUpBool
См. Ответ Мэтью для оригинала isUp
код: пинг серверов в Python
Большая часть другого кода возникла здесь: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/compute/api/create_instance.py
Ссылка на статус GCP: https://cloud.google.com/compute/docs/instances/checking-instance-status
Мой код работает, но есть ли лучший способ использовать состояние экземпляра или что-то и избежать всего isUp
/ пинг? Похоже, мой метод - ненужный обходной путь.
Очевидно, я использую Python, и это просто возиться с кодом с ненужными отпечатками и т. Д.
У меня есть рабочая станция Windows 7, и я не хочу требовать прав администратора и экземпляра Linux.
Отредактируйте 1: "готов к выполнению работы", я имею в виду, я могу послать ему команды, и он ответит.
2 ответа
Один из подходов, который я использовал, - это запуск сценария создания поля в метаданных экземпляра. Затем вы можете проверить состояние экземпляра, используя ваш код about, и посмотреть, были ли добавлены новые метаданные. Затем вы можете избежать проверки связи с сервером. Дополнительным преимуществом является то, что если для экземпляра нет внешнего ip, этот метод все еще работает.
instStatus = compute.instances().get(
project=project,
zone=zone,
instance='inst-test1').execute()
Привет, я бы предложил вам использовать глобальные операции. https://cloud.google.com/compute/docs/reference/rest/beta/globalOperations/get
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('compute', 'beta', credentials=credentials)
# Project ID for this request.
project = 'my-project' # TODO: Update placeholder value.
# Name of the Operations resource to return.
operation = 'my-operation' # TODO: Update placeholder value.
request = service.globalOperations().get(project=project, operation=operation)
response = request.execute()
# TODO: Change code below to process the `response` dict:
pprint(response)