Example #1
0
 def get_resource_api(api_client: client.ApiClient = None,
                      **kwargs) -> "client.EventsV1Api":
     """
     Returns an instance of the kubernetes API client associated with
     this object.
     """
     if api_client:
         kwargs["apl_client"] = api_client
     return client.EventsV1Api(**kwargs)
Example #2
0
    def create_application_deployment(
        self,
        namespace: str,
        project: Project,
        track: str,
    ) -> None:
        pod_events: str = ""
        helm_path = self.get_helm_path()
        values = self.get_application_deployment_values(
            namespace=namespace,
            project=project,
            track=track,
        )

        application_labels = {
            "deploymentTime": values["deployment"]["timestamp"],
            "release": project.deploy_name,
            "track": track,
        }
        log_collector = KubeLoggerThread(
            labels=application_labels,
            namespace=namespace,
        )

        with settings.plugin_manager.lifecycle.project_deployment(
            namespace=namespace, project=project, track=track
        ):
            log_collector.start()
            result = self.helm.upgrade_chart(
                chart_path=helm_path,
                name=project.deploy_name,
                namespace=namespace,
                values=values,
                raise_exception=False,
            )
            try:
                v1 = k8s_client.EventsV1Api(self.client)
                response: EventsV1EventList = v1.list_namespaced_event(namespace)
                events: List[List[str]] = []
                event: EventsV1Event
                for event in response.items:
                    events.append(
                        [
                            event.deprecated_first_timestamp.strftime("%H:%M:%S"),
                            f"{event.regarding.kind}/{event.regarding.name}",
                            event.reason,
                            event.note,
                        ]
                    )
                pod_events = tabulate(
                    events,
                    headers=["Timestamp", "Object", "Reason", "Message"],
                    tablefmt="orgtbl",
                )

            except ApiException as e:
                logger.debug(
                    "Exception when calling EventsV1beta1Api->list_namespaced_event: %s\n"
                    % e
                )
            except Exception as e:
                logger.debug("Getting events failed, ignoring: %s\n" % e)

            log_collector.stop()

            if result.return_code:
                logger.info(
                    icon=f"{self.ICON} 🏷️",
                    title="Deployment values (without environment vars):",
                )
                for line in yaml.dump(values).split("\n"):
                    logger.info(message=f"\t{line}")

                status = self.status(namespace=namespace, labels=application_labels)
                logger.info(message=str(status))

                logger.info(
                    icon=f"{self.ICON}  📋️️ ",
                    title="Getting events for resource: ",
                )

                logger.info(pod_events)

                logger.info(
                    icon=f"{self.ICON}  📋️️ ",
                    title="Getting logs for resource: ",
                )
                with log_collector.log_path.open() as f:
                    for line in f:
                        logger.info(line, end="")

                raise DeploymentFailed()

        if not settings.K8S_INGRESS_DISABLED:
            logger.info(
                icon=f"{self.ICON}  📄",
                title=f"Deployment can be accessed via {project.url}",
            )