2017-05-19 3 views
0

Ich versuche, an Luigi und Openstack zu arbeiten. Während ich die Klasse hauptsächlich anrufe, habe ich Probleme. Ich lerne immer noch Python, aber ich bekomme den Fehler nicht wirklich.<Class> Objekt hat kein Attribut

ERROR: Attribute: ‚OpenstackHelper‘ Objekt hat kein Attribut ‚Server

password = sys.argv[1] 
auth_url = sys.argv[2] 
username = sys.argv[3] 
tenant_name = sys.argv[4] 

class OpenstackHelper(luigi.Task): 
    def requires(self): 
     pass 
    def run(self): 
     self.keystone_auth = v2.Password(username=username, password=password, tenant_name=tenant_name, 
             auth_url=auth_url) 
     self.keystone_session = session.Session(auth=self.keystone_auth) 

     self.cinder = cinder_client.Client(OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME, OS_AUTH_URL, service_type="volume") 
     self.volumes = self.cinder.volumes.list() 

     self.snapshots = self.cinder.volume_snapshots.list() 

     self.nova = client.Client("2.1", session=self.keystone_session) 
     self.servers = self.nova.servers.list() 

     self.kwargs = { 
      'auth_url': auth_url, 
      'session': self.keystone_session, 
      'auth': self.keystone_auth, 
      'service_type': 'orchestration'} 

    def output(self): 
     if sys.argv[5] == 'servers': 
      print(self.servers) 
      return MockFile(self.servers, mirror_on_stderr=True) 
     elif sys.argv[5] == 'volume': 
      return MockFile(self.volumes, mirror_on_stderr=True) 
     elif sys.argv[5] == 'cinder': 
      return MockFile(self.cinder, mirror_on_stderr=True) 

if __name__ == '__main__': 
    luigi.run(["--local-scheduler"],OpenstackHelper()) 

Antwort

1

Können Sie die Zeilennummer/stacktrace sagen, in dem Sie die Fehlermeldung erhalten?

Dieser Fehler bedeutet, dass in Ihrer Klasse keine Variable als "Server" definiert ist. So kann Ihre Ausgabe() Funktion (wo Sie Self.Servers drucken) wird vor der Zeile - Self.servers = Self.nova.servers.list() in run() -Funktion aufgerufen.

+0

Ich habe Fehler bei print (self.servers) innerhalb der Ausgabefunktion –

+0

In Luigi, output() wird zuerst ausgeführt, um zu überprüfen, ob die Ausgabe bereits vorhanden ist, so dass die Aufgabe run() in diesem Fall nicht ausgeführt wird. – MattMcKnight

+0

@MattMcKnight Aber ich rufe luigi.run zuerst an. Wie ich es verstehe, sollte luigi.run nicht zuerst ausgelöst werden und dann Funktion ausgeben? Oder ist es, dass Luigi die Ausgabe zuerst überprüft, um zu sehen, ob die Ausgabe bereits existiert, in welchem ​​Fall es nicht stören würde, Lauffunktion zu laufen. –

Verwandte Themen