Spinlock直到实例从Openstack获得了它的ip地址

时间:2015-05-06 02:56:05

标签: python novaclient

我正在编写一个程序,在需要时自动在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 个答案:

答案 0 :(得分:0)

我成功解决了这个问题。原来很难通过仅使用novaclient来检测机器何时准备就绪。通过使用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)的输出