def _fix_new_machine_forked(machine_request, provider, new_machine):
    app_uuid = _generate_app_uuid(new_machine.identifier)
    if not machine_request.new_machine_forked:
        return False
    if Application.objects.filter(uuid=app_uuid).count():
        return False
    print "OK: This MachineRequest: %s has a BAD Application." \
      "\tUUID should be %s." % (machine_request, app_uuid)
    old_application = new_machine.application
    current_application = _create_new_application(machine_request,
                                                  new_machine.identifier)

    remaining_machines = old_application._current_machines()
    for machine in remaining_machines:
        if machine.identifier == new_machine.identifier:
            new_machine.application = current_application
            new_machine.save()
    current_application.save()
    # Pass #2 - If remaining, unmatched ids:
    remaining_machines = old_application._current_machines()

    acct_provider = machine_request.new_machine_provider
    accounts = get_account_driver(acct_provider)

    if remaining_machines:
        print "Warn: These machines likely point to the wrong application.:%s" % remaining_machines
        for machine in remaining_machines:
            glance_image = accounts.image_manager.get_image(machine.identifier)
            if glance_image:
                original_request = MachineRequest.objects.filter(
                    new_machine_name=glance_image.name)
                print "Hint: Image_ID:%s Named:%s MachineRequest:%s" % (
                    glance_image.id, glance_image.name, original_request)

    return True
def _fix_new_machine_forked(machine_request, provider, new_machine):
    app_uuid = _generate_app_uuid(new_machine.identifier)
    if not machine_request.new_machine_forked:
        return False
    if Application.objects.filter(uuid=app_uuid).count():
        return False
    print "OK: This MachineRequest: %s has a BAD Application." \
      "\tUUID should be %s." % (machine_request, app_uuid)
    old_application = new_machine.application
    current_application = _create_new_application(machine_request, new_machine.identifier)

    remaining_machines = old_application._current_machines()
    for machine in remaining_machines:
        if machine.identifier == new_machine.identifier:
            new_machine.application = current_application
            new_machine.save()
    current_application.save()
    # Pass #2 - If remaining, unmatched ids:
    remaining_machines = old_application._current_machines()

    acct_provider = machine_request.new_machine_provider
    accounts = get_account_driver(acct_provider)

    if remaining_machines:
        print "Warn: These machines likely point to the wrong application.:%s" % remaining_machines
        for machine in remaining_machines:
            glance_image = accounts.image_manager.get_image(machine.identifier)
            if glance_image:
                original_request = MachineRequest.objects.filter(new_machine_name=glance_image.name)
                print "Hint: Image_ID:%s Named:%s MachineRequest:%s" % (glance_image.id, glance_image.name, original_request)

    return True
def fix_images(provider, images=[]):
    accounts = get_account_driver(provider)
    for image_id in images:
        glance_image = accounts.image_manager.get_image(image_id)
        if not glance_image:
            print "ERROR: Image %s does not exist." % image_id
            break
        try:
            #NOTE: Will need to change provider query when migrating to DD and beyond
            #pm = ProviderMachine.objects.get(instancesource_ptr__provider=provider, instancesource_ptr__identifier=image_id)
            pm = ProviderMachine.objects.get(provider=provider,
                                             identifier=image_id)
        except ProviderMachine.DoesNotExist:
            print "Error: NO ProviderMachine for Provider:%s Image ID:%s" % (
                provider, image_id)
            break
        #It's a real image. It SHOULD have a corresponding machine request
        try:
            mr = MachineRequest.objects.get(new_machine__identifier=image_id)
        except MachineRequest.DoesNotExist:
            print "Warn: MachineRequest by this ID could not be found"
            mr = None
        current_application = pm.application
        uuid = _generate_app_uuid(image_id)
        try:
            original_application = Application.objects.get(uuid=uuid)
        except Application.DoesNotExist:
            print "ProviderMachine %s is an update to Application: %s" % (
                pm, current_application)
            print "Creating seperate Application for ProviderMachine %s" % pm
            original_application = _create_new_application(mr, image_id)
        # Update Application from MachineRequest information
        if mr:
            original_application = _update_application(original_application,
                                                       mr)

        if original_application.uuid is not current_application.uuid:
            pm.application = original_application
            pm.save()

        # Write to metadata INCLUDING kernel and ramdisk id!
        fix_image_metadata(accounts, glance_image, original_application, mr)
def fix_images(provider, images=[]):
    accounts = get_account_driver(provider)
    for image_id in images:
        glance_image = accounts.image_manager.get_image(image_id)
        if not glance_image:
            print "ERROR: Image %s does not exist." % image_id
            break
        try:
            #NOTE: Will need to change provider query when migrating to DD and beyond
            #pm = ProviderMachine.objects.get(instancesource_ptr__provider=provider, instancesource_ptr__identifier=image_id)
            pm = ProviderMachine.objects.get(provider=provider, identifier=image_id)
        except ProviderMachine.DoesNotExist:
            print "Error: NO ProviderMachine for Provider:%s Image ID:%s" % (provider, image_id)
            break
        #It's a real image. It SHOULD have a corresponding machine request
        try:
            mr = MachineRequest.objects.get(new_machine__identifier=image_id)
        except MachineRequest.DoesNotExist:
            print "Warn: MachineRequest by this ID could not be found"
            mr = None
        current_application = pm.application
        uuid = _generate_app_uuid(image_id)
        try:
            original_application = Application.objects.get(uuid=uuid)
        except Application.DoesNotExist:
            print "ProviderMachine %s is an update to Application: %s" % (pm, current_application)
            print "Creating seperate Application for ProviderMachine %s" % pm
            original_application = _create_new_application(mr, image_id)
        # Update Application from MachineRequest information
        if mr:
            original_application = _update_application(original_application, mr)

        if original_application.uuid is not current_application.uuid:
            pm.application = original_application
            pm.save()

        # Write to metadata INCLUDING kernel and ramdisk id!
        fix_image_metadata(accounts, glance_image, original_application, mr)