def test_before_deploy(self):
     self.patch_object(lc_before_deploy, 'run_before_deploy_list')
     mock1 = mock.MagicMock()
     mock2 = mock.MagicMock()
     lc_before_deploy.before_deploy('modelname', [mock1, mock2])
     self.run_before_deploy_list.assert_called_once_with([mock1, mock2])
Beispiel #2
0
def run_env_deployment(env_deployment,
                       keep_model=False,
                       force=False,
                       test_directory=None):
    """Run the environment deployment.

    :param env_deployment: Environment Deploy to execute.
    :type env_deployment: utils.EnvironmentDeploy
    :param keep_model: Whether to destroy models at end of run
    :type keep_model: boolean
    :param force: Pass the force parameter if True
    :type force: Boolean
    :param test_directory: Set the directory containing tests.yaml and bundles.
    :type test_directory: str
    """
    config_steps = utils.get_config_steps()
    test_steps = utils.get_test_steps()
    before_deploy_steps = utils.get_before_deploy_steps()

    model_aliases = {
        model_deploy.model_alias: model_deploy.model_name
        for model_deploy in env_deployment.model_deploys
    }
    zaza.model.set_juju_model_aliases(model_aliases)

    for deployment in env_deployment.model_deploys:
        prepare.prepare(deployment.model_name, test_directory=test_directory)

    force = force or utils.is_config_deploy_forced_for_bundle(
        deployment.bundle)

    for deployment in env_deployment.model_deploys:
        # Before deploy
        before_deploy.before_deploy(deployment.model_name,
                                    before_deploy_steps.get(
                                        deployment.model_alias, []),
                                    test_directory=test_directory)

    try:
        for deployment in env_deployment.model_deploys:
            deploy.deploy(os.path.join(utils.get_bundle_dir(),
                                       '{}.yaml'.format(deployment.bundle)),
                          deployment.model_name,
                          model_ctxt=model_aliases,
                          force=force,
                          test_directory=test_directory)

        # When deploying bundles with cross model relations, hooks may be
        # triggered in already deployedi models so wait for all models to
        # settle.
        for deployment in env_deployment.model_deploys:
            logging.info("Waiting for {} to settle".format(
                deployment.model_name))
            zaza.model.block_until_all_units_idle(
                model_name=deployment.model_name)

        for deployment in env_deployment.model_deploys:
            configure.configure(deployment.model_name,
                                config_steps.get(deployment.model_alias, []),
                                test_directory=test_directory)

        for deployment in env_deployment.model_deploys:
            test.test(deployment.model_name,
                      test_steps.get(deployment.model_alias, []),
                      test_directory=test_directory)

    except zaza.model.ModelTimeout:
        failure_report(model_aliases, show_juju_status=True)
        raise

    except Exception:
        failure_report(model_aliases)
        raise

    # Destroy
    # Keep the model from the last run if keep_model is true, this is to
    # maintian compat with osci and should change when the zaza collect
    # functions take over from osci for artifact collection.
    if not keep_model:
        for model_name in model_aliases.values():
            destroy.destroy(model_name)
    zaza.model.unset_juju_model_aliases()
def run_env_deployment(env_deployment, keep_model=DESTROY_MODEL, force=False,
                       test_directory=None):
    """Run the environment deployment.

    :param env_deployment: Environment Deploy to execute.
    :type env_deployment: utils.EnvironmentDeploy
    :param keep_model: Whether to destroy model at end of run
    :type keep_model: int
    :param force: Pass the force parameter if True
    :type force: Boolean
    :param test_directory: Set the directory containing tests.yaml and bundles.
    :type test_directory: str
    """
    config_steps = utils.get_config_steps()
    test_steps = utils.get_test_steps()
    before_deploy_steps = utils.get_before_deploy_steps()

    model_aliases = {model_deploy.model_alias: model_deploy.model_name
                     for model_deploy in env_deployment.model_deploys}
    zaza.model.set_juju_model_aliases(model_aliases)

    for deployment in env_deployment.model_deploys:
        prepare.prepare(
            deployment.model_name,
            test_directory=test_directory)

    for deployment in env_deployment.model_deploys:
        # Before deploy
        before_deploy.before_deploy(
            deployment.model_name,
            before_deploy_steps.get(deployment.model_alias, []),
            test_directory=test_directory)

    try:
        for deployment in env_deployment.model_deploys:
            force_ = force or utils.is_config_deploy_forced_for_bundle(
                deployment.bundle)

            deploy.deploy(
                os.path.join(
                    utils.get_bundle_dir(),
                    '{}.yaml'.format(deployment.bundle)),
                deployment.model_name,
                model_ctxt=model_aliases,
                force=force_,
                test_directory=test_directory)

        # When deploying bundles with cross model relations, hooks may be
        # triggered in already deployedi models so wait for all models to
        # settle.
        for deployment in env_deployment.model_deploys:
            logging.info("Waiting for {} to settle".format(
                deployment.model_name))
            with notify_around(NotifyEvents.WAIT_MODEL_SETTLE,
                               model_name=deployment.model_name):
                zaza.model.block_until_all_units_idle(
                    model_name=deployment.model_name)

        for deployment in env_deployment.model_deploys:
            configure.configure(
                deployment.model_name,
                config_steps.get(deployment.model_alias, []),
                test_directory=test_directory)

        for deployment in env_deployment.model_deploys:
            test.test(
                deployment.model_name,
                test_steps.get(deployment.model_alias, []),
                test_directory=test_directory)

    except zaza.model.ModelTimeout:
        failure_report(model_aliases, show_juju_status=True)
        # Destroy models that were not healthy before TEST_DEPLOY_TIMEOUT
        # was reached (default: 3600s)
        if keep_model == DESTROY_MODEL:
            destroy_models(model_aliases, destroy)
        raise
    except Exception:
        failure_report(model_aliases)
        # Destroy models that raised any other exception.
        # Note(aluria): KeyboardInterrupt will be raised on underlying libs,
        # and other signals (e.g. SIGTERM) will also miss this handler
        # In those cases, models will have to be manually destroyed
        if keep_model == DESTROY_MODEL:
            destroy_models(model_aliases, destroy)
        raise

    # Destroy successful models if --keep-model is not defined
    if keep_model in [DESTROY_MODEL, KEEP_FAULTY_MODEL]:
        destroy_models(model_aliases, destroy)