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)