Example #1
0
def bash_script(
    script=None,
    check_retcode=0,
    cwd=None,
    env=None,
    dbnd_env=True,
    output_encoding="utf-8",
    popen_kwargs=None,
):
    # type:( str, Optional[int],str, Dict[str,str], bool, str, Dict[str,Any]) -> int

    # we need a working folder to create bash script
    task_run = try_get_current_task_run()
    if task_run:
        script_dir = str(task_run.local_task_run_root)
    else:
        script_dir = None

    bash_script_path = os.path.join(script_dir, "bash_cmd.sh")
    with open(bash_script_path, "wb") as bs:
        bs.write(bytes(script, "utf_8"))

    log_metric("bash_script", bash_script_path)

    logger.info("Bash script location: %s", bash_script_path)
    args = ["bash", bash_script_path]
    return bash_cmd.func(
        args=args,
        check_retcode=check_retcode,
        cwd=cwd or script_dir,
        env=env,
        dbnd_env=dbnd_env,
        output_encoding=output_encoding,
        popen_kwargs=popen_kwargs,
    )
Example #2
0
def log_operator_result(task_run, result, operator, track_xcom):
    _log_result(task_run, result)

    # after airflow runs the operator it xcom_push the result, so we log it
    if track_xcom and operator.do_xcom_push and result is not None:
        from airflow.models import XCOM_RETURN_KEY

        log_metric(key=XCOM_RETURN_KEY, value=result)
Example #3
0
def t_f_a(t_input, t_param, t_default="d1"):
    # type: (DataList[str], str, str) -> DataList[str]
    # adds dressing
    assert t_default == "d1"
    assert t_param == "d2"

    log_metric("t_input", len(t_input))

    logger.info("Got string: %s", t_input)
    return t_input[:2]
Example #4
0
def operation_int(input_a,
                  input_b=0,
                  pause=0.0,
                  log_metrics=True,
                  external_resources=0):
    # type: (int, int, float, bool, int) -> int
    if log_metrics:
        log_metric("input_a", input_a)
        log_metric("input_b", input_b)

    tr = current_task_run()
    for i in range(external_resources):
        tr.set_external_resource_urls(
            {"url_%s_%d" % (tr.task.task_id, i): "http://localhost"})
    if pause:
        sleep(pause)
    return input_a + input_b
Example #5
0
def prepare_docker_for_executor(run, docker_engine):
    if docker_engine.container_tag:
        logger.info(
            "Omitting docker build due to existing container_tag=%s",
            docker_engine.container_tag,
        )
        log_metric("container_tag", docker_engine.container_tag)
        return None

    config_cls = docker_engine.__class__  # type: Type[ContainerEngineConfig]

    def _set_config(parameter, value):
        # set value in already existing object
        setattr(docker_engine, parameter.name, value)
        dbnd_config.set_parameter(parameter,
                                  override(value),
                                  source="prepare_docker_for_executor")

    if docker_engine.docker_build:
        if docker_engine.docker_build_tag:
            auto_tag = docker_engine.docker_build_tag
        else:
            auto_tag = docker_engine.docker_build_tag_base + "_" + CURRENT_TIME_STR
        _set_config(config_cls.container_tag, auto_tag)

        if (isinstance(docker_engine, KubernetesEngineConfig)
                and not docker_engine.docker_build_push):
            _set_config(config_cls.image_pull_policy, "Never")

        log_metric("docker build tag", auto_tag)
        log_metric("container_tag", auto_tag)
        docker_build = DockerBuild(
            task_name="dbnd_image_build",
            image_name=docker_engine.container_repository,
            tag=docker_engine.container_tag,
            push=docker_engine.docker_build_push,
            task_version="now",
            task_is_system=True,
        )

        run.run_dynamic_task(docker_build)
        pm.hook.dbnd_build_project_docker(docker_engine=docker_engine,
                                          docker_build_task=docker_build)

        return docker_build
    else:
        logger.info("Omitting docker build due to docker_build=False")
        if not docker_engine.container_tag:
            raise no_tag_on_no_build()
    return None
 def write_metrics(a=5):
     log_metric("t_f", a)
 def t_f_metric(a=5):
     log_metric("t_f", a)
Example #8
0
def dbnd_sanity_check(check_time=datetime.datetime.now()):
    # type: ( datetime.datetime)-> str
    logger.info("Running Sanity Check!")
    log_metric("Happiness Level", "High")
    logger.info("Your system is good to go! Enjoy Databand!")
    return "Databand checked at %s" % check_time
def create_model(y_input="y"):
    logger.info("Running %s -> operation_y", y_input)
    log_metric("a", 1)
    return "{} -> operation_y".format(y_input)
Example #10
0
def log_metrics(param="param"):
    log_metric("param", param)
    log_metric("string_metrics", "Pi")
    log_metric("float_metric", 3.14159265359)
    log_metric("int_metric", 0)
Example #11
0
def init_acc_int(input=0):
    # type: (int) -> int
    log_metric("input", input)
    return input
Example #12
0
    def execute(self, context):
        self.log.info("Starting docker container from image %s", self.image)

        tls_config = self.__get_tls_config()

        if self.docker_conn_id:
            self.cli = self.get_hook().get_conn()
        else:
            self.cli = APIClient(base_url=self.docker_url,
                                 version=self.api_version,
                                 tls=tls_config)

        if self.force_pull or len(self.cli.images(name=self.image)) == 0:
            for l in self.cli.pull(self.image, stream=True):
                try:
                    output = json.loads(l.decode("utf-8").strip())
                    if "status" in output:
                        self.log.info("%s", output["status"])
                except Exception:
                    self.log.info("Failed to parse docker pull status")

        # with TemporaryDirectory(prefix='airflowtmp') as host_tmp_dir:
        #     self.environment['AIRFLOW_TMP_DIR'] = self.tmp_dir
        #     self.volumes.append('{0}:{1}'.format(host_tmp_dir, self.tmp_dir))

        self.container = self.cli.create_container(
            command=self.get_command(),
            environment=self.environment,
            host_config=self.cli.create_host_config(
                auto_remove=self.auto_remove,
                binds=self.volumes,
                network_mode=self.network_mode,
                shm_size=self.shm_size,
                dns=self.dns,
                dns_search=self.dns_search,
                cpu_shares=int(round(self.cpus * 1024)),
                mem_limit=self.mem_limit,
            ),
            image=self.image,
            user=self.user,
            working_dir=self.working_dir,
        )
        self.cli.start(self.container["Id"])

        log_metric("docker id", self.container["Id"])
        line = ""
        for line in self.cli.logs(container=self.container["Id"], stream=True):
            line = line.strip()
            if hasattr(line, "decode"):
                line = line.decode("utf-8")
            self.log.info(line)

        result = self.cli.wait(self.container["Id"])

        log_metric("docker status code", result["StatusCode"])
        if result["StatusCode"] != 0:
            raise AirflowException("docker container failed: " + repr(result))

        if self.xcom_push_flag:
            return (self.cli.logs(container=self.container["Id"])
                    if self.xcom_all else str(line))