昨晚睡得挺晚的,妈蛋,想想大家都tmd的要结婚了,就剩我一个大屌丝,不爽,想找个妹子聊,没有,蛋疼,故意不睡,高血压又上来了,没休息好,今天早上抢小米手环没抢到,妈蛋,领导还不走,没法提前下班。。。
1. nova 有直接修改hostname的cli,我想调一下,看看它是怎么运行的
usage: nova rename <server> <name>
Rename a server.
Positional arguments
<server>
Name (old name) or ID of server.
<name>
New name for the server.
比如:nova rename old_server_name new_server_name
@utils.arg('server', metavar='<server>',
help=_('Name (old name) or ID of server.'))
@utils.arg('name', metavar='<name>', help=_('New name for the server.'))
def do_rename(cs, args):
"""Rename a server."""
_find_server(cs, args.server).update(name=args.name)
每个函数上面都有这个@。。。,感觉应该是命令如何使用的,具体是怎么工作的,我不了解
1. novaclient/v1_1.shell.py 1350 def do_rename(cs,args):
def do_rename(cs, args):
"""Rename a server."""
_find_server(cs, args.server).update(name=args.name)
2. novaclient/v1_1.shell.py 1666
def _find_server(cs, server):
"""Get a server by name or ID."""
return utils.find_resource(cs.servers, server)
3. novaclient/utils.py 205
def find_resource(manager, name_or_id, **find_args): manager= <novaclient.v1_1.servers.ServerManager object at 0x353f310> name_or_id=lihao-123
1) return manager.get(int(name_or_id)) # try to get entity as integer id 失败
2)tmp_id = strutils.safe_encode(name_or_id) # now try to get entity as uuid 也失败,因为我们传进的是server name
uuid.UUID(tmp_id)
3) return manager.find(human_id=name_or_id, **find_args) 成功,通过human-id,就是人类的命名,就是server_name,然后返回这个server的信息(对象)
4. novaclient/base.py 138 def find(self, **kwargs):
1)matches = self.findall(**kwargs) 查询是否有何kwargs名字相同的server
2)返回0个,出错,返回>=2个也出错,只有返回1个的时候正确,并返回这一个server的信息
5. novaclient/base.py 148 def findall(self, **kwargs): kwargs = {'human_id': u'lihao-123'}
1)非detail的 listing = self.list(**list_kwargs) list_kwargs= {'detailed': False}
2)查询得到的所有list中,是否有kwargs一样名字的。有则返回那个server的粗略信息。
6. novaclient/base.py 63 def _list(self, url, response_key, obj_class=None, body=None): url=/servers ,response_key=servers ,其余两个为none
1)_resp, body = self.api.client.get(url)
# url = /servers,但是到了底层就变为 http://192.168.39.78:8774/v2/f7f0411a6a654f7c814c5da889aba647/servers
#get u'http://192.168.39.78:8774/v2/f7f0411a6a654f7c814c5da889aba647/servers' 通过rest api获得了所有的虚机信息(虚机的基本信息,和虚机详细信息的链接)
2) 将这些查询到的server信息,写入到novaclient的缓存中,/root/.novaclient/XXXX 具体用意不了解
7. novaclient/v1_1/shell.py update(name=args.name) 1350 name = ppppp
2-6分析完了前一个函数_find_server的功能,下面分析后一个功能,update
8. novaclient/v1_1/servers.py 901 return self._update("/servers/%s" % base.getid(server), body, "server")
# base.getid(server) = server's uuid,body = {'server': {'name': u'pppp'}}
9.novaclient/base.py 112 def _update(self, url, body, response_key=None, **kwargs):
#url = u'/servers/acf18c19-c2de-47bb-be97-16fe229eabd1'
#body={'server': {'name': u'pppp'}}
#response_key= 'server'
#kwargs= none
1) self.run_hooks('modify_body_for_update', body, **kwargs) #貌似没有什么作用
2)_resp, body = self.api.client.put(url, body=body) #url = u'/servers/acf18c19-c2de-47bb-be97-16fe229eabd1' , body= {'server': {'name': u'pppp'}}
#最终是调用_cs_request(self, url, method, **kwargs): url=u'/servers/acf18c19-c2de-47bb-be97-16fe229eabd1' method = "PUT" kwargs = {'body': {'server': {'name': u'pppp'}}}
#说白了,又是调用一个restapi
10. novaclient/utils.py 319 def run_hooks(cls, hook_type, *args, **kwargs):
#cls=<class 'novaclient.v1_1.servers.ServerManager'>
#hook_type='modify_body_for_update'
#arg=({'server': {'name': u'pppp'}},)
#kwargs={}
hook_funcs = cls._hooks_map.get(hook_type) or []
for hook_func in hook_funcs:
hook_func(*args, **kwargs)
总结一下:说白了,调用了两个restapi
1) /servers/ 获得所有servers的基本信息(最重要的是uuid)
2)/servers/uuid put {'body': {'server': {'name': u'pppp'}}} 修改名字
下面我们将从nova-api的视角,看一下/servers/uuid put {'body': {'server': {'name': u'pppp'}}} 这个restapi到来之后,nova-api是如何处理的
2. nova启动一个虚机,meta_data存放在什么地方?数据库?还是在nova compute的节点上?还是哪?还有查询meta_data的cli是什么?我得跟踪一下
nova host-meta Set or Delete metadata on all instances of a host.
nova meta Set or Delete metadata on a server.
3. nova boot的流程比较复杂,但也得硬着头皮去分析,最好能调试着看下
4.与密码有关的cli
5. 弄清楚,nova list或者nova XXX-list 是否是查询数据库?还是通过其他的方式得到list
ps:nova cli的调用都是从python-novaclient进入的,devstack部署的话,都在/opt/stack/python-novaclient下
补充知识:
http中:
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
PUT- 更新或创建
下午翘班去某湖骑行,风景不错。心情还好。
和同事都发现nova api无法用pycharm调试
但是可以用其他方法弥补,比如找到到底是哪个方法,用打log的方式将其输出,还有一点,有可能这个类中没有某个函数,一定要仔细的看他的父类是否有这个函数。
meta_data数据到底是保存在什么地方?这个问题一定要仔细的分析,还有对工作的一丝不苟的精神也应该被得到贯彻,最近工作用心不深,感觉在那瞎搞!
今天晚上,一个花田才认识2,3天,没见过,连个微信号都没有的妹子,她居然让我给她买东西,好吧,我忍了,买,结果一看,一个杯子接近300元,我忍不了了。残忍拒绝,妹子让我滚...我真的不知道是不是我社会经验太不丰富了,我真的被雷到了。确实,我挺喜欢这种强势而犀利的妹子,但是这么厉害的,我还是接受不了。最终还被妹子拉黑了...
我从妹子的角度上思考了下,一个海归,一个教雅思的海归,必然受到西方的那种思想影响,人家觉得我让你给我送个东西,是给你机会,你tmd的还不识抬举,磨磨唧唧的,这么点小钱都不舍得出,还是个男人么...
但是我真的没法说服自己冒“这么大”的风险去迎合妹子,所以,我活该找不到女朋友。。。
也许,她可能变本加厉的要这要那,也许她只是一个小小的试探以筛去那些不合格的人,甚至,当你代付之后,她就会立刻把钱还回你的账户上。但是对于我,一切都已经晚了。
一个不舍得花300元去追逐自己可能的幸福的人注定碌碌无为!这是送给不争气的自己的话。