"""Integration test for gh-671.

Verify that on Azure that if a default user and password are specified
through the Azure API that a change in the default password overwrites
the old password
"""

import crypt

import pytest

from tests.integration_tests.clouds import IntegrationCloud

OLD_PASSWORD = 'DoIM33tTheComplexityRequirements!??'
NEW_PASSWORD = 'DoIM33tTheComplexityRequirementsNow!??'


def _check_password(instance, unhashed_password):
    shadow_password = instance.execute('getent shadow ubuntu').split(':')[1]
    salt = shadow_password.rsplit('$', 1)[0]
    hashed_password = crypt.crypt(unhashed_password, salt)
    assert shadow_password == hashed_password


@pytest.mark.azure
@pytest.mark.sru_2020_11
def test_update_default_password(setup_image, session_cloud: IntegrationCloud):
    os_profile = {
        'os_profile': {
            'admin_password': '',
            'linux_configuration': {
                'disable_password_authentication': False
            }
        }
    }
    os_profile['os_profile']['admin_password'] = OLD_PASSWORD
    instance1 = session_cloud.launch(launch_kwargs={'vm_params': os_profile})

    _check_password(instance1, OLD_PASSWORD)

    snapshot_id = instance1.cloud.cloud_instance.snapshot(
        instance1.instance,
        delete_provisioned_user=False
    )

    os_profile['os_profile']['admin_password'] = NEW_PASSWORD
    try:
        with session_cloud.launch(launch_kwargs={
            'image_id': snapshot_id,
            'vm_params': os_profile,
        }) as instance2:
            _check_password(instance2, NEW_PASSWORD)
    finally:
        session_cloud.cloud_instance.delete_image(snapshot_id)
        instance1.destroy()
