在自动化测试的过程中,使用命令行操作虚拟机是司空见惯的事情,这里要说的就是使用Python语言来操作虚拟机,以达到自动化的目的。

网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

好多同学都对python很感兴趣,虽然国外的codecademy学编程很好玩,但是很多同学没有看英文网站的习惯,所有就有想法来写这篇文章了。

    
我们都知道,vmware官方对命令行提供了vmrun.exe工具,我们可以在vmrun中运行诸如clone之类的命令,这就提醒我们可以在python中运行cmd指令,调用vmrun来完成相关的虚拟机操作。关于vmrun运行指令可以参考vmware官方关于vix的api的文档。

HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议。包括:传输层的
FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议。

当然在这之前,我还是要声明一下,我还是觉得ruby更好玩,以后有时间会写关于ruby的。

实例如下:

socket是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。

1 来首先打个招呼

vmrun.exe clone PathToVmxFile PathToDestinationVmxFile Full|Link [Snapshot Name]

我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

2 写写变量吧

    
言归正传,在Python中如何操作虚拟机呢?PyVIx和PySphere粉墨登场!他们的介绍如下:

而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。

mynum=12=

**: PyVIx is a Python wrapper for the
VMWare(R) VIX C API that allows Python to programmatically control
VMWare(R) virtual machines. Example operations include: powering on;
suspending; creating, reverting to, and removing snapshots; and running
programs.(下载戳这里)

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

3 写个函数

**: PySphere is platform independent
and works with python, PySphere can interact with ESX, ESXi, Virtual
Center, Virtual Server, and it should work with any other VMWare product
exposing the vSphere Web Services SDK.(下载戳这里)

有个比较形象的描述:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

这里我们要停一下了,python的语句块是靠缩进来表示的,而且每当要缩进的时候必然会有一个冒号:

    
安装的过程和其他三方Python的方式都是保持一致的,不懂得可以参考这个。因工作中主要实用Esxi,所以这里重点讲述下PySphere的使用,我们自定义了一个实用的class,在这里和大家共享,先贴代码:

 实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

记住这上面的话,你就理解python一半了

 pysphere  pysphere 
= = = ==







    =====





     get_registered_vms(self, param, status=None, datacenter=None, cluster== param   [, , ,  
             self.connect_flag == 
             param ==  param ==  self.server.get_registered_vms(datacenter, cluster, resource_pool, status= param ==  self.server.get_registered_vms(datacenter, cluster, resource_pool, status= param ==  self.server.get_registered_vms(datacenter, cluster, resource_pool, status=
     self.connect_flag =====














        = 

== = = = = == = = =    =





     (self, esxi_server, parm, username = , password = , parm_type =  parm_type  [, === 



      parm_type == 
                self.vm = + parm + 

         parm_type == 
                self.vm = + parm + 
                = self.vm.get_property(= self.vm.get_property(= self.vm.get_property(= self.vm.get_property(= self.vm.get_property(
    = self.status !=  =
    = self.vm.get_status(basic_status= self.status !=  =

     operate_vm(self, operate, sync_run = True, status = None, time_out = -1 operate   [, , ,  
             sync_run == self. sync_run == status == 
                 status   [, , ,  
                 (time_out == -1)  (time_out == 
             self.

      operate ==  self.status  [,   + self.name + 
                 self.vm.is_powering_on()  operate ==  self.status  [ ,   + self.name + 
                 self.vm.is_powering_off()  operate ==  self.status  [,   + self.name + 
                 self.vm.is_suspending()  operate ==  self.status ==   + self.name + 


      operate ==  self.status  [,   + self.name + 
                = self.vm.power_on(sync_run== task.wait_for_state([status, ], timeout= status ==   ++  str(time_out) + 
                 operate ==  self.status  [ ,   + self.name + 
                = self.vm.power_off(sync_run== task.wait_for_state([status, ], timeout= status ==   ++  str(time_out) + 
                 operate ==  self.status  [,   + self.name + 
                = self.vm.suspend(sync_run== task.wait_for_state([status, ], timeout= status ==   ++  str(time_out) + 
                 operate ==  self.status ==   + self.name + 
                = self.vm.reset(sync_run== task.wait_for_state([status, ], timeout= status ==   ++  str(time_out) + 

    =
    = snapshot 

     operate_snapshot(self, operate, name = None, description = None, sync_run = True, status = None, time_out = -1 operate   [, , ,  
             sync_run == self. sync_run == status == 
                 status   [, , ,  
                 (time_out == -1)  (time_out == 
             self.

      operate ==  operate ==  name  
                = name   + name +  + self.name + 
                 operate ==  operate ==  name  
                = name   + name +  + self.name + 
                 operate ==  name  
                = name  + name +  + self.name + 
             (description   None)  (description != 

      operate == = self.vm.revert_to_snapshot(sync_run== task.wait_for_state([status, ], timeout= status ==   str(time_out) + 
                 operate ==  name  
                = name   + name +  + self.name + 
                = self.vm.revert_to_named_snapshot(name, sync_run== task.wait_for_state([status, ], timeout= status ==   str(time_out) + 
                 operate == = self.vm.delete_current_snapshot(sync_run== task.wait_for_state([status, ], timeout= status ==   str(time_out) + 
                 operate ==  name  
                = name   + name +  + self.name + 
                = self.vm.delete_named_snapshot(name, sync_run== task.wait_for_state([status, ], timeout= status ==   str(time_out) + 
                 operate ==  name  
                = name  + name +  + self.name + = self.vm.create_snapshot(name, sync_run== task.wait_for_state([status, ], timeout= status ==   str(time_out) + 



     get_vm_properties(self, from_cache = self.vm.get_properties(from_cache=

     get_vm_property(self, property_name, from_cache = property_name   [, , , , , ,  
             self.vm.get_property(property_name, from_cache=



     self.status !=  =  + self.name + 
             operate   [, , ,  
             operate == 



            self. = operate == 



            self. = operate == 



            self. = operate == 



            self. = 




     make_directory(self, path, create_parents= self. == 





     self. == 








     self. == 





     list_files(self, path, match_pattern= self. ==








     self.make_directory(path, create_parents=
     is_path_exists(self, path, check_type = 
         self. == 
             check_type   [,  
             path.endswith(= path[:-1 path.find() != -1  path.find() != -1 
             path.find() != -1= path[0:path.rfind(= path[path.rfind()+1 (check_item  None)  (check_item == = check_type ==  tmp_list   item  item[].lower() == check_item  item[] ==  check_type ==  tmp_list   item  item[].lower() == check_item  item[] ==  path.find() != -1= path[0:path.rfind(= path[path.rfind()+1 (check_item  None)  (check_item == = check_type ==  tmp_list   item  item[].lower() == check_item  item[] ==  check_type ==  tmp_list   None:

 

4 写注释

    
喜欢拿来主义的孩纸,我对不起你们,希望能从这个类中学到你们需要的!其中的很多个方法可是废了很大的功夫才搞定的,如get_log_file等!

利用Socket建立网络连接的步骤:

5 字符串方法

     感谢阅读!

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket
,另一个运行于服务器端,称为ServerSocket 。

 len( lower( upper( str(123 int()

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

6 把字符串加起来

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

 +

发表评论

电子邮件地址不会被公开。 必填项已用*标注