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)
Другие вопросы по тегам