2017-07-08 5 views
0

Ich habe folgende Bedingungen 1. stackCreate 2. stackUpdate 3. stackCreateWie der Stapelstatus in Openstack fangen

Was ich versuche zu tun, während die stackCreate/Update/Löschen ausgelöst wird, I müssen den Fortschritt überprüfen. Wie kann ich das machen? Ich kenne 2 Wege 1. openstack Stapel Ereignisliste. 2. Ich habe unter Python-Code.

stack_id = str(hc.stacks.get(stack_name).id) 
        hc.stacks.delete(stack_id=stack_id) 
        try: 
         evntsdata = hc.events.list(stack_name)[0].to_dict() 
         event_handle = evntsdata['resource_status'] 
         if event_handle == 'DELETE_IN_PROGRESS': 
          loopcontinue = True 
          while loopcontinue: 
           evntsdata = hc.events.list(stack_name)[0].to_dict() 
           event_handle = evntsdata['resource_status'] 

           if event_handle == 'DELETE_COMPLETE': 
            loopcontinue = False 
            print(str(timestamp()) + " " + "Delete is Completed!") 
           elif event_handle == 'DELETE_FAILED': 
            print("Failed") # this needs a proper error msg 
            sys.exit(0) 
           else: 
            print(str(timestamp()) + " " + "Delete in Progress!") 
            time.sleep(5) 
         elif event_handle == 'DELETE_COMPLETE': 
          print(str(timestamp()) + " " + "Delete is Completed!") 
          sys.exit(0) 
         elif event_handle == 'DELETE_FAILED': 
          print("Failed") 
          sys.exit(0) 
        except AttributeError as e: 
         print(str(timestamp()) + " " + "ERROR: Stack Delete Failure") 
         raise 
       except (RuntimeError, heatclient.exc.NotFound): 
        print("Stack doesnt exist:", stack_name) 

Die erste Methode ist Shell-Befehl, in dem ich nicht sehr gut bin. (oder lässt sagen, dass ich nicht weiß, wie man den Shellbefehl in Python am besten integriert) Das Problem mit beiden Methoden ist, dass ich diese vielen Schritte setze, um zu identifizieren, ob das Stapellöschen erfolgreich ist. Und ich wiederhole dasselbe für stackupdate und create, was nicht die beste Praxis ist, die ich denke. Hat jemand eine Idee, wie ich diese Logik minimieren kann? Jede Hilfe wird sehr geschätzt.

Antwort

0

Ich arbeitete es mit unten für jetzt. Es ist nicht das Beste, was ich denke, sondern erfüllt, was ich tun muss.

def stackStatus(status): 
    evntsdata = hc.events.list(stack_name)[0].to_dict() 
    event_handle = evntsdata['resource_status'].split("_") 
    event_handle = '_'.join(event_handle[1:]) 
    if event_handle == 'IN_PROGRESS': 
     loopcontinue = True 
     while loopcontinue: 
      evntsdata = hc.events.list(stack_name)[0].to_dict() 
      event_handle = evntsdata['resource_status'].split("_") 
      event_handle = '_'.join(event_handle[1:]) 
      if event_handle == 'COMPLETE': 
       loopcontinue = False 
       print(str(timestamp()) + status + " IS COMPLETED!") 
      elif event_handle == 'FAILED': 
       print("Failed") 
       exit(1) 
      else: 
       print(str(timestamp()) + status + " IN PROGRESS!") 
       time.sleep(5) 

Rufen Sie diese Funktion

stackStatus("DELETE") 
stackStatus("CREATE") 
stackStatus("UPDATE") 
0

Sie können einfache Funktionen schreiben, um Stapel zu erstellen/aktualisieren/löschen und auch um den Status des Stapels zu überprüfen.

Überprüfen Sie den folgenden Beispielcode, um einen Stapel zu erstellen und den Status des Stapels abzufragen.

from keystoneauth1 import loading 
from keystoneauth1 import session 
from heatclient import client 


tenant_id = 'ab3fd9ca29e149acb25161ec8053da9c' 
heat_url = 'http://10.26.12.31:8004/v1/%s' % tenant_id 
auth_token = 'gAAAAABZYxfjz88XNXnfoCPkNLVeVtqtJ9o8qEtgFhI2GJ-ewSCuiypdwt3K5evgQeICVRqMa2jXgzVlENAUB19ZNyQfVCxSX4_lMBKyChM76SGuQUP8U-xJ9EKIfFaVwRGBkk4Ow9OO-iNINfMs0B5-LzJvxTFybi8yZw4EiagQpNpfu1onYfc' 
heat = client.Client('1', endpoint=heat_url, token=auth_token) 


def create_stack(stack_file_path, stack_name, parameters=None): 
    template = open(stack_file_path) 
    if parameters: 
     stack = heat.stacks.create(stack_name=stack_name, template=template.read(), parameters=parameters) 
    else: 
     stack = heat.stacks.create(stack_name=stack_name, template=template.read()) 
    template.close() 
    return stack 


def get_stack_status(stack_id): 
    stack = heat.stacks.get(stack_id) 
    return stack.stack_status 


def poll_stack_status(stack_id, poll_time=5): 
    stack_status = get_stack_status(stack_id) 
    while stack_status != 'CREATE_COMPLETE': 
     if stack_status == 'CREATE_FAILED': 
      return 1 
     time.sleep(poll_time) 
     stack_status = get_stack_status(stack_id) 
    return 0  
+0

ich immer noch diese lange finden. Ich dachte daran, auf check_output (["openstack", "stack", "event", "list", stack_name]) zu loopen. –

+0

Sie können "openstack stack show -f Wert -c stack_status " – Tejaswi

+0

Das ist immer noch nicht gut weil es nicht den Status durchläuft, der sich ständig ändert. –