设为首页 收藏本站
查看: 823|回复: 0

[经验分享] openstack nova 源码分析4

[复制链接]

尚未签到

发表于 2018-6-2 14:08:55 | 显示全部楼层 |阅读模式
  还是有许多地方可能错了 希望大婶们 看见 给予意见 !
  这个文件位于\nova\virt,是一个底层的driver.py,源代码如下(和以前一样添加了些注释,另外把我 觉得比较重要的computerDriver类列出来 了,并将下面的每个函数分离 加以注释《见下面图片》!我看见后面好多函数都是继承的ComputerDriver比如nova\virt\libvirt下面的connection.py里面的class LibvirtConnection(driver.ComputeDriver):):


  • """  
  • Driver base-classes:  

  •     (Beginning of) the contract that compute drivers must follow, and shared  
  •     types that support that contract  
  • """

  • from nova.compute import power_state  


  • class InstanceInfo(object):  
  •     def __init__(self, name, state):  
  •         self.name = name  
  •         assert state in power_state.valid_states(), "Bad state: %s" % state  
  •         self.state = state  


  • def block_device_info_get_root(block_device_info):  
  •     block_device_info = block_device_info or {}  
  •     return block_device_info.get('root_device_name')  


  • def block_device_info_get_swap(block_device_info):  
  •     block_device_info = block_device_info or {}  
  •     return block_device_info.get('swap') or {'device_name': None,  
  •                                              'swap_size': 0}  


  • def swap_is_usable(swap):  
  •     return swap and swap['device_name'] and swap['swap_size'] > 0


  • def block_device_info_get_ephemerals(block_device_info):  
  •     block_device_info = block_device_info or {}  
  •     ephemerals = block_device_info.get('ephemerals') or []  
  •     return ephemerals  


  • def block_device_info_get_mapping(block_device_info):  
  •     block_device_info = block_device_info or {}  
  •     block_device_mapping = block_device_info.get('block_device_mapping') or []  
  •     return block_device_mapping  


  • class ComputeDriver(object):  
  •     """Base class for compute drivers.

  •     The interface to this class talks in terms of 'instances' (Amazon EC2 and  
  •     internal Nova terminology), by which we mean 'running virtual machine'  
  •     (XenAPI terminology) or domain (Xen or libvirt terminology).  

  •     An instance has an ID, which is the identifier chosen by Nova to represent  
  •     the instance further up the stack.  This is unfortunately also called a  
  •     'name' elsewhere.  As far as this layer is concerned, 'instance ID' and  
  •     'instance name' are synonyms.  

  •     Note that the instance ID or name is not human-readable or  
  •     customer-controlled -- it's an internal ID chosen by Nova.  At the  
  •     nova.virt layer, instances do not have human-readable names at all -- such  
  •     things are only known higher up the stack.  

  •     Most virtualization platforms will also have their own identity schemes,  
  •     to uniquely identify a VM or domain.  These IDs must stay internal to the  
  •     platform-specific layer, and never escape the connection interface.  The  
  •     platform-specific layer is responsible for keeping track of which instance  
  •     ID maps to which platform-specific ID, and vice versa.  

  •     In contrast, the list_disks and list_interfaces calls may return  
  •     platform-specific IDs.  These identify a specific virtual disk or specific  
  •     virtual network interface, and these IDs are opaque to the rest of Nova.  

  •     Some methods here take an instance of nova.compute.service.Instance.  This  
  •     is the datastructure used by nova.compute to store details regarding an  
  •     instance, and pass them into this layer.  This layer is responsible for  
  •     translating that generic datastructure into terms that are specific to the  
  •     virtualization platform.  

  •     """
  •     #此处为了让大家看的明白 将 ComputerDriver的类图 列出来  

  •     def init_host(self, host):  
  •         """Initialize anything that is necessary for the driver to function,
  •         including catching up with currently running VM's on the given host."""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def get_info(self, instance_name):  
  •         """Get the current status of an instance, by name (not ID!)

  •         Returns a dict containing:  

  •         :state:           the running state, one of the power_state codes  
  •         :max_mem:         (int) the maximum memory in KBytes allowed  
  •         :mem:             (int) the memory in KBytes used by the domain  
  •         :num_cpu:         (int) the number of virtual CPUs for the domain  
  •         :cpu_time:        (int) the CPU time used in nanoseconds  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def list_instances(self):  
  •         """
  •         Return the names of all the instances known to the virtualization  
  •         layer, as a list.  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def list_instances_detail(self):  
  •         """Return a list of InstanceInfo for all registered VMs"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def spawn(self, context, instance,  
  •               network_info=None, block_device_info=None):  
  •         """
  •         Create a new instance/VM/domain on the virtualization platform.  

  •         Once this successfully completes, the instance should be  
  •         running (power_state.RUNNING).  

  •         If this fails, any partial instance should be completely  
  •         cleaned up, and the virtualization platform should be in the state  
  •         that it was before this call began.  

  •         :param context: security context  
  •         :param instance: Instance object as returned by DB layer.  
  •                          This function should use the data there to guide  
  •                          the creation of the new instance.  
  •         :param network_info:  
  •            :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info`  
  •         :param block_device_info:  
  •         """
  •         raise NotImplementedError()  

  •     def destroy(self, instance, network_info, cleanup=True):  
  •         """Destroy (shutdown and delete) the specified instance.

  •         If the instance is not found (for example if networking failed), this  
  •         function should still succeed.  It's probably a good idea to log a  
  •         warning in that case.  

  •         :param instance: Instance object as returned by DB layer.  
  •         :param network_info:  
  •            :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info`  
  •         :param cleanup:  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def reboot(self, instance, network_info):  
  •         """Reboot the specified instance.

  •         :param instance: Instance object as returned by DB layer.  
  •         :param network_info:  
  •            :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info`  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def snapshot_instance(self, context, instance_id, image_id):  
  •         raise NotImplementedError()  

  •     def get_console_pool_info(self, console_type):  
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def get_console_output(self, instance):  
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def get_ajax_console(self, instance):  
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def get_diagnostics(self, instance):  
  •         """Return data about VM diagnostics"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def get_host_ip_addr(self):  
  •         """
  •         Retrieves the IP address of the dom0  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def attach_volume(self, context, instance_id, volume_id, mountpoint):  
  •         """Attach the disk at device_path to the instance at mountpoint"""
  •         raise NotImplementedError()  

  •     def detach_volume(self, context, instance_id, volume_id):  
  •         """Detach the disk attached to the instance at mountpoint"""
  •         raise NotImplementedError()  

  •     def compare_cpu(self, cpu_info):  
  •         """Compares given cpu info against host 确保vm能运行

  •         Before attempting to migrate a VM to this host,  
  •         compare_cpu is called to ensure that the VM will  
  •         actually run here.  

  •         :param cpu_info: (str) JSON structure describing the source CPU.  
  •         :returns: None if migration is acceptable  
  •         :raises: :py:class:`~nova.exception.InvalidCPUInfo` if migration  
  •                  is not acceptable.  
  •         """
  •         raise NotImplementedError()  

  •     def migrate_disk_and_power_off(self, instance, dest):  
  •         """
  •         Transfers the disk of a running instance in multiple phases, turning  
  •         off the instance before the end.  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def snapshot(self, context, instance, image_id):  
  •         """
  •         Snapshots the specified instance.  

  •         :param context: security context  
  •         :param instance: Instance object as returned by DB layer.  
  •         :param image_id: Reference to a pre-created image that will  
  •                          hold the snapshot.  
  •         """
  •         raise NotImplementedError()  

  •     def finish_migration(self, context, instance, disk_info, network_info,  
  •                          resize_instance):  
  •         #打开一个迁移的实例,完成一个调整  
  •         """Completes a resize, turning on the migrated instance

  •         :param network_info:  
  •            :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info`  
  •         """
  •         raise NotImplementedError()  

  •     def revert_migration(self, instance):  
  •         #返回一个调整,推动回到实例?  
  •         """Reverts a resize, powering back on the instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def pause(self, instance, callback):  
  •         """Pause the specified instance."""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def unpause(self, instance, callback):  
  •         """Unpause paused VM instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def suspend(self, instance, callback):  
  •         # 挂起指定的实例  
  •         """suspend the specified instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def resume(self, instance, callback):  
  •         """resume the specified instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def rescue(self, context, instance, callback, network_info):  
  •         #恢复指定的实例  
  •         """Rescue the specified instance"""
  •         raise NotImplementedError()  

  •     def unrescue(self, instance, callback, network_info):  
  •         """Unrescue the specified instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def update_available_resource(self, ctxt, host):  
  •         #在computeNode表中更新电脑资源管理的信息  
  •         """Updates compute manager resource info on ComputeNode table.

  •         This method is called when nova-compute launches, and  
  •         whenever admin executes "nova-manage service update_resource".  

  •         :param ctxt: security context  
  •         :param host: hostname that compute manager is currently running  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def live_migration(self, ctxt, instance_ref, dest,  
  •                        post_method, recover_method):  
  •         #分发处理高负荷,当有高负荷操作时候,大量生成 live_mirgration  
  •         """Spawning live_migration operation for distributing high-load.

  •         :param ctxt: security context  
  •         :param instance_ref:  
  •             nova.db.sqlalchemy.models.Instance object  
  •             instance object that is migrated.  
  •         :param dest: destination host  
  •         :param post_method:  
  •             post operation method.  
  •             expected nova.compute.manager.post_live_migration.  
  •         :param recover_method:  
  •             recovery method when any exception occurs.  
  •             expected nova.compute.manager.recover_live_migration.  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def refresh_security_group_rules(self, security_group_id):  
  •         #改变安全组之后调用  
  •         """This method is called after a change to security groups.

  •         All security groups and their associated rules live in the datastore,  
  •         and calling this method should apply the updated rules to instances  
  •         running the specified security group.  

  •         An error should be raised if the operation cannot complete.  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def refresh_security_group_members(self, security_group_id):  
  •         #当一个安全组被添加到一个实例,这个方法被调用  
  •         """This method is called when a security group is added to an instance.

  •         This message is sent to the virtualization drivers on hosts that are  
  •         running an instance that belongs to a security group that has a rule  
  •         that references the security group identified by `security_group_id`.  
  •         It is the responsiblity of this method to make sure any rules  
  •         that authorize traffic flow with members of the security group are  
  •         updated and any new members can communicate, and any removed members  
  •         cannot.  

  •         Scenario:  
  •             * we are running on host 'H0' and we have an instance 'i-0'.  
  •             * instance 'i-0' is a member of security group 'speaks-b'  
  •             * group 'speaks-b' has an ingress rule that authorizes group 'b'  
  •             * another host 'H1' runs an instance 'i-1'  
  •             * instance 'i-1' is a member of security group 'b'  

  •             When 'i-1' launches or terminates we will recieve the message  
  •             to update members of group 'b', at which time we will make  
  •             any changes needed to the rules for instance 'i-0' to allow  
  •             or deny traffic coming from 'i-1', depending on if it is being  
  •             added or removed from the group.  

  •         In this scenario, 'i-1' could just as easily have been running on our  
  •         host 'H0' and this method would still have been called.  The point was  
  •         that this method isn't called on the host where instances of that  
  •         group are running (as is the case with  
  •         :method:`refresh_security_group_rules`) but is called where references  
  •         are made to authorizing those instances.  

  •         An error should be raised if the operation cannot complete.  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def refresh_provider_fw_rules(self, security_group_id):  
  •         #这触发一个基于数据库改变的防火墙的更新  
  •         """This triggers a firewall update based on database changes.

  •         When this is called, rules have either been added or removed from the  
  •         datastore.  You can retrieve rules with  
  •         :method:`nova.db.api.provider_fw_rule_get_all`.  

  •         Provider rules take precedence over security group rules.  If an IP  
  •         would be allowed by a security group ingress rule, but blocked by  
  •         a provider rule, then packets from the IP are dropped.  This includes  
  •         intra-project traffic in the case of the allow_project_net_traffic  
  •         flag for the libvirt-derived classes.  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def reset_network(self, instance):  
  •         """reset networking for specified instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         pass

  •     def ensure_filtering_rules_for_instance(self, instance_ref, network_info):  
  •         #设置过滤规则,并等待它完成  
  •         """Setting up filtering rules and waiting for its completion.

  •         To migrate an instance, filtering rules to hypervisors  
  •         and firewalls are inevitable on destination host.  
  •         ( Waiting only for filtering rules to hypervisor,  
  •         since filtering rules to firewall rules can be set faster).  

  •         Concretely, the below method must be called.  
  •         - setup_basic_filtering (for nova-basic, etc.)  
  •         - prepare_instance_filter(for nova-instance-instance-xxx, etc.)  

  •         to_xml may have to be called since it defines PROJNET, PROJMASK.  
  •         but libvirt migrates those value through migrateToURI(),  
  •         so , no need to be called.  

  •         Don't use thread for this method since migration should  
  •         not be started when setting-up filtering rules operations  
  •         are not completed.  

  •         :params instance_ref: nova.db.sqlalchemy.models.Instance object  

  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def unfilter_instance(self, instance, network_info):  
  •         """Stop filtering instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def set_admin_password(self, context, instance_id, new_pass=None):  
  •         """
  •         Set the root password on the specified instance.  

  •         The first parameter is an instance of nova.compute.service.Instance,  
  •         and so the instance is being specified as instance.name. The second  
  •         parameter is the value of the new password.  
  •         """
  •         raise NotImplementedError()  

  •     def inject_file(self, instance, b64_path, b64_contents):  
  •         """在指定的实例上写文件
  •         Writes a file on the specified instance.  

  •         The first parameter is an instance of nova.compute.service.Instance,  
  •         and so the instance is being specified as instance.name. The second  
  •         parameter is the base64-encoded path to which the file is to be  
  •         written on the instance; the third is the contents of the file, also  
  •         base64-encoded.  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def agent_update(self, instance, url, md5hash):  
  •         #在指定的实例中更新代理  
  •         """
  •         Update agent on the specified instance.  

  •         The first parameter is an instance of nova.compute.service.Instance,  
  •         and so the instance is being specified as instance.name. The second  
  •         parameter is the URL of the agent to be fetched and updated on the  
  •         instance; the third is the md5 hash of the file for verification  
  •         purposes.  
  •         """
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def inject_network_info(self, instance, nw_info):  
  •         #为指定的实例注入网络信息  
  •         """inject network info for specified instance"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         pass

  •     def poll_rescued_instances(self, timeout):  
  •         #轮询已经恢复的实例  
  •         """Poll for rescued instances"""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def host_power_action(self, host, action):  
  •         """Reboots, shuts down or powers up the host."""
  •         raise NotImplementedError()  

  •     def set_host_enabled(self, host, enabled):  
  •         #设置指定的主机有能力接受新的实例  
  •         """Sets the specified host's ability to accept new instances."""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def plug_vifs(self, instance, network_info):  
  •         """Plugs in VIFs to networks."""
  •         # TODO(Vek): Need to pass context in for access to auth_token  
  •         raise NotImplementedError()  

  •     def update_host_status(self):  
  •         """Refresh host stats"""
  •         raise NotImplementedError()  

  •     def get_host_stats(self, refresh=False):  
  •         """Return currently known host stats"""
  •         raise NotImplementedError()  

  •     def list_disks(self, instance_name):  
  •         """
  •         Return the IDs of all the virtual disks attached to the specified  
  •         instance, as a list.  These IDs are opaque to the caller (they are  
  •         only useful for giving back to this layer as a parameter to  
  •         disk_stats).  These IDs only need to be unique for a given instance.  

  •         Note that this function takes an instance ID.  
  •         """
  •         raise NotImplementedError()  

  •     def list_interfaces(self, instance_name):  
  •         """
  •         Return the IDs of all the virtual network interfaces attached to the  
  •         specified instance, as a list.  These IDs are opaque to the caller  
  •         (they are only useful for giving back to this layer as a parameter to  
  •         interface_stats).  These IDs only need to be unique for a given  
  •         instance.  

  •         Note that this function takes an instance ID.  
  •         """
  •         raise NotImplementedError()  

  •     def resize(self, instance, flavor):  
  •         """
  •         Resizes/Migrates the specified instance.  

  •         The flavor parameter determines whether or not the instance RAM and  
  •         disk space are modified, and if so, to what size.  
  •         """
  •         raise NotImplementedError()  

  •     def block_stats(self, instance_name, disk_id):  
  •         """
  •         Return performance counters associated with the given disk_id on the  
  •         given instance_name.  These are returned as [rd_req, rd_bytes, wr_req,  
  •         wr_bytes, errs], where rd indicates read, wr indicates write, req is  
  •         the total number of I/O requests made, bytes is the total number of  
  •         bytes transferred, and errs is the number of requests held up due to a  
  •         full pipeline.  

  •         All counters are long integers.  

  •         This method is optional.  On some platforms (e.g. XenAPI) performance  
  •         statistics can be retrieved directly in aggregate form, without Nova  
  •         having to do the aggregation.  On those platforms, this method is  
  •         unused.  

  •         Note that this function takes an instance ID.  
  •         """
  •         raise NotImplementedError()  

  •     def interface_stats(self, instance_name, iface_id):  
  •         """
  •         Return performance counters associated with the given iface_id on the  
  •         given instance_id.  These are returned as [rx_bytes, rx_packets,  
  •         rx_errs, rx_drop, tx_bytes, tx_packets, tx_errs, tx_drop], where rx  
  •         indicates receive, tx indicates transmit, bytes and packets indicate  
  •         the total num
  • ber of bytes or packets transferred, and errs and dropped  
  •         is the total number of packets failed / dropped.  

  •         All counters are long integers.  

  •         This method is optional.  On some platforms (e.g. XenAPI) performance  
  •         statistics can be retrieved directly in aggregate form, without Nova  
  •         having to do the aggregation.  On those platforms, this method is  
  •         unused.  

  •         Note that this function takes an instance ID.  
  •         """
  •         raise NotImplementedError()  


  1:
DSC0000.png

  2:
DSC0001.png

  3: DSC0002.png



4:
4 DSC0003.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-508152-1-1.html 上篇帖子: OpenStack利用puppet构建自动化部署环境 下篇帖子: OpenStack云第二天
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表