AttributeError: 'ManagerWithFind'类型没有属性'client

0 投票
1 回答
976 浏览
提问于 2025-04-18 13:47

我刚接触Python和OpenStack,所以请不要生气哦 :)

我在尝试创建一个BareMetalNodeManager类的对象(这个类在np_orchestration.py文件里)。

np_orchestration.py

from baremetal import BareMetalNodeManager
from novaclient import base

class np_orchestration:
    def provisionNodes(self):
        obj = BareMetalNodeManager(base.ManagerWithFind);
        var =        obj.create(self,"192.168.XXX.XXX",1,514,1,"00:0C:29:XX:XX:XX","192.168.XXX.XXX","XXXX","XXXX")
        print var

obj = np_orchestration()
obj.provisionNodes()

这个类(在baremetal.py文件中)需要一个叫做base.ManagerWithFind的参数(这是一个抽象类)。

baremetal.py

class BareMetalNodeManager(base.ManagerWithFind):
"""
Manage :class:`BareMetalNode` resources.
"""
resource_class = BareMetalNode

def create(self,
           service_host,
           cpus,
           memory_mb,
           local_gb,
           prov_mac_address,
           pm_address=None,
           pm_user=None,
           pm_password=None,
           terminal_port=None):
    """
    Create a baremetal node.

    :param service_host: Name of controlling compute host
    :param cpus: Number of CPUs in the node
    :param memory_mb: Megabytes of RAM in the node
    :param local_gb: Gigabytes of local storage in the node
    :param pm_address: Power management IP for the node
    :param pm_user: Username for the node's power management
    :param pm_password: Password for the node's power management
    :param prov_mac_address: MAC address to provision the node
    :param terminal_port: ShellInABox port
    :rtype: :class:`BareMetalNode`
    """
    body = {'node': {'service_host': service_host,
                    'cpus': cpus,
                    'memory_mb': memory_mb,
                    'local_gb': local_gb,
                    'pm_address': pm_address,
                    'pm_user': pm_user,
                    'pm_password': pm_password,
                    'prov_mac_address': prov_mac_address,
                    'terminal_port': terminal_port}}

    return self._create('/os-baremetal-nodes', body, 'node')

当我尝试这样做时,出现了以下错误:

farooqui@ubuntu:/projects/kenobi$ python np_orchestration.py
Traceback (most recent call last):
File "np_orchestration.py", line 15, in <module>
obj.provisionNodes()
File "np_orchestration.py", line 11, in provisionNodes
var = obj.create(self,"192.168.42.134",1,514,1,"00:0C:29:CF:E6:D9","192.168.42.225","admin","abc")
File "/projects/kenobi/baremetal.py", line 82, in create
return self._create('/os-baremetal-nodes', body, 'node')
File "/opt/stack/python-novaclient/novaclient/base.py", line 100, in _create
_resp, body = self.api.client.post(url, body=body)
AttributeError: type object 'ManagerWithFind' has no attribute 'client'
farooqui@ubuntu:/projects/kenobi$ 

baremetal.py的完整版本可以在这里找到: https://github.com/openstack/python-novaclient/blob/master/novaclient/v1_1/contrib/baremetal.py

1 个回答

1

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续运行。

比如说,你可能希望在用户输入正确的密码后,才能让他们访问某个页面。这个过程就需要用到条件判断。简单来说,条件判断就是检查某个条件是否成立,如果成立就执行某个操作,不成立就执行另一个操作。

在代码中,条件判断通常用“if”这个词来表示。你可以想象成一个问句:如果这个条件是对的,那么就做某件事;如果不对,就做另一件事。

这样一来,程序就能根据不同的情况做出不同的反应,让它变得更加智能和灵活。

import json
from baremetal import BareMetalNodeManager
from novaclient import base, client
import os

config_file = open('config.json')
config_data = json.load(config_file)

class np_orchestration:

    def __init__(self):
        self.os_auth_url = config_data["config"]["OS_AUTH_URL"]
        self.os_username = config_data["config"]["OS_USER"]
        self.os_password = config_data["config"]["OS_PASSWORD"]
        self.os_tenant_name = config_data["config"]["OS_TENANT_NAME"]
        self.os_tenant_id = config_data["config"]["OS_TENANT_ID"]
        self.client = client._construct_http_client(self.os_username, self.os_password, project_id=None,
                           auth_url= self.os_auth_url, endpoint_type='publicURL',
                           service_type='compute',
                           auth_system='keystone', auth_plugin=None,
                           auth_token=None, cacert=None, tenant_id= self.os_tenant_id)

     def provisionNodes(self):
        obj = BareMetalNodeManager(self);
        var = obj.create(self,"192.168.XXX.XXX",1,514,1,"00:0C:29:XX:XX:XX","192.168.XXX.XXX","XXXX","XXXX")
        print var

obj = np_orchestration()
obj.provisionNodes()

撰写回答