def get_or_create_pod(self, pod_request_obj: k8s.V1Pod, context): if self.reattach_on_restart: pod = self.find_pod(self.namespace or pod_request_obj.metadata.namespace, context=context) if pod: return pod self.log.debug("Starting pod:\n%s", yaml.safe_dump(pod_request_obj.to_dict())) self.pod_manager.create_pod(pod=pod_request_obj) return pod_request_obj
def create_new_pod_for_operator( self, labels, launcher) -> Tuple[State, k8s.V1Pod, Optional[str]]: """ Creates a new pod and monitors for duration of task :param labels: labels used to track pod :param launcher: pod launcher that will manage launching and monitoring pods :return: """ self.log.debug( "Adding KubernetesPodOperator labels to pod before launch for task %s", self.task_id) # Merge Pod Identifying labels with labels passed to operator self.pod.metadata.labels.update(labels) # Add Airflow Version to the label # And a label to identify that pod is launched by KubernetesPodOperator self.pod.metadata.labels.update({ 'airflow_version': airflow_version.replace('+', '-'), 'kubernetes_pod_operator': 'True', }) self.log.debug("Starting pod:\n%s", yaml.safe_dump(self.pod.to_dict())) final_state = None try: launcher.start_pod(self.pod, startup_timeout=self.startup_timeout_seconds) final_state, remote_pod, result = launcher.monitor_pod( pod=self.pod, get_logs=self.get_logs) except AirflowException: if self.log_events_on_failure: for event in launcher.read_pod_events(self.pod).items: self.log.error("Pod Event: %s - %s", event.reason, event.message) raise finally: if self.is_delete_operator_pod: self.log.debug("Deleting pod for task %s", self.task_id) launcher.delete_pod(self.pod) elif final_state != State.SUCCESS: self.patch_already_checked(self.pod) return final_state, remote_pod, result