Spinlock, пока экземпляр не получил свой IP-адрес от Openstack

Я пишу программу, которая автоматически создает серверы в openstack, когда это необходимо. Проблема в том, что я хочу, чтобы программа подождала, пока экземпляр получил свой IP-адрес, прежде чем продолжить. Если экземпляр не получил свой ip, novaclient сгенерирует исключение и объект умрет. Использование функции сна заставляет ее работать, но я не хочу, чтобы это было постоянным решением.

   ipAddress = None
   try:
        instance = nova.servers.create(name=self.hostName, image=image,
                                flavor=flavor, key_name="mykey",
                                nics=nics)
        while(ipAddress == None): #<---Something like this, just actually working
            for network in instance.networks['my_net']:
                if re.match('\d+\.\d+\.\d+\.\d+', network):
                    self.ipAddress = network
                    break

        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)

    except:
        print "could not create webserver"
        #WebManager.exception(hostname)

    finally:
        print("Execution Completed")
        self.addToLoadbalancer()

Есть ли способ написать что-то вроде спин-блокировки или чего-то подобного, что будет ждать, пока сервер не получит свой IP? Любые советы будут великолепны.

1 ответ

Решение

Мне удалось решить проблему. Оказалось, что было трудно определить, когда машина была готова, используя только новаклиент. Используя nova list Мне удалось получить IP-адрес.

while 1 == 1:
    result = getbash("nova list" + " | grep " + hostname + \\
             " | awk '{print $12}'").split('=')
    if re.match('\d+\.\d+\.\d+\.\d+', result[-1]):
        self.ipAddress = result[-1]
        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)
        break
    sleep(1)

Этот код запрашивает имя хоста и проверяет, получил ли экземпляр IP-адрес. Функция getbash() является простой subprocess функция, которая возвращает вывод subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)

Другие вопросы по тегам