diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f774b84d05..e085749b68 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ # Contributing to Flyte -For information related to contributing to Flyte, please check out the [Contributing to Flyte](https://docs.flyte.org/en/latest/community/contribute.html) section of the documentation at the Flyte site. +For information related to contributing to Flyte, please check out the [Contributing to Flyte](https://docs.flyte.org/en/latest/community/contribute.html) section of the documentation. diff --git a/Makefile b/Makefile index 290669ef0e..6acccb1452 100644 --- a/Makefile +++ b/Makefile @@ -56,10 +56,6 @@ install-piptools: ## Install pip-tools doc-requirements.txt: doc-requirements.in install-piptools $(call PIP_COMPILE,doc-requirements.in) -.PHONY: requirements.txt -requirements.txt: requirements.in install-piptools - $(call PIP_COMPILE,requirements.in) - .PHONY: stats stats: @generate-dashboard -o deployment/stats/prometheus/flytepropeller-dashboard.json stats/flytepropeller_dashboard.py diff --git a/NOTICE b/NOTICE deleted file mode 100644 index 43f19fee61..0000000000 --- a/NOTICE +++ /dev/null @@ -1,4 +0,0 @@ -flyte -Copyright 2019 Lyft Inc. - -This product includes software developed at Lyft Inc. diff --git a/README.md b/README.md index ac2a7a314f..5904b608a3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -

Flyte and LF AI & Data Logo

@@ -8,338 +7,130 @@

- ๐Ÿ’ป ๐Ÿ›ณ ๐Ÿš€ + ๐Ÿ—๏ธ ๐Ÿš€ ๐Ÿ“ˆ

- -Code. Ship. Scale. - + + Build. Deploy. Scale. +

-

- Flyte is a workflow automation platform for complex, mission-critical data, and ML processes at scale -

+Flyte is an **open-source orchestrator** that facilitates building production-grade data and ML pipelines. It is built for scalability and reproducibility, leveraging Kubernetes as its underlying platform. With Flyte, user teams can construct pipelines using the Python SDK, and seamlessly deploy them on both cloud and on-premises environments, enabling distributed processing and efficient resource utilization.

- Current Release + Current Release - Sandbox Build + Sandbox Status - End-to-End Tests + Test Status - License - - Commit Activity - - Commits since Last Release - - GitHub Milestones Completed - - GitHub Next Milestone Percentage - - Docs + License - OpenSSF Best Practices + OpenSSF Best Practices - Flyte Helm Chart + Flyte Helm Chart - Twitter Follow + Flyte Twitter - Join Flyte Slack + Flyte Slack

- Website ยท - Quickstart + Get Started ยท Documentation ยท - Live Roadmap - ยท - Changelogs - ยท - Components -
- Support: - Slack ยท - Discussions ยท - Office Hours -

- - - ---- -# What is Flyte? -Flyte is a structured programming and distributed processing platform that enables highly concurrent, scalable, and maintainable workflows for `Machine Learning` and `Data Processing`. It is a fabric that connects disparate computation backends using a type-safe data dependency graph. It records all changes to a pipeline, making it possible to rewind time. It also stores -a history of all executions and provides an intuitive UI, CLI, and REST/gRPC API to interact with the computation. - -Flyte is more than a workflow engine -- it uses `workflow` as a core concept, and `task` (a single unit of execution) as a top-level concept. Multiple tasks arranged in a data -producer-consumer order creates a workflow. - -`Workflows` and `Tasks` can be written in any language, with out-of-the-box support for [Python](https://github.com/flyteorg/flytekit), [Java and Scala](https://github.com/spotify/flytekit-java). -Flyte was designed to manage the complexity that arises in Data and ML teams and ensure they keep up their high velocity of delivering business impacting features. One way it achieves this is by separating -the control-plane from the user-plane. Thus, every organization can offer Flyte as a service to their end-users where the service is managed by folks who are more infrastructure-focused, while the users use the intuitive interface of Flytekit. - -## โ‰๏ธ Why Flyte - -- Kubernetes-native workflow automation platform -- Ergonomic SDKs in Python, Java, and Scala -- Versioned, auditable, and reproducible pipelines -- Data-aware and strongly-typed -- Resource-aware and deployments at scale - -| ![Flyte UI](https://raw.githubusercontent.com/flyteorg/static-resources/main/common/first_run_console.gif) | -| :--------------------------------------------------------------------------------------------------------: | -| *โœจ Flyte UI โœจ* | -___ -# Quickstart - -**NOTE**: If you want to try Flyte in the browser without installing anything locally, visit the [Flyte Hosted Sandbox](https://sandbox.union.ai/) -___ -1. Ensure you're using Python version >=`3.7`, <=`3.10` -2. Install Flytekit, Flyte's Python SDK: -```bash -$ pip install flytekit -``` -3. Then install flytectl, the CLI for interacting with a Flyte backend: -```bash -brew install flyteorg/homebrew-tap/flytectl -``` -**You're all set!** - -For installation instructions for other operating systems and how to run an example workflow, visit the [Getting Started guide](https://docs.flyte.org/projects/cookbook/en/latest/index.html#)! -## โญ๏ธ Organizations/projects using Flyte (excerpt) - - - -- [appliedAI Initiative](https://appliedai.de) -- [Blackshark.ai](https://blackshark.ai/) -- [Freenome](https://www.freenome.com/) -- [Gojek](https://www.gojek.io/) -- [Hurb](https://www.hurb.com/) -- [Intel](https://www.intel.com/) -- [LatchBio](https://www.latch.bio/) -- [Level 5 Global Autonomous (Woven Planet)](https://level-5.global/) -(...) -**Check [ADOPTERS](https://github.com/flyteorg/community/blob/main/ADOPTERS.md) for the full list and how to add your org/project** - -

- ๐Ÿ”ฅ Features -

- - -
- -- Used at _Scale_ in production by multiple firms and projects. -- Proved to scale to more than **1 million** executions, and **40+ million** containers -- Data Aware and Resource Aware (Allows organizations to separate concerns - users can use the API, platforms/infra teams can manage the deployments and scaling) -- Enables **collaboration across your organization** by: - - Executing distributed data pipelines/workflows - - Making it easy to stitch together workflows from different teams and domain experts and share them across teams - - Comparing results of training workflows over time and across pipelines - - Simplifying the complexity of multi-step, multi-owner workflows -- **[Get Started quickly](https://docs.flyte.org/projects/cookbook/en/latest/index.html)** -- start locally and scale to the cloud instantly -- **gRPC / REST** interface to define and execute tasks and workflows -- **Typesafe** construction of pipelines -- each task has an interface characterized by its input and output, so illegal construction of pipelines fails during declaration, rather than at runtime -- Supports multiple **[data types](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/type_system/index.html)** for machine learning and data processing pipelines, such as Blobs (images, arbitrary files), Directories, Schema (columnar structured data), collections, maps, etc. -- Memoization and Lineage tracking -- Provides logging and observability -- Workflow features: - - Start with one task, convert to a pipeline, attach **[multiple schedules](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/scheduled_workflows/lp_schedules.html#sphx-glr-auto-core-scheduled-workflows-lp-schedules-py)**, trigger using a programmatic API, or on-demand - - Parallel step execution - - Extensible backend to add **[customized plugin](https://docs.flyte.org/projects/flytekit/en/latest/tasks.extend.html#custom-tasks)** experience (with simplified user experience) - - **[Branching](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/conditions.html)** - - Workflow of workflows - **[subworkflows](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/subworkflows.html)** (a workflow can be embedded within one node of the top-level workflow) - - Distributed **remote external workflows** (a remote workflow can be triggered and statically verified at compile time) - - **[Array Tasks](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/map_task.html)** (map a function over a large dataset -- ensures controlled execution of thousands of containers) - - **[Dynamic workflows](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/dynamics.html)** creation and execution with runtime type safety - - [Flytekit plugins](https://docs.flyte.org/projects/flytekit/en/latest/plugins/index.html#plugins) with first-class support in Python - - Arbitrary Flytekit-less containers tasks ([RawContainer](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/containerization/raw_container.html)) -- Guaranteed **[reproducibility](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/flyte_basics/task_cache.html)** of pipelines via: - - Versioned data, code, and models - - Automatically tracked executions - - Declarative pipelines -- **Multi-cloud support** (AWS, GCP, and others) -- No single point of failure, and is resilient by design -- Automated notifications to Slack, Email, and Pagerduty -- [Multi K8s cluster support](https://docs.flyte.org/projects/cookbook/en/latest/auto/integrations/kubernetes/pod/index.html) -- Out of the box support to run **[Spark jobs on K8s](https://docs.flyte.org/projects/cookbook/en/latest/auto/integrations/kubernetes/k8s_spark/index.html)**, **[Dask jobs on K8s](https://docs.flyte.org/projects/cookbook/en/latest/auto/integrations/kubernetes/k8s_dask/index.html)**, **[Hive queries](https://docs.flyte.org/projects/cookbook/en/latest/auto/integrations/external_services/hive/index.html)**, etc. -- Snappy Console & Golang CLI (Flytectl) -- Written in **Golang** and optimized for jobs that run for a long period of time. -- [Grafana templates](https://grafana.com/orgs/flyte) (user/system observability) -- Deploy with Helm and Kustomize - -
- -## ๐Ÿ”Œ Available Plugins - -Check out the [current list of plugins](https://docs.flyte.org/projects/flytekit/en/latest/plugins/index.html#plugins) and how to use them - - - - - -____ -## Contributing - -There are many ways in which you can participate in this project, including: - -* Submit [bugs](https://github.com/flyteorg/flyte/issues/new?assignees=&labels=bug%2Cuntriaged&template=bug_report.yaml&title=%5BBUG%5D+) and [feature requests](https://github.com/flyteorg/flyte/issues/new?assignees=&labels=enhancement%2Cuntriaged&template=feature_request.yaml&title=%5BCore+feature%5D+) for different components - -* Review [the documentation](https://docs.flyte.org/en/latest/) and make [pull requests](https://github.com/flyteorg/flytesnacks) for anything from typos to additional and new content -* Speak or write about Flyte or any other ecosystem integration and [let us know](https://flyte-org.slack.com/archives/C02JMT8KTEE)! -* Grab a [`help wanted`](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+) or [`good-first-issue`](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) and follow the [CONTRIBUTING](https://docs.flyte.org/en/latest/community/contribute.html#contribute-flyte) guide to submit changes to the codebase -* Upvote [popular feature requests](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement+sort%3Areactions-%2B1-desc) - - - -

- ๐Ÿ›ฃ๏ธ Live Roadmap -

- - -Live roadmap for the project can be found @[Github Live Roadmap](https://github.com/orgs/flyteorg/projects/3) - - - - -

- ๐Ÿ“„ RFCs (Request for Comments) & Proposals -

- - -Flyte is a community-driven and community-owned software. It is managed using -a steering committee and encourages collaboration. The community has a long -roadmap for Flyte, but there might be interesting -ideas, extensions, or additions that you may want to propose. This is -usually done by starting with: - -- [Github Issue](https://github.com/flyteorg/flyte/issues): we maintain issues for all repos in the main flyte repo. -- Writing down your proposal using a [documented RFC process](rfc/.). - -RFCs are encouraged for larger changes. -You are welcome to hop into our [Slack](https://flyte-org.slack.com/archives/C04NJPLRWUX) and talk to the community -if you want to test the waters before proposing. - -

- ๐Ÿ“ฆ Component Repos + Resources

- -
+
-| Repo | Language | Purpose | Status | -| ------------------------------------------------------------ | ------------- | ---------------------------------------------- | ---------------- | -| [flyte](https://github.com/flyteorg/flyte) | Kustomize,RST | deployment, documentation, issues | Production-grade | -| [flyteidl](https://github.com/flyteorg/flyteidl) | Protobuf | gRPC/REST API, Workflow language spec | Production-grade | -| [flytepropeller](https://github.com/flyteorg/flytepropeller) | Go | execution engine | Production-grade | -| [flyteadmin](https://github.com/flyteorg/flyteadmin) | Go | control plane | Production-grade | -| [flytekit](https://github.com/flyteorg/flytekit) | Python | python SDK and tools | Production-grade | -| [flyteconsole](https://github.com/flyteorg/flyteconsole) | Typescript | Flyte UI | Production-grade | -| [datacatalog](https://github.com/flyteorg/datacatalog) | Go | manage input & output artifacts | Production-grade | -| [flyteplugins](https://github.com/flyteorg/flyteplugins) | Go | Flyte Backend plugins | Production-grade | -| [flytecopilot](https://github.com/flyteorg/flytecopilot) | Go | Sidecar to manage input/output for sdk-less | Production-grade | -| [flytestdlib](https://github.com/flyteorg/flytestdlib) | Go | standard library | Production-grade | -| [flytesnacks](https://github.com/flyteorg/flytesnacks) | Python | examples, tips, and tricks | Maintained | -| [flytekit-java](https://github.com/flyteorg/flytekit-java) | Java/Scala | Java & scala SDK for authoring Flyte workflows | Incubating | -| [flytectl](https://github.com/flyteorg/flytectl) | Go | A standalone Flyte CLI | Production-grade | -| [homebrew-tap](https://github.com/flyteorg/homebrew-tap) | Ruby | Tap for downloadable flyte tools (cli etc) | Production-grade | -| [bazel-rules](https://github.com/flyteorg/bazelrules_flyte) | skylark/py | Use Bazel to build Flyte workflows and tasks | Incubating | +Getting started with Flyte -
- -_____ - -

- ๐Ÿค Community & Resources -

- - -Use the following resources to communicate with Flyte maintainers, contributors and other community members to ask questions and enhance your learning experience: - -### Asynchronous - -- [Slack](https://slack.flyte.org) -- [Mailing list](https://lists.lfaidata.foundation/g/flyte-announce/join) -- [GitHub Discussions](https://github.com/flyteorg/flyte/discussions) - -### Social media -- [Twitter](https://twitter.com/flyteorg) -- [LinkedIn Discussion Group](https://www.linkedin.com/groups/13962256/) - -## Meetings -### Biweekly Community Sync - -- ๐Ÿ“ฃโ€‚**Flyte OSS Community Sync** -Join this meeting to learn from other users how they are leveraging Flyte for different use cases, ask questions or continue community-related discussions -* When: every other Tuesday, 9:00 am - 10:00 am PT. -* Where: [Zoom](https://us04web.zoom.us/j/71298741279?pwd=TDR1RUppQmxGaDRFdzBOa2lHN1dsZz09) bridge -* Previous meetings: [[notes](https://docs.google.com/document/d/1EPR-BqWi8t7OF_forVflM8lWLm1T-_IE2_5_HGeyGlo/edit?usp=sharing)| [recordings](https://www.youtube.com/@flyteorg/playlists)] - -* Subscribe to the [calendar](https://lists.lfaidata.foundation/g/flyte-announce/ics/12031983/2145304139/feed.ics) - -### Office Hours +--- -Receive support from Flyte maintainers: +## Features -* When: weekly on Wednesdays -* How: schedule a 30 min session from one of the available slots (7AM, 1PM and 9PM PT) using [this link](https://calendly.com/flyte-office-hours-01/30min) +We ship new features, bug fixes and performance improvements regularly. Read our [release notes](https://github.com/flyteorg/flyte/releases) to stay updated. -### Knowledge Base +๐Ÿš€ **Strongly typed interfaces**: Validate your data at every step of the workflow by defining data guardrails using Flyte types.
+๐ŸŒ **Any language**: Write code in any language using raw containers, or choose [Python](https://github.com/flyteorg/flytekit), [Java](https://github.com/flyteorg/flytekit-java), [Scala](https://github.com/flyteorg/flytekit-java) or [JavaScript](https://github.com/NotMatthewGriffin/pterodactyl) SDKs to develop your Flyte workflows.
+๐Ÿ“Š **Map tasks**: Achieve parallel code execution with minimal configuration using [map tasks](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/map_task.html).
+๐ŸŒŸ **Dynamic workflows**: [Build flexible and adaptable workflows](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/dynamics.html) that can change and evolve as needed, making it easier to respond to changing requirements.
+๐ŸŒณ **Branching**: [Selectively execute branches](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/conditions.html) of your workflow based on static or dynamic data produced by other tasks or input data.
+๐Ÿ“‚ **FlyteFile & FlyteDirectory**: Transfer [files](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/flyte_basics/files.html) and [directories](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/flyte_basics/folders.html) between local and cloud storage.
+๐Ÿ—ƒ๏ธ **Structured dataset**: Convert dataframes between types and enforce column-level type checking using the abstract 2D representation provided by [Structured Dataset](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/type_system/structured_dataset.html).
+๐Ÿ›ก๏ธ **Recover from failures**: Recover only the failed tasks.
+๐Ÿ” **Rerun a single task**: Rerun workflows at the most granular level without modifying the previous state of a data/ML workflow.
+๐Ÿšฆ **Versioned workflows**: Reproduce results and roll back to a previous workflow version any time.
+๐Ÿ” **Cache outputs**: Cache task outputs by passing `cache=True` to the task decorator.
+๐Ÿšฉ **Intra-task checkpointing**: [Checkpoint progress](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/checkpoint.html) within a task execution.
+๐ŸŒŽ **Multi-tenancy**: Multiple users can share the same platform while maintaining their own distinct data and configurations.
+โฐ **Timeout**: Define a timeout period, after which the task is marked as failure.
+๐Ÿ”’ **Immutability**: Immutable executions help ensure reproducibility by preventing any changes to the state of an execution.
+๐Ÿงฌ **Data lineage**: Track the movement and transformation of data throughout the lifecycle of your data and ML workflows.
+๐Ÿ“ˆ **Data visualization**: Visualize data, monitor models and view training history through plots.
+๐Ÿญ **Dev to prod**: As simple as changing your [domain](https://docs.flyte.org/en/latest/concepts/domains.html) from development or staging to production.
+๐Ÿ’ธ **Spot or preemptible instances**: Schedule your workflows on spot instances by setting `interruptible` to `True` in the task decorator.
+โ˜๏ธ **Cloud-native deployment**: Deploy Flyte on AWS, GCP, Azure and other cloud services.
+๐Ÿ“… **Scheduling**: [Schedule](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/scheduled_workflows/lp_schedules.html) your data and ML workflows to run at a specific time.
+๐Ÿ“ข **Notifications**: Stay informed about changes to your workflow's state by configuring [notifications](https://docs.flyte.org/projects/cookbook/en/latest/auto/deployment/lp_notifications.html) through Slack, PagerDuty or email.
+โŒ›๏ธ **Timeline view**: Evaluate the duration of each of your Flyte tasks and identify potential bottlenecks.
+๐Ÿ’จ **GPU acceleration**: Enable and control your tasksโ€™ GPU demands by requesting resources in the task decorator.
+๐Ÿณ **Dependency isolation via containers**: Maintain separate sets of dependencies for your tasks so no dependency conflicts arise.
+๐Ÿ”€ **Parallelism**: Flyte tasks are inherently parallel to optimize resource consumption and improve performance.
+๐Ÿ’พ **Allocate resources dynamically** at the task level.
+โฏ๏ธ [Wait](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/control_flow/waiting_for_external_inputs.html) for **external inputs** before proceeding with the execution.
-Find answers to the FAQs at [Knowledge Base](https://discuss.flyte.org): our minified StackOverflow and magnified Slack. +## Quick start -### Conference Talks & Podcasts +If you want to try out Flyte, the easiest way to get started is by using the Flyte Hosted Sandbox, available at https://sandbox.union.ai/. It allows you to experiment with Flyte's capabilities without installing anything on your local machine. -Videos and recordings can be found on Flyte's YouTube channel under the [Conference Talks and Podcasts](https://www.youtube.com/playlist?list=PLmQd1BBY9MWouwgSeivMoA4ldSyRcRj_-) playlist. +However, if you prefer to install Flyte locally and run a workflow, our [getting started guide](https://docs.flyte.org/projects/cookbook/en/latest/index.html) is the best place to start. It provides step-by-step instructions on how to install Flyte locally and run your first workflow. -### Podcasts -
-- MLOps Coffee Session - [Why You Need More Than Airflow](http://go.mlops.community/Oz48gY) -- Kelsey Hightower Twitter Space - [Machine Learning in Production](https://twitter.com/i/spaces/1ZkKzbXLekWKv) -- Contributor.fyi - [Flyte with Ketan Umare](https://www.contributor.fyi/flyte) -- TWIML&AI - [Scalable and Maintainable ML Workflows at Lyft - Flyte](https://twimlai.com/twiml-talk-343-scalable-and-maintainable-workflows-at-lyft-with-flyte-w-haytham-abuelfutuh-and-ketan-umare/) -- Software Engineering Daily - [Flyte: Lyft Data Processing Platform](https://softwareengineeringdaily.com/2020/03/12/flyte-lyft-data-processing-platform-with-allyson-gale-and-ketan-umare/) -- MLOps Coffee session - [Flyte: an open-source tool for scalable, extensible, and portable workflows](https://anchor.fm/mlops/episodes/MLOps-Coffee-Sessions-12-Flyte-an-open-source-tool-for-scalable--extensible---and-portable-workflows-eksa5k) -- Open Data Science - [West Warm Up session with Ketan Umare - Creator of Flyte](https://twitter.com/odsc/status/1451594432369758212) +> If you're unsure what a Flyte [task](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/flyte_basics/task.html) and [workflow](https://docs.flyte.org/projects/cookbook/en/latest/auto/core/flyte_basics/basic_workflow.html) are, be sure to check out our guides on both! -
+### Deploy Flyte to production -## ๐Ÿงช Functional Tests Matrix +The [deployment guide](https://docs.flyte.org/en/latest/deployment/index.html) provides useful information on how to self-host and manage Flyte. -We run a suite of [tests](https://github.com/flyteorg/flytesnacks/blob/master/cookbook/flyte_tests_manifest.json) to ensure that basic functionality and a subset of the integrations work across a variety of release versions. Those tests are run in a cluster where specific versions of the Flyte components (such as flyteconsole, flyteadmin, datacatalog, and flytepropeller) are installed, including the released versions and also the latest versions in the case of the nighly runs. +## Adopters -The table below has different release versions as the columns and the result of each test suite as rows: +Join the likes of LinkedIn, Spotify, Freenome, Pachama, Gojek, and Woven Planet in adopting Flyte. For a full list of adopters and information on how to add your organization or project, please visit our [ADOPTERS](https://github.com/flyteorg/community/blob/main/ADOPTERS.md) page. -
-
+## Roadmap -| workflow group | nightly | v1.0.1 | v1.0.0 | v0.19.4 | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -| core | ![core](https://byob.yarr.is/unionai/gh-badges/nightly/core) | ![core](https://byob.yarr.is/unionai/gh-badges/v1.0.1/core) | ![core](https://byob.yarr.is/unionai/gh-badges/v1.0.0/core) | ![core](https://byob.yarr.is/unionai/gh-badges/v0.19.4/core) | -| integrations-hive | ![integration-hive](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-hive) | ![integration-hive](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-hive) | ![integration-hive](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-hive) | ![integration-hive](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-hive) | -| integrations-k8s-spark | ![integrations-k8s-spark](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-k8s-spark) | ![integrations-k8s-spark](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-k8s-spark) | ![integrations-k8s-spark](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-k8s-spark) | ![integrations-k8s-spark](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-k8s-spark) | -| integrations-kfpytorch | ![integrations-kfpytorch](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-kfpytorch) | ![integrations-kfpytorch](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-kfpytorch) | ![integrations-kfpytorch](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-kfpytorch) | ![integrations-kfpytorch](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-kfpytorch) | -| integrations-pod | ![integrations-pod](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-pod) | ![integrations-pod](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-pod) | ![integrations-pod](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-pod) | ![integrations-pod](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-pod) | -| integrations-pandera_examples | ![integrations-pandera_examples](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-pandera_examples) | ![integrations-pandera_examples](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-pandera_examples) | ![integrations-pandera_examples](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-pandera_examples) | ![integrations-pandera_examples](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-pandera_examples) | -| integrations-papermilltasks | ![integrations-papermilltasks](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-papermilltasks) | ![integrations-papermilltasks](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-papermilltasks) | ![integrations-papermilltasks](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-papermilltasks) | ![integrations-papermilltasks](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-papermilltasks) | -| integrations-greatexpectations | ![integrations-greatexpectations](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-greatexpectations) | ![integrations-greatexpectations](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-greatexpectations) | ![integrations-greatexpectations](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-greatexpectations) | ![integrations-greatexpectations](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-greatexpectations) | -| integrations-sagemaker-pytorch | ![integrations-sagemaker-pytorch](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-sagemaker-pytorch) | ![integrations-sagemaker-pytorch](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-sagemaker-pytorch) | ![integrations-sagemaker-pytorch](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-sagemaker-pytorch) | ![integrations-sagemaker-pytorch](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-sagemaker-pytorch) | -| integrations-sagemaker-training | ![integrations-sagemaker-training](https://byob.yarr.is/unionai/gh-badges/nightly/integrations-sagemaker-training) | ![integrations-sagemaker-training](https://byob.yarr.is/unionai/gh-badges/v1.0.1/integrations-sagemaker-training) | ![integrations-sagemaker-training](https://byob.yarr.is/unionai/gh-badges/v1.0.0/integrations-sagemaker-training) | ![integrations-sagemaker-training](https://byob.yarr.is/unionai/gh-badges/v0.19.4/integrations-sagemaker-training) | +Stay up to date with the latest project roadmap by checking out our live [roadmap](https://github.com/orgs/flyteorg/projects/3) on GitHub. -
-
+## Resources +๐Ÿ“† [Weekly office hours](https://calendly.com/flyte-office-hours-01/30min): Live informal sessions with the Flyte team held every week. Book a 30-minute slot and get your questions answered.
+๐Ÿ‘ฅ [Biweekly community sync](https://www.addevent.com/event/EA7823958): A biweekly event where the Flyte team provides updates on the project and community members can share their progress and ask questions.
+๐Ÿ’ฌ [Slack](https://slack.flyte.org/): Join the Flyte community on Slack to chat with other users, ask questions, and get help.
+โš ๏ธ [GitHub](https://github.com/flyteorg/flyte): Check out the Flyte project on GitHub to file issues, contribute code, and stay up to date on the latest development.
+๐Ÿ“น [Youtube](https://www.youtube.com/channel/UCNduEoLOToNo3nFVly-vUTQ): Tune into panel discussions, customer success stories, community updates and feature deep dives.
+๐Ÿ“„ [Blog](https://flyte.org/blog): Here, you can find tutorials and feature deep dives to help you learn more about Flyte.
+๐Ÿ’ก [RFCs](rfc/.): RFCs are used for proposing new ideas and features to improve Flyte. You can refer to them to stay updated on the latest developments and contribute to the growth of the platform. +## How to contribute +There are many ways to get involved in Flyte, including: -## ๐Ÿ’– Contributors +* Submitting [bugs](https://github.com/flyteorg/flyte/issues/new?assignees=&labels=bug%2Cuntriaged&template=bug_report.yaml&title=%5BBUG%5D+) and [feature requests](https://github.com/flyteorg/flyte/issues/new?assignees=&labels=enhancement%2Cuntriaged&template=feature_request.yaml&title=%5BCore+feature%5D+) for various components. +* Reviewing [the documentation](https://docs.flyte.org/en/latest/) and submitting [pull requests](https://github.com/flyteorg/flytesnacks) for anything from fixing typos to adding new content. +* Speaking or writing about Flyte or any other ecosystem integration and [letting us know](https://flyte-org.slack.com/archives/C02JMT8KTEE)! +* Taking on a [`help wanted`](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+) or [`good-first-issue`](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) and following the [CONTRIBUTING](https://docs.flyte.org/en/latest/community/contribute.html#contribute-flyte) guide to submit changes to the codebase. +* Upvoting [popular feature requests](https://github.com/flyteorg/flyte/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement+sort%3Areactions-%2B1-desc) to show your support. -A big thank you to the community for making Flyte possible! +### We โค๏ธ our contributors [![953358](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/953358?v=4&w=50&h=50&mask=circle)](https://github.com/katrogan)[![37090125](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/37090125?v=4&w=50&h=50&mask=circle)](https://github.com/lyft-metaservice-3)[![7597118](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7597118?v=4&w=50&h=50&mask=circle)](https://github.com/matthewphsmith)[![27159](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/27159?v=4&w=50&h=50&mask=circle)](https://github.com/EngHabu)[![29843943](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/29843943?v=4&w=50&h=50&mask=circle)](https://github.com/goreleaserbot)[![10830562](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10830562?v=4&w=50&h=50&mask=circle)](https://github.com/evalsocket)[![8888115](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8888115?v=4&w=50&h=50&mask=circle)](https://github.com/hamersaw)[![78108056](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/78108056?v=4&w=50&h=50&mask=circle)](https://github.com/flyte-bot)[![158892](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/158892?v=4&w=50&h=50&mask=circle)](https://github.com/honnix)[![18408237](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18408237?v=4&w=50&h=50&mask=circle)](https://github.com/anandswaminathan)[![2896568](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2896568?v=4&w=50&h=50&mask=circle)](https://github.com/wild-endeavor)[![1518524](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1518524?v=4&w=50&h=50&mask=circle)](https://github.com/bnsblue)[![37936015](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/37936015?v=4&w=50&h=50&mask=circle)](https://github.com/pingsutw)[![27724763](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/27724763?v=4&w=50&h=50&mask=circle)](https://github.com/iaroslav-ciupin)[![16888709](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16888709?v=4&w=50&h=50&mask=circle)](https://github.com/kumare3)[![27777173](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/27777173?v=4&w=50&h=50&mask=circle)](https://github.com/samhita-alla)[![452166](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/452166?v=4&w=50&h=50&mask=circle)](https://github.com/MorpheusXAUT)[![4748985](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4748985?v=4&w=50&h=50&mask=circle)](https://github.com/aliabbasjaffri)[![6562898](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6562898?v=4&w=50&h=50&mask=circle)](https://github.com/ckiosidis)[![6239450](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6239450?v=4&w=50&h=50&mask=circle)](https://github.com/mayitbeegh)[![8805803](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8805803?v=4&w=50&h=50&mask=circle)](https://github.com/alexlipa91)[![5032356](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5032356?v=4&w=50&h=50&mask=circle)](https://github.com/brucearctor)[![77798312](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/77798312?v=4&w=50&h=50&mask=circle)](https://github.com/pmahindrakar-oss)[![23062603](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/23062603?v=4&w=50&h=50&mask=circle)](https://github.com/Antaxify)[![653394](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/653394?v=4&w=50&h=50&mask=circle)](https://github.com/eapolinario)[![5725707](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5725707?v=4&w=50&h=50&mask=circle)](https://github.com/andrewwdye)[![8122852](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8122852?v=4&w=50&h=50&mask=circle)](https://github.com/ariefrahmansyah)[![10869815](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10869815?v=4&w=50&h=50&mask=circle)](https://github.com/jeevb)[![3880645](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3880645?v=4&w=50&h=50&mask=circle)](https://github.com/jonathanburns)[![3936213](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3936213?v=4&w=50&h=50&mask=circle)](https://github.com/lu4nm3)[![26174213](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/26174213?v=4&w=50&h=50&mask=circle)](https://github.com/lyft-metaservice-2)[![9142716](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/9142716?v=4&w=50&h=50&mask=circle)](https://github.com/2uasimojo)[![5487021](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5487021?v=4&w=50&h=50&mask=circle)](https://github.com/veggiemonk)[![1815175](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1815175?v=4&w=50&h=50&mask=circle)](https://github.com/schottra)[![46989299](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/46989299?v=4&w=50&h=50&mask=circle)](https://github.com/supreeth7)[![2816689](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2816689?v=4&w=50&h=50&mask=circle)](https://github.com/cosmicBboy)[![19375241](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/19375241?v=4&w=50&h=50&mask=circle)](https://github.com/migueltol22)[![6065051](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6065051?v=4&w=50&h=50&mask=circle)](https://github.com/milton0825)[![70988](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/70988?v=4&w=50&h=50&mask=circle)](https://github.com/slai)[![94349093](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/94349093?v=4&w=50&h=50&mask=circle)](https://github.com/SmritiSatyanV)[![16090976](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16090976?v=4&w=50&h=50&mask=circle)](https://github.com/surindersinghp)[![43610471](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/43610471?v=4&w=50&h=50&mask=circle)](https://github.com/TheYk98)[![53313394](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/53313394?v=4&w=50&h=50&mask=circle)](https://github.com/kosigz-lyft)[![4967458](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4967458?v=4&w=50&h=50&mask=circle)](https://github.com/chanadian)[![467927](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/467927?v=4&w=50&h=50&mask=circle)](https://github.com/kanterov)[![248688](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/248688?v=4&w=50&h=50&mask=circle)](https://github.com/hanzo)[![1330233](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1330233?v=4&w=50&h=50&mask=circle)](https://github.com/igorvalko)[![31255434](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/31255434?v=4&w=50&h=50&mask=circle)](https://github.com/kennyworkman)[![1472826](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1472826?v=4&w=50&h=50&mask=circle)](https://github.com/maximsmol)[![5026554](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5026554?v=4&w=50&h=50&mask=circle)](https://github.com/vsbus)[![34587798](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/34587798?v=4&w=50&h=50&mask=circle)](https://github.com/akhurana001)[![11799671](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11799671?v=4&w=50&h=50&mask=circle)](https://github.com/bstadlbauer)[![95110820](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/95110820?v=4&w=50&h=50&mask=circle)](https://github.com/jerempy)[![38207208](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/38207208?v=4&w=50&h=50&mask=circle)](https://github.com/tnsetting)[![8200209](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8200209?v=4&w=50&h=50&mask=circle)](https://github.com/catalinii)[![24364830](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/24364830?v=4&w=50&h=50&mask=circle)](https://github.com/ByronHsu)[![43587819](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/43587819?v=4&w=50&h=50&mask=circle)](https://github.com/chetcode)[![163899](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/163899?v=4&w=50&h=50&mask=circle)](https://github.com/regadas)[![36511035](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/36511035?v=4&w=50&h=50&mask=circle)](https://github.com/fg91)[![22784654](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/22784654?v=4&w=50&h=50&mask=circle)](https://github.com/aybidi)[![1316881](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1316881?v=4&w=50&h=50&mask=circle)](https://github.com/akashkatipally)[![1777447](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1777447?v=4&w=50&h=50&mask=circle)](https://github.com/goyalankit)[![1360529](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1360529?v=4&w=50&h=50&mask=circle)](https://github.com/clairemcginty)[![104257](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/104257?v=4&w=50&h=50&mask=circle)](https://github.com/flixr)[![2538760](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2538760?v=4&w=50&h=50&mask=circle)](https://github.com/akumor)[![11970258](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11970258?v=4&w=50&h=50&mask=circle)](https://github.com/niliayu)[![19733683](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/19733683?v=4&w=50&h=50&mask=circle)](https://github.com/snyk-bot)[![155087](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/155087?v=4&w=50&h=50&mask=circle)](https://github.com/derwiki)[![1399455](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1399455?v=4&w=50&h=50&mask=circle)](https://github.com/th0114nd)[![21109744](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/21109744?v=4&w=50&h=50&mask=circle)](https://github.com/AlekhyaSasi)[![49699333](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/in/29110?v=4&w=50&h=50&mask=circle)](https://github.com/apps/dependabot)[![1810591](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1810591?v=4&w=50&h=50&mask=circle)](https://github.com/asottile)[![80421934](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/80421934?v=4&w=50&h=50&mask=circle)](https://github.com/SandraGH5)[![3939659](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3939659?v=4&w=50&h=50&mask=circle)](https://github.com/sbrunk)[![9609986](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/9609986?v=4&w=50&h=50&mask=circle)](https://github.com/sonjaer)[![12219405](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/12219405?v=4&w=50&h=50&mask=circle)](https://github.com/fediazgon)[![98349643](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/98349643?v=4&w=50&h=50&mask=circle)](https://github.com/rahul-theorem)[![16509490](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16509490?v=4&w=50&h=50&mask=circle)](https://github.com/ryankarlos)[![6774758](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6774758?v=4&w=50&h=50&mask=circle)](https://github.com/ddhirajkumar)[![18337807](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18337807?v=4&w=50&h=50&mask=circle)](https://github.com/max-hoffman)[![322624](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/322624?v=4&w=50&h=50&mask=circle)](https://github.com/AdrianoKF)[![1168692](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1168692?v=4&w=50&h=50&mask=circle)](https://github.com/dennisobrien)[![91385411](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/91385411?v=4&w=50&h=50&mask=circle)](https://github.com/Ln11211)[![30621230](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/30621230?v=4&w=50&h=50&mask=circle)](https://github.com/aeioulisa)[![54334265](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/54334265?v=4&w=50&h=50&mask=circle)](https://github.com/michaels-lyft)[![48736656](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/48736656?v=4&w=50&h=50&mask=circle)](https://github.com/murilommen)[![17165004](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17165004?v=4&w=50&h=50&mask=circle)](https://github.com/RobertoRRW)[![30375389](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/30375389?v=4&w=50&h=50&mask=circle)](https://github.com/bimtauer)[![97543480](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/97543480?v=4&w=50&h=50&mask=circle)](https://github.com/esadler-hbo)[![69013027](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/69013027?v=4&w=50&h=50&mask=circle)](https://github.com/ggydush-fn)[![116700206](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/116700206?v=4&w=50&h=50&mask=circle)](https://github.com/kiliangojek)[![422486](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/422486?v=4&w=50&h=50&mask=circle)](https://github.com/bethebunny)[![54333860](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/54333860?v=4&w=50&h=50&mask=circle)](https://github.com/aalavian)[![7005765](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7005765?v=4&w=50&h=50&mask=circle)](https://github.com/convexquad)[![4025771](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4025771?v=4&w=50&h=50&mask=circle)](https://github.com/andresgomezfrr)[![48966647](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/48966647?v=4&w=50&h=50&mask=circle)](https://github.com/asahalyft)[![77167782](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/77167782?v=4&w=50&h=50&mask=circle)](https://github.com/apatel-fn)[![23013825](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/23013825?v=4&w=50&h=50&mask=circle)](https://github.com/arpitbhardwaj)[![31381038](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/31381038?v=4&w=50&h=50&mask=circle)](https://github.com/lordnodd)[![4396228](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4396228?v=4&w=50&h=50&mask=circle)](https://github.com/bryanwweber)[![6288302](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6288302?v=4&w=50&h=50&mask=circle)](https://github.com/CalvinLeather)[![23107192](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/23107192?v=4&w=50&h=50&mask=circle)](https://github.com/YmirKhang)[![121866694](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/121866694?v=4&w=50&h=50&mask=circle)](https://github.com/franco-bocci)[![7358951](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7358951?v=4&w=50&h=50&mask=circle)](https://github.com/frsann)[![33652917](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/33652917?v=4&w=50&h=50&mask=circle)](https://github.com/hfurkanvural)[![6984748](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6984748?v=4&w=50&h=50&mask=circle)](https://github.com/jbrambleDC)[![488594](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/488594?v=4&w=50&h=50&mask=circle)](https://github.com/jcugat)[![20173739](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20173739?v=4&w=50&h=50&mask=circle)](https://github.com/madhur-tandon)[![34498039](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/34498039?v=4&w=50&h=50&mask=circle)](https://github.com/matheusMoreno)[![19853373](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/19853373?v=4&w=50&h=50&mask=circle)](https://github.com/NotMatthewGriffin)[![10376195](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10376195?v=4&w=50&h=50&mask=circle)](https://github.com/myz540)[![125105](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/125105?v=4&w=50&h=50&mask=circle)](https://github.com/tekumara)[![1153481](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1153481?v=4&w=50&h=50&mask=circle)](https://github.com/ppiegaze)[![37170063](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/37170063?v=4&w=50&h=50&mask=circle)](https://github.com/Qiwen-Yu)[![2614101](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2614101?v=4&w=50&h=50&mask=circle)](https://github.com/RobinKa)[![4308533](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4308533?v=4&w=50&h=50&mask=circle)](https://github.com/rubenbarragan)[![10201242](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10201242?v=4&w=50&h=50&mask=circle)](https://github.com/sugatoray)[![11269256](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11269256?v=4&w=50&h=50&mask=circle)](https://github.com/sushrut111)[![61228633](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/61228633?v=4&w=50&h=50&mask=circle)](https://github.com/Tat-V)[![13070236](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/13070236?v=4&w=50&h=50&mask=circle)](https://github.com/TeoZosa)[![8817639](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8817639?v=4&w=50&h=50&mask=circle)](https://github.com/ThomVett)[![17309187](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17309187?v=4&w=50&h=50&mask=circle)](https://github.com/datability-io)[![26834658](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/26834658?v=4&w=50&h=50&mask=circle)](https://github.com/techytushar)[![5092599](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5092599?v=4&w=50&h=50&mask=circle)](https://github.com/vchowdhary)[![57967031](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/57967031?v=4&w=50&h=50&mask=circle)](https://github.com/varshaparthay)[![67166843](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/67166843?v=4&w=50&h=50&mask=circle)](https://github.com/vvasavada-fn)[![1778407](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1778407?v=4&w=50&h=50&mask=circle)](https://github.com/ybubnov)[![51814063](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/51814063?v=4&w=50&h=50&mask=circle)](https://github.com/Yicheng-Lu-llll)[![3741621](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3741621?v=4&w=50&h=50&mask=circle)](https://github.com/palchicz)[![12450632](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/12450632?v=4&w=50&h=50&mask=circle)](https://github.com/ajsalow)[![35151789](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/35151789?v=4&w=50&h=50&mask=circle)](https://github.com/ggydush)[![13331724](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/13331724?v=4&w=50&h=50&mask=circle)](https://github.com/martinlyra)[![119345186](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/119345186?v=4&w=50&h=50&mask=circle)](https://github.com/mcloney-ddm)[![1521126](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1521126?v=4&w=50&h=50&mask=circle)](https://github.com/pbrogan12)[![73247359](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/73247359?v=4&w=50&h=50&mask=circle)](https://github.com/stef-stripe)[![50860453](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/50860453?v=4&w=50&h=50&mask=circle)](https://github.com/charlie0220)[![6506810](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6506810?v=4&w=50&h=50&mask=circle)](https://github.com/stephen37)[![55718143](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/55718143?v=4&w=50&h=50&mask=circle)](https://github.com/anrusina)[![65977800](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/65977800?v=4&w=50&h=50&mask=circle)](https://github.com/service-github-lyft-semantic-release)[![6610300](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6610300?v=4&w=50&h=50&mask=circle)](https://github.com/ursucarina)[![84735036](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/84735036?v=4&w=50&h=50&mask=circle)](https://github.com/jsonporter)[![85753828](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/85753828?v=4&w=50&h=50&mask=circle)](https://github.com/csirius)[![101579322](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/101579322?v=4&w=50&h=50&mask=circle)](https://github.com/olga-union)[![26953709](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/26953709?v=4&w=50&h=50&mask=circle)](https://github.com/Pianist038801)[![105876962](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/105876962?v=4&w=50&h=50&mask=circle)](https://github.com/james-union)[![25038146](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25038146?v=4&w=50&h=50&mask=circle)](https://github.com/eugenejahn)[![88684372](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/88684372?v=4&w=50&h=50&mask=circle)](https://github.com/4nalog)[![99441958](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/99441958?v=4&w=50&h=50&mask=circle)](https://github.com/apTalya)[![1388071](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1388071?v=4&w=50&h=50&mask=circle)](https://github.com/aviaviavi)[![58770001](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/58770001?v=4&w=50&h=50&mask=circle)](https://github.com/Professional0321)[![20668349](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20668349?v=4&w=50&h=50&mask=circle)](https://github.com/HiromuHota)[![100569684](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/100569684?v=4&w=50&h=50&mask=circle)](https://github.com/rafaelraposospot)[![17351764](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17351764?v=4&w=50&h=50&mask=circle)](https://github.com/daniel-shuy)[![6399428](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6399428?v=4&w=50&h=50&mask=circle)](https://github.com/live-wire)[![25695302](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25695302?v=4&w=50&h=50&mask=circle)](https://github.com/sisco0)[![18363301](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18363301?v=4&w=50&h=50&mask=circle)](https://github.com/jimbobby5)[![4023015](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4023015?v=4&w=50&h=50&mask=circle)](https://github.com/pradithya)[![3451399](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3451399?v=4&w=50&h=50&mask=circle)](https://github.com/skiptomyliu)[![25364490](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25364490?v=4&w=50&h=50&mask=circle)](https://github.com/haoyuez)[![50679871](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/50679871?v=4&w=50&h=50&mask=circle)](https://github.com/lupasarin)[![7548823](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7548823?v=4&w=50&h=50&mask=circle)](https://github.com/Dread1982)[![7515359](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7515359?v=4&w=50&h=50&mask=circle)](https://github.com/narape)[![31982395](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/31982395?v=4&w=50&h=50&mask=circle)](https://github.com/alexapdev)[![62209650](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/62209650?v=4&w=50&h=50&mask=circle)](https://github.com/3t8)[![1892175](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1892175?v=4&w=50&h=50&mask=circle)](https://github.com/zeryx)[![200401](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/200401?v=4&w=50&h=50&mask=circle)](https://github.com/arturdryomov)[![13770222](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/13770222?v=4&w=50&h=50&mask=circle)](https://github.com/ChickenTarm)[![2380665](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2380665?v=4&w=50&h=50&mask=circle)](https://github.com/DavidMertz)[![24739949](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/24739949?v=4&w=50&h=50&mask=circle)](https://github.com/felixwang9817)[![10430635](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10430635?v=4&w=50&h=50&mask=circle)](https://github.com/juandiegopalomino)[![31911175](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/31911175?v=4&w=50&h=50&mask=circle)](https://github.com/kanyesthaker)[![104152793](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/104152793?v=4&w=50&h=50&mask=circle)](https://github.com/marc-union)[![27818609](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/27818609?v=4&w=50&h=50&mask=circle)](https://github.com/michaeltinsley)[![6486584](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6486584?v=4&w=50&h=50&mask=circle)](https://github.com/mucahitkantepe)[![321459](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/321459?v=4&w=50&h=50&mask=circle)](https://github.com/oyevtushok)[![35962310](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/35962310?v=4&w=50&h=50&mask=circle)](https://github.com/trishitapingolia)[![91927689](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/91927689?v=4&w=50&h=50&mask=circle)](https://github.com/Smartmind12)[![726061](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/726061?v=4&w=50&h=50&mask=circle)](https://github.com/huxuan)[![47872044](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/47872044?v=4&w=50&h=50&mask=circle)](https://github.com/privatedumbo)[![105229971](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/105229971?v=4&w=50&h=50&mask=circle)](https://github.com/tjKairos)[![405480](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/405480?v=4&w=50&h=50&mask=circle)](https://github.com/georgesnelling)[![1004789](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1004789?v=4&w=50&h=50&mask=circle)](https://github.com/dschaller)[![82604841](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/82604841?v=4&w=50&h=50&mask=circle)](https://github.com/davidmirror-ops)[![480621](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/480621?v=4&w=50&h=50&mask=circle)](https://github.com/davidxia)[![1335881](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1335881?v=4&w=50&h=50&mask=circle)](https://github.com/hoyajigi)[![100597998](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/100597998?v=4&w=50&h=50&mask=circle)](https://github.com/MrKrishnaAgarwal)[![4830700](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4830700?v=4&w=50&h=50&mask=circle)](https://github.com/NitinAgg)[![69161722](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/69161722?v=4&w=50&h=50&mask=circle)](https://github.com/noobkid2411)[![43336767](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/43336767?v=4&w=50&h=50&mask=circle)](https://github.com/yongchand)[![25391173](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25391173?v=4&w=50&h=50&mask=circle)](https://github.com/nicklofaso)[![66388192](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/66388192?v=4&w=50&h=50&mask=circle)](https://github.com/mounesi)[![14992189](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/14992189?v=4&w=50&h=50&mask=circle)](https://github.com/eanakhl)[![1175392](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1175392?v=4&w=50&h=50&mask=circle)](https://github.com/adinin)[![7475946](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7475946?v=4&w=50&h=50&mask=circle)](https://github.com/anton-malakhov)[![11796986](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11796986?v=4&w=50&h=50&mask=circle)](https://github.com/avan-sh)[![304786](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/304786?v=4&w=50&h=50&mask=circle)](https://github.com/kinow)[![24402505](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/24402505?v=4&w=50&h=50&mask=circle)](https://github.com/Daeruin)[![1659415](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1659415?v=4&w=50&h=50&mask=circle)](https://github.com/dav009)[![86911142](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/86911142?v=4&w=50&h=50&mask=circle)](https://github.com/idivyanshbansal)[![11456773](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11456773?v=4&w=50&h=50&mask=circle)](https://github.com/fvde)[![7490199](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7490199?v=4&w=50&h=50&mask=circle)](https://github.com/Lundez)[![10345184](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10345184?v=4&w=50&h=50&mask=circle)](https://github.com/hasukmistry)[![29532638](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/29532638?v=4&w=50&h=50&mask=circle)](https://github.com/rokrokss)[![14008978](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/14008978?v=4&w=50&h=50&mask=circle)](https://github.com/jeremydonahue)[![9272376](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/9272376?v=4&w=50&h=50&mask=circle)](https://github.com/jonasdebeukelaer)[![1633460](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1633460?v=4&w=50&h=50&mask=circle)](https://github.com/jmcarp)[![3033592](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3033592?v=4&w=50&h=50&mask=circle)](https://github.com/kazesberger)[![19229049](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/19229049?v=4&w=50&h=50&mask=circle)](https://github.com/lsena)[![36594527](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/36594527?v=4&w=50&h=50&mask=circle)](https://github.com/mishmanners)[![8755869](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8755869?v=4&w=50&h=50&mask=circle)](https://github.com/paravatha)[![6528449](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6528449?v=4&w=50&h=50&mask=circle)](https://github.com/uschi2000)[![790725](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/790725?v=4&w=50&h=50&mask=circle)](https://github.com/rodrigobaron)[![576968](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/576968?v=4&w=50&h=50&mask=circle)](https://github.com/ronaldosaheki)[![36827492](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/36827492?v=4&w=50&h=50&mask=circle)](https://github.com/shahwar9)[![133936](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/133936?v=4&w=50&h=50&mask=circle)](https://github.com/shihgianlee)[![10438373](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10438373?v=4&w=50&h=50&mask=circle)](https://github.com/SKalt)[![33272587](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/33272587?v=4&w=50&h=50&mask=circle)](https://github.com/samuel-sujith)[![580328](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/580328?v=4&w=50&h=50&mask=circle)](https://github.com/ilikedata)[![1027207](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1027207?v=4&w=50&h=50&mask=circle)](https://github.com/orf)[![16526627](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16526627?v=4&w=50&h=50&mask=circle)](https://github.com/vijaysaravana)[![10526540](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10526540?v=4&w=50&h=50&mask=circle)](https://github.com/yubofredwang)[![5346764](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5346764?v=4&w=50&h=50&mask=circle)](https://github.com/fsz285)[![22917741](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/22917741?v=4&w=50&h=50&mask=circle)](https://github.com/gigi-at-zymergen)[![40143026](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/40143026?v=4&w=50&h=50&mask=circle)](https://github.com/hampusrosvall)[![77197126](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/77197126?v=4&w=50&h=50&mask=circle)](https://github.com/hitarth01)[![300315](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/300315?v=4&w=50&h=50&mask=circle)](https://github.com/jcourteau)[![106815366](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/106815366?v=4&w=50&h=50&mask=circle)](https://github.com/jw0515)[![1568889](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1568889?v=4&w=50&h=50&mask=circle)](https://github.com/leorleor)[![937967](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/937967?v=4&w=50&h=50&mask=circle)](https://github.com/moose007)[![114232404](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/114232404?v=4&w=50&h=50&mask=circle)](https://github.com/sanjaychouhan-adf)[![14996868](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/14996868?v=4&w=50&h=50&mask=circle)](https://github.com/v01dXYZ)[![93438190](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/93438190?v=4&w=50&h=50&mask=circle)](https://github.com/wanderer163)[![1043051](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1043051?v=4&w=50&h=50&mask=circle)](https://github.com/kylewaynebenson)[![21953442](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/21953442?v=4&w=50&h=50&mask=circle)](https://github.com/Gui11aum3)[![16461847](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16461847?v=4&w=50&h=50&mask=circle)](https://github.com/JakeNeyer)[![64676594](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/64676594?v=4&w=50&h=50&mask=circle)](https://github.com/abhijeet007rocks8)[![1174730](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1174730?v=4&w=50&h=50&mask=circle)](https://github.com/mouuff)[![20135478](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20135478?v=4&w=50&h=50&mask=circle)](https://github.com/Juneezee)[![151841](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/151841?v=4&w=50&h=50&mask=circle)](https://github.com/goodgravy)[![44368997](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/44368997?v=4&w=50&h=50&mask=circle)](https://github.com/radiantly)[![36989112](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/36989112?v=4&w=50&h=50&mask=circle)](https://github.com/nishantwrp)[![7144772](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7144772?v=4&w=50&h=50&mask=circle)](https://github.com/sighingnow)[![697033](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/697033?v=4&w=50&h=50&mask=circle)](https://github.com/vglocus)[![2845540](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2845540?v=4&w=50&h=50&mask=circle)](https://github.com/RustedBones)[![4056828](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4056828?v=4&w=50&h=50&mask=circle)](https://github.com/pablocasares)[![1071153](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1071153?v=4&w=50&h=50&mask=circle)](https://github.com/evdokim)[![5732047](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5732047?v=4&w=50&h=50&mask=circle)](https://github.com/stormy-ua)[![471021](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/471021?v=4&w=50&h=50&mask=circle)](https://github.com/marschall)[![71284190](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/71284190?v=4&w=50&h=50&mask=circle)](https://github.com/gdungca-fn)[![26265392](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/26265392?v=4&w=50&h=50&mask=circle)](https://github.com/ttanay)[![85021780](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/85021780?v=4&w=50&h=50&mask=circle)](https://github.com/Abdullahi-Ahmed)[![48512530](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/48512530?v=4&w=50&h=50&mask=circle)](https://github.com/amaleelhamri)[![3275593](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3275593?v=4&w=50&h=50&mask=circle)](https://github.com/pradyunsg)[![66853113](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/in/68672?v=4&w=50&h=50&mask=circle)](https://github.com/apps/pre-commit-ci)[![1834509](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1834509?v=4&w=50&h=50&mask=circle)](https://github.com/jdknight)[![107893](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/107893?v=4&w=50&h=50&mask=circle)](https://github.com/kmike)[![1324225](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1324225?v=4&w=50&h=50&mask=circle)](https://github.com/hugovk)[![1300022](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1300022?v=4&w=50&h=50&mask=circle)](https://github.com/sirosen)[![244656](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/244656?v=4&w=50&h=50&mask=circle)](https://github.com/humitos)[![467294](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/467294?v=4&w=50&h=50&mask=circle)](https://github.com/bastimeyer)[![71486](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/71486?v=4&w=50&h=50&mask=circle)](https://github.com/asmeurer)[![20280470](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20280470?v=4&w=50&h=50&mask=circle)](https://github.com/drewyh)[![3533182](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3533182?v=4&w=50&h=50&mask=circle)](https://github.com/polyzen)[![199429](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/199429?v=4&w=50&h=50&mask=circle)](https://github.com/dvarrazzo)[![1032633](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1032633?v=4&w=50&h=50&mask=circle)](https://github.com/dbitouze)[![1313087](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1313087?v=4&w=50&h=50&mask=circle)](https://github.com/idryzhov)[![521097](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/521097?v=4&w=50&h=50&mask=circle)](https://github.com/pauloxnet)[![63936253](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/63936253?v=4&w=50&h=50&mask=circle)](https://github.com/ichard26)[![18519037](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18519037?v=4&w=50&h=50&mask=circle)](https://github.com/sethmlarson)[![413772](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/413772?v=4&w=50&h=50&mask=circle)](https://github.com/graingert)[![11478411](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11478411?v=4&w=50&h=50&mask=circle)](https://github.com/stonecharioteer)[![6739793](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6739793?v=4&w=50&h=50&mask=circle)](https://github.com/yeraydiazdiaz)[![83365562](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/83365562?v=4&w=50&h=50&mask=circle)](https://github.com/eviau-sat)[![6670894](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6670894?v=4&w=50&h=50&mask=circle)](https://github.com/rozsasarpi)[![86675](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/86675?v=4&w=50&h=50&mask=circle)](https://github.com/estan)[![4748863](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4748863?v=4&w=50&h=50&mask=circle)](https://github.com/pseudomuto)[![181308](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/181308?v=4&w=50&h=50&mask=circle)](https://github.com/htdvisser)[![1390277](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1390277?v=4&w=50&h=50&mask=circle)](https://github.com/jacobtolar)[![1391982](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1391982?v=4&w=50&h=50&mask=circle)](https://github.com/ezimanyi)[![3880001](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3880001?v=4&w=50&h=50&mask=circle)](https://github.com/lpabon)[![770392](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/770392?v=4&w=50&h=50&mask=circle)](https://github.com/ArcEye)[![6178510](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6178510?v=4&w=50&h=50&mask=circle)](https://github.com/mingrammer)[![5111931](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5111931?v=4&w=50&h=50&mask=circle)](https://github.com/aschrijver)[![873434](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/873434?v=4&w=50&h=50&mask=circle)](https://github.com/panzerfahrer)[![16724](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16724?v=4&w=50&h=50&mask=circle)](https://github.com/glasser)[![17330872](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17330872?v=4&w=50&h=50&mask=circle)](https://github.com/murph0)[![419419](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/419419?v=4&w=50&h=50&mask=circle)](https://github.com/zetaron)[![1014](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1014?v=4&w=50&h=50&mask=circle)](https://github.com/sunfmin)[![504507](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/504507?v=4&w=50&h=50&mask=circle)](https://github.com/guozheng)[![8841470](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8841470?v=4&w=50&h=50&mask=circle)](https://github.com/suusan2go)[![901479](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/901479?v=4&w=50&h=50&mask=circle)](https://github.com/mhaberler)[![6400253](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6400253?v=4&w=50&h=50&mask=circle)](https://github.com/s4ichi)[![353644](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/353644?v=4&w=50&h=50&mask=circle)](https://github.com/dreampuf)[![12421077](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/12421077?v=4&w=50&h=50&mask=circle)](https://github.com/UnicodingUnicorn)[![809865](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/809865?v=4&w=50&h=50&mask=circle)](https://github.com/philiptzou)[![19378](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/19378?v=4&w=50&h=50&mask=circle)](https://github.com/timabell)[![1113245](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1113245?v=4&w=50&h=50&mask=circle)](https://github.com/jasonhancock)[![101659](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/101659?v=4&w=50&h=50&mask=circle)](https://github.com/matryer)[![4730508](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/4730508?v=4&w=50&h=50&mask=circle)](https://github.com/piotrrojek)[![33036160](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/33036160?v=4&w=50&h=50&mask=circle)](https://github.com/jasonsattler)[![470810](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/470810?v=4&w=50&h=50&mask=circle)](https://github.com/sbward)[![7592392](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7592392?v=4&w=50&h=50&mask=circle)](https://github.com/Pisush)[![94814](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/94814?v=4&w=50&h=50&mask=circle)](https://github.com/tamalsaha)[![8147854](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8147854?v=4&w=50&h=50&mask=circle)](https://github.com/marianina8)[![1005](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1005?v=4&w=50&h=50&mask=circle)](https://github.com/ernesto-jimenez)[![17263167](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17263167?v=4&w=50&h=50&mask=circle)](https://github.com/jsteenb2)[![2807589](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2807589?v=4&w=50&h=50&mask=circle)](https://github.com/darwayne)[![1683714](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1683714?v=4&w=50&h=50&mask=circle)](https://github.com/naysayer)[![6386887](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6386887?v=4&w=50&h=50&mask=circle)](https://github.com/AgrimPrasad)[![615811](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/615811?v=4&w=50&h=50&mask=circle)](https://github.com/dahernan)[![75184](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/75184?v=4&w=50&h=50&mask=circle)](https://github.com/jtarchie)[![469669](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/469669?v=4&w=50&h=50&mask=circle)](https://github.com/jdtobe)[![28523](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/28523?v=4&w=50&h=50&mask=circle)](https://github.com/alrs)[![10113228](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10113228?v=4&w=50&h=50&mask=circle)](https://github.com/urisimchoni)[![5751464](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5751464?v=4&w=50&h=50&mask=circle)](https://github.com/Xercoy)[![2405410](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2405410?v=4&w=50&h=50&mask=circle)](https://github.com/marbergq)[![5082160](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5082160?v=4&w=50&h=50&mask=circle)](https://github.com/anothrNick)[![11335612](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11335612?v=4&w=50&h=50&mask=circle)](https://github.com/fermoya)[![23391642](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/23391642?v=4&w=50&h=50&mask=circle)](https://github.com/sbe-arg)[![1024762](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1024762?v=4&w=50&h=50&mask=circle)](https://github.com/PeerXu)[![7390781](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7390781?v=4&w=50&h=50&mask=circle)](https://github.com/reececomo)[![49680](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/49680?v=4&w=50&h=50&mask=circle)](https://github.com/dmerrick)[![87524](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/87524?v=4&w=50&h=50&mask=circle)](https://github.com/andrewcole)[![866505](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/866505?v=4&w=50&h=50&mask=circle)](https://github.com/phish108)[![2611549](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2611549?v=4&w=50&h=50&mask=circle)](https://github.com/endrjuskr)[![49961058](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/49961058?v=4&w=50&h=50&mask=circle)](https://github.com/bevans-HD)[![5655837](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5655837?v=4&w=50&h=50&mask=circle)](https://github.com/gukoff)[![8320753](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8320753?v=4&w=50&h=50&mask=circle)](https://github.com/lovromazgon)[![16513382](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16513382?v=4&w=50&h=50&mask=circle)](https://github.com/117)[![3807434](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/3807434?v=4&w=50&h=50&mask=circle)](https://github.com/tomsolem)[![118945041](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/118945041?v=4&w=50&h=50&mask=circle)](https://github.com/vq-ambiata)[![8232503](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8232503?v=4&w=50&h=50&mask=circle)](https://github.com/sjauld)[![69170839](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/69170839?v=4&w=50&h=50&mask=circle)](https://github.com/adam-berrio)[![6388483](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6388483?v=4&w=50&h=50&mask=circle)](https://github.com/zsedem)[![8296645](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8296645?v=4&w=50&h=50&mask=circle)](https://github.com/imdanielsp)[![17337515](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/17337515?v=4&w=50&h=50&mask=circle)](https://github.com/fabricepipart)[![10090384](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/10090384?v=4&w=50&h=50&mask=circle)](https://github.com/ivanpk)[![2302957](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/2302957?v=4&w=50&h=50&mask=circle)](https://github.com/JeremyLWright)[![995707](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/995707?v=4&w=50&h=50&mask=circle)](https://github.com/OskarStark)[![25486791](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25486791?v=4&w=50&h=50&mask=circle)](https://github.com/pavyarov)[![5067549](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/5067549?v=4&w=50&h=50&mask=circle)](https://github.com/pellared)[![53085803](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/53085803?v=4&w=50&h=50&mask=circle)](https://github.com/cuttingedge1109)[![62775347](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/62775347?v=4&w=50&h=50&mask=circle)](https://github.com/okozachenko1203)[![25625597](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25625597?v=4&w=50&h=50&mask=circle)](https://github.com/zero-below)[![282792](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/282792?v=4&w=50&h=50&mask=circle)](https://github.com/asford)[![38894122](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/38894122?v=4&w=50&h=50&mask=circle)](https://github.com/bmcconeghy)[![16698198](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/16698198?v=4&w=50&h=50&mask=circle)](https://github.com/conda-forge-admin)[![36490558](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/36490558?v=4&w=50&h=50&mask=circle)](https://github.com/regro-cf-autotick-bot)[![79913779](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/in/102928?v=4&w=50&h=50&mask=circle)](https://github.com/apps/conda-forge-curator)[![41898282](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/in/15368?v=4&w=50&h=50&mask=circle)](https://github.com/apps/github-actions)[![18567580](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18567580?v=4&w=50&h=50&mask=circle)](https://github.com/conda-forge-linter)[![26092524](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/26092524?v=4&w=50&h=50&mask=circle)](https://github.com/fellhorn) + + +## License + +Flyte is available under the Apache License 2.0. Use it wisely. diff --git a/eks/README.md b/eks/README.md deleted file mode 100644 index f0e7c0d611..0000000000 --- a/eks/README.md +++ /dev/null @@ -1,25 +0,0 @@ - -Steps: -- Make sure kubectl and aws-cli are installed and working -- Make sure terraform is installed and working and references aws-cli permissions -- Run Terraform files. (There seems to be a race condition in one of the IAM role creation steps - you may need to run it twice.) -- Copy or update the kubectl config file and switch to that context. -- Create the webhook - - Create ECR repo for the webhook - - Build the image and push - - Run the make cluster-up command with the right image -- Create the example 2048 game on the EKS IAM page linked above. Keep in mind that even after an address shows up in the ingress, it may take a while to provision. -- Delete the game -- Create the spare datacatalog reference in the db. -- Follow the [Installation portion](https://github.com/aws/amazon-eks-pod-identity-webhook/blob/95808cffe6d801822dae122f2f2c87a258d70bb8/README.md#installation) of the webhook readme. You will need to make sure to use your own AWS account number, and will also need to build your own image and upload it to your ECR, which will probably require you to create that repository in your ECR. -- Go through all the overlays in the `kustomize/overlays/eks` folder and make sure all the service accounts and RDS addresses reference yours. (Do a grep for `111222333456` and `456123e6ivib`). -- Install Flyte with `kubectl apply -f deployment/eks/flyte_generated.yaml` - -This is the webhook used to inject IAM role credentials into pods. -https://github.com/aws/amazon-eks-pod-identity-webhook - -This is how you get pods to use the proper roles. (This is the KIAM replacement.) -https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html -The implementation of these steps is done for you in the `alb-ingress` submodule. - - diff --git a/eks/tf/main.tf b/eks/tf/main.tf deleted file mode 100644 index 0e05fc6d6b..0000000000 --- a/eks/tf/main.tf +++ /dev/null @@ -1,161 +0,0 @@ -terraform { - required_version = ">= 0.12.0" -} - -provider "aws" { - profile = "default" - region = var.region -} - -# Use the internal module to create an RDS instance with a user-supplied VPC -module "flyte_rds" { - source = "./modules/flyte-rds" - - rds_vpc = var.rds_vpc -} - -# Use the internal module to create an EKS cluster, which has its own VPC -module "flyte_eks" { - source = "./modules/flyte-eks" - - eks_cluster_name = var.eks_cluster_name -} - -# Get information about the two VPCs -data "aws_vpc" "rds_vpc" { - id = var.rds_vpc -} - -data "aws_vpc" "eks_vpc" { - id = module.flyte_eks.eks_vpc_id -} - -# Get information about the RDS instance -data "aws_db_instance" "flyte_rds" { - db_instance_identifier = module.flyte_rds.admin_rds_instance_id -} - -resource "aws_vpc_peering_connection" "eks_to_main_peering" { - peer_vpc_id = var.rds_vpc - vpc_id = module.flyte_eks.eks_vpc_id - auto_accept = true - - tags = { - Name = "VPC peering connection between Flyte RDS and EKS" - } - - accepter { - allow_remote_vpc_dns_resolution = true - } - - requester { - allow_remote_vpc_dns_resolution = true - } -} - -data "aws_route_table" "eks_public_route_table" { - vpc_id = module.flyte_eks.eks_vpc_id - filter { - name = "tag:Name" - values = ["${var.eks_cluster_name}-vpc-public"] - } -} - -resource "aws_route" "route_rds_cidr" { - route_table_id = data.aws_route_table.eks_public_route_table.id - destination_cidr_block = data.aws_vpc.rds_vpc.cidr_block - vpc_peering_connection_id = aws_vpc_peering_connection.eks_to_main_peering.id -} - -# Add a rule to the RDS security group to allow access from the EKS VPC -resource "aws_security_group_rule" "allow_eks_to_rds" { - type = "ingress" - from_port = 5432 - to_port = 5432 - protocol = "tcp" - cidr_blocks = [data.aws_vpc.eks_vpc.cidr_block] - security_group_id = data.aws_db_instance.flyte_rds.vpc_security_groups[0] -} - -# The following implements the instructions set forth by: -# https://github.com/aws/amazon-eks-pod-identity-webhook/blob/95808cffe6d801822dae122f2f2c87a258d70bb8/README.md -# This is a webhook that will allow pods to assume arbitrarily constrained roles via their service account. -# TODO: This should be moved into a separate module probably but will require further refactoring as the assume role -# policy used is also used further below in the ALB ingress module. - -# Create an oidc provider using the EKS cluster's public OIDC discovery endpoint -resource "aws_iam_openid_connect_provider" "eks_oidc_connection" { - client_id_list = ["sts.amazonaws.com"] - thumbprint_list = ["9e99a48a9960b14926bb7f3b02e22da2b0ab7280"] - url = module.flyte_eks.eks_oidc_issuer -} - -locals { - issuer_parsed = regex("^arn.*(?Poidc.eks.*)", aws_iam_openid_connect_provider.eks_oidc_connection.arn) -} - -# This is the trust document that will allow pods to use roles that they specify in their service account -data "aws_iam_policy_document" "let_pods_assume_roles" { - statement { - actions = ["sts:AssumeRoleWithWebIdentity"] - - principals { - type = "Federated" - identifiers = [aws_iam_openid_connect_provider.eks_oidc_connection.arn] - } - - condition { - test = "StringLike" - variable = "${local.issuer_parsed.trailing}:sub" - - values = [ - "system:serviceaccount:*:*", - ] - } - } -} - -# Make a role for Flyte components themselves to use -resource "aws_iam_role" "flyte_operator" { - name = "flyte-operator" - assume_role_policy = data.aws_iam_policy_document.let_pods_assume_roles.json -} - - -# Make a policy document -# TODO: Scope this down later -data "aws_iam_policy_document" "all_s3_access" { - statement { - actions = [ - "s3:*", - ] - - resources = [ - "*", - ] - } -} - -# Use the policy document to create a policy -resource "aws_iam_policy" "flyte_operator_s3_access" { - name = "flyte_operator_s3_access" - path = "/" - policy = data.aws_iam_policy_document.all_s3_access.json -} - -# Attach the policy to the flyte operator role -resource "aws_iam_role_policy_attachment" "flyte_operator_s3_attach" { - role = aws_iam_role.flyte_operator.name - policy_arn = aws_iam_policy.flyte_operator_s3_access.arn -} - -module "alb_ingress" { - source = "./modules/alb-ingress" - - region = var.region - eks_cluster_name = var.eks_cluster_name - cluster_id = module.flyte_eks.cluster_id - eks_vpc_id = module.flyte_eks.eks_vpc_id - assume_role_policy_string = data.aws_iam_policy_document.let_pods_assume_roles.json -} - diff --git a/eks/tf/modules/alb-ingress/main.tf b/eks/tf/modules/alb-ingress/main.tf deleted file mode 100644 index 2624ed9c43..0000000000 --- a/eks/tf/modules/alb-ingress/main.tf +++ /dev/null @@ -1,183 +0,0 @@ -# As required by https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html -data "http" "alb_ingress_policy" { - url = "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/iam-policy.json" - - request_headers = { - Accept = "application/json" - } -} - -resource "aws_iam_policy" "k8s_alb_ingress_controller" { - name = "ALBIngressControllerIAMPolicy" - path = "/" - policy = data.http.alb_ingress_policy.body -} - -resource "aws_iam_role" "eks_alb_ingress_controller" { - name = "eks-alb-ingress-controller" - assume_role_policy = var.assume_role_policy_string -} - -# Attach the policy to the flyte operator role -resource "aws_iam_role_policy_attachment" "eks_alb_attachment" { - role = aws_iam_role.eks_alb_ingress_controller.name - policy_arn = aws_iam_policy.k8s_alb_ingress_controller.arn -} - -data "aws_eks_cluster" "cluster" { - name = var.cluster_id -} - -data "aws_eks_cluster_auth" "cluster" { - name = var.cluster_id -} - -provider "kubernetes" { - host = data.aws_eks_cluster.cluster.endpoint - cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data) - token = data.aws_eks_cluster_auth.cluster.token - load_config_file = false - version = "~> 1.9" -} - -resource "kubernetes_cluster_role" "alb_ingress_controller" { - metadata { - name = "alb-ingress-controller" - - labels = { - "app.kubernetes.io/name" : "alb-ingress-controller" - } - } - - rule { - api_groups = [ - "", - "extensions", - ] - resources = [ - "configmaps", - "endpoints", - "events", - "ingresses", - "ingresses/status", - "services", - ] - verbs = [ - "create", - "get", - "list", - "update", - "watch", - "patch", - ] - } - - rule { - api_groups = [ - "", - "extensions", - ] - resources = [ - "nodes", - "pods", - "secrets", - "services", - "namespaces", - ] - verbs = [ - "get", - "list", - "watch", - ] - } -} - -resource "kubernetes_service_account" "alb_ingress_controller" { - metadata { - name = "alb-ingress-controller" - namespace = "kube-system" - - labels = { - "app.kubernetes.io/name" = "alb-ingress-controller" - } - - annotations = { - "eks.amazonaws.com/role-arn" = aws_iam_role.eks_alb_ingress_controller.arn - } - } -} - -resource "kubernetes_cluster_role_binding" "alb_ingress_controller" { - metadata { - name = "alb-ingress-controller" - - labels = { - "app.kubernetes.io/name" = "alb-ingress-controller" - } - } - - role_ref { - api_group = "rbac.authorization.k8s.io" - kind = "ClusterRole" - name = kubernetes_cluster_role.alb_ingress_controller.metadata[0].name - } - - subject { - kind = "ServiceAccount" - name = kubernetes_service_account.alb_ingress_controller.metadata[0].name - namespace = "kube-system" - } -} - -resource "kubernetes_deployment" "alb_ingress_controller" { - metadata { - name = "alb-ingress-controller" - namespace = "kube-system" - - labels = { - "app.kubernetes.io/name" = "alb-ingress-controller" - } - } - - spec { - selector { - match_labels = { - "app.kubernetes.io/name" = "alb-ingress-controller" - } - } - - template { - metadata { - name = "alb-ingress-controller" - namespace = "kube-system" - - labels = { - "app.kubernetes.io/name" = "alb-ingress-controller" - } - } - - spec { - container { - name = "alb-ingress-controller" - image = "docker.io/amazon/aws-alb-ingress-controller:v1.1.4" - args = [ - "--ingress-class=alb", - "--cluster-name=${var.eks_cluster_name}", - "--aws-vpc-id=${var.eks_vpc_id}", - "--aws-region=${var.region}", - "--feature-gates=waf=false", - ] - } - - service_account_name = kubernetes_service_account.alb_ingress_controller.metadata[0].name - automount_service_account_token = true - - node_selector = { - "beta.kubernetes.io/os" = "linux" - } - } - } - } -} - - diff --git a/eks/tf/modules/alb-ingress/outputs.tf b/eks/tf/modules/alb-ingress/outputs.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/eks/tf/modules/alb-ingress/variables.tf b/eks/tf/modules/alb-ingress/variables.tf deleted file mode 100644 index 43a0e9219c..0000000000 --- a/eks/tf/modules/alb-ingress/variables.tf +++ /dev/null @@ -1,20 +0,0 @@ -variable "region" { - type = string -} - -variable "eks_cluster_name" { - type = string -} - -variable "eks_vpc_id" { - type = string -} - -variable "cluster_id" { - type = string -} - -variable "assume_role_policy_string" { - type = string -} - diff --git a/eks/tf/modules/flyte-eks/main.tf b/eks/tf/modules/flyte-eks/main.tf deleted file mode 100644 index edecace66a..0000000000 --- a/eks/tf/modules/flyte-eks/main.tf +++ /dev/null @@ -1,111 +0,0 @@ -data "aws_eks_cluster" "cluster" { - name = module.eks.cluster_id -} - -data "aws_availability_zones" "available" { -} - -resource "aws_security_group" "worker_group_mgmt_one" { - name_prefix = "worker_group_mgmt_one" - vpc_id = module.vpc.vpc_id - - ingress { - from_port = 22 - to_port = 22 - protocol = "tcp" - - cidr_blocks = [ - "10.0.0.0/8", - ] - } -} - -resource "aws_security_group" "worker_group_mgmt_two" { - name_prefix = "worker_group_mgmt_two" - vpc_id = module.vpc.vpc_id - - ingress { - from_port = 22 - to_port = 22 - protocol = "tcp" - - cidr_blocks = [ - "192.168.0.0/16", - ] - } -} - -resource "aws_security_group" "all_worker_mgmt" { - name_prefix = "all_worker_management" - vpc_id = module.vpc.vpc_id - - ingress { - from_port = 22 - to_port = 22 - protocol = "tcp" - - cidr_blocks = [ - "10.0.0.0/8", - "172.16.0.0/12", - "192.168.0.0/16", - ] - } -} - -module "vpc" { - source = "git::https://github.com/terraform-aws-modules/terraform-aws-vpc.git?ref=v2.6.0" - name = "${var.eks_cluster_name}-vpc" - - cidr = "10.0.0.0/16" - azs = data.aws_availability_zones.available.names - private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] - public_subnets = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"] - enable_nat_gateway = true - single_nat_gateway = true - enable_dns_hostnames = true - - public_subnet_tags = { - "kubernetes.io/cluster/${var.eks_cluster_name}" = "shared" - "kubernetes.io/role/elb" = "1" - } - - private_subnet_tags = { - "kubernetes.io/cluster/${var.eks_cluster_name}" = "shared" - "kubernetes.io/role/internal-elb" = "1" - } -} - -module "eks" { - source = "git::https://github.com/terraform-aws-modules/terraform-aws-eks.git?ref=v11.0.0" - - cluster_name = var.eks_cluster_name - subnets = module.vpc.private_subnets - - tags = { - Environment = "test" - GithubRepo = "terraform-aws-eks" - GithubOrg = "terraform-aws-modules" - } - - vpc_id = module.vpc.vpc_id - - worker_groups = [ - { - name = "worker-group-1" - instance_type = "t2.small" - additional_userdata = "flyte t2.small" - asg_desired_capacity = 2 - additional_security_group_ids = [aws_security_group.worker_group_mgmt_one.id] - }, - { - name = "worker-group-2" - instance_type = "t2.medium" - additional_userdata = "flyte t2.medium" - additional_security_group_ids = [aws_security_group.worker_group_mgmt_two.id] - asg_desired_capacity = 1 - }, - ] - - worker_additional_security_group_ids = [aws_security_group.all_worker_mgmt.id] -} - diff --git a/eks/tf/modules/flyte-eks/outputs.tf b/eks/tf/modules/flyte-eks/outputs.tf deleted file mode 100644 index 9e7cd30b94..0000000000 --- a/eks/tf/modules/flyte-eks/outputs.tf +++ /dev/null @@ -1,36 +0,0 @@ -output "cluster_endpoint" { - description = "Endpoint for EKS control plane." - value = module.eks.cluster_endpoint -} - -output "cluster_security_group_id" { - description = "Security group ids attached to the cluster control plane." - value = module.eks.cluster_security_group_id -} - -output "cluster_id" { - description = "The id of the EKS cluster created" - value = module.eks.cluster_id -} - -output "kubectl_config" { - description = "kubectl config as generated by the module." - value = module.eks.kubeconfig -} - -output "config_map_aws_auth" { - description = "A kubernetes configuration to authenticate to this EKS cluster." - value = module.eks.config_map_aws_auth -} - -output "eks_vpc_id" { - description = "The id of the VPC created for the EKS cluster" - value = module.vpc.vpc_id -} - -output "eks_oidc_issuer" { - # Basically this is the output of this command - # aws --region us-west-2 eks describe-cluster --name your-cluster --query cluster.identity.oidc.issuer - description = "Issuer endpoint provided by EKS" - value = data.aws_eks_cluster.cluster.identity.0.oidc.0.issuer -} diff --git a/eks/tf/modules/flyte-eks/variables.tf b/eks/tf/modules/flyte-eks/variables.tf deleted file mode 100644 index 810e6fd537..0000000000 --- a/eks/tf/modules/flyte-eks/variables.tf +++ /dev/null @@ -1,4 +0,0 @@ -variable "eks_cluster_name" { - type = string -} - diff --git a/eks/tf/modules/flyte-rds/main.tf b/eks/tf/modules/flyte-rds/main.tf deleted file mode 100644 index adceaad42d..0000000000 --- a/eks/tf/modules/flyte-rds/main.tf +++ /dev/null @@ -1,22 +0,0 @@ -resource "aws_rds_cluster_instance" "flyte_instances" { - count = 1 - identifier = "flyteadmin-instances-${count.index}" - cluster_identifier = aws_rds_cluster.flyteadmin.id - instance_class = "db.t3.medium" - engine = "aurora-postgresql" - engine_version = "11.6" -} - -resource "aws_rds_cluster" "flyteadmin" { - cluster_identifier = "flyteadmin-cluster" - engine = "aurora-postgresql" - engine_version = "11.6" - availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] - database_name = "flyteadmin" - master_username = "flyteadmin" - master_password = "spongebob" - backup_retention_period = 1 - preferred_backup_window = "07:00-09:00" - skip_final_snapshot = true -} - diff --git a/eks/tf/modules/flyte-rds/outputs.tf b/eks/tf/modules/flyte-rds/outputs.tf deleted file mode 100644 index 10a40713e2..0000000000 --- a/eks/tf/modules/flyte-rds/outputs.tf +++ /dev/null @@ -1,8 +0,0 @@ -output "admin_rds_name" { - value = aws_rds_cluster.flyteadmin.endpoint -} - -output "admin_rds_instance_id" { - value = aws_rds_cluster_instance.flyte_instances[0].identifier -} - diff --git a/eks/tf/modules/flyte-rds/variables.tf b/eks/tf/modules/flyte-rds/variables.tf deleted file mode 100644 index 7f569fa0fc..0000000000 --- a/eks/tf/modules/flyte-rds/variables.tf +++ /dev/null @@ -1,4 +0,0 @@ -variable "rds_vpc" { - type = string -} - diff --git a/eks/tf/outputs.tf b/eks/tf/outputs.tf deleted file mode 100644 index 7e7105832a..0000000000 --- a/eks/tf/outputs.tf +++ /dev/null @@ -1,49 +0,0 @@ -output "rds_vpc_cidr_block" { - value = data.aws_vpc.rds_vpc.cidr_block -} - -output "cluster_endpoint" { - description = "Endpoint for EKS control plane." - value = module.flyte_eks.cluster_endpoint -} - -output "cluster_security_group_id" { - description = "Security group ids attached to the cluster control plane." - value = module.flyte_eks.cluster_security_group_id -} - -output "kubectl_config" { - description = "kubectl config as generated by the module." - value = module.flyte_eks.kubectl_config -} - -output "config_map_aws_auth" { - description = "A kubernetes configuration to authenticate to this EKS cluster." - value = module.flyte_eks.config_map_aws_auth -} - -output "eks_vpc_id" { - description = "The id of the VPC created for the EKS cluster" - value = module.flyte_eks.eks_vpc_id -} - -output "admin_rds_name" { - value = module.flyte_rds.admin_rds_name -} - -output "admin_rds_instance_id" { - value = module.flyte_rds.admin_rds_instance_id -} - -output "eks_cluster_oidc_connection_arn" { - value = aws_iam_openid_connect_provider.eks_oidc_connection.arn -} - -output "eks_cluster_oidc" { - value = module.flyte_eks.eks_oidc_issuer -} - -output "role_arn" { - value = aws_iam_role.flyte_operator.arn -} - diff --git a/eks/tf/values.auto.tfvars b/eks/tf/values.auto.tfvars deleted file mode 100644 index 68f3e57973..0000000000 --- a/eks/tf/values.auto.tfvars +++ /dev/null @@ -1,4 +0,0 @@ -region = "us-west-2" -rds_vpc = "vpc-1234567a" -eks_cluster_name = "flyte-demo" - diff --git a/eks/tf/variables.tf b/eks/tf/variables.tf deleted file mode 100644 index 640bb8c6da..0000000000 --- a/eks/tf/variables.tf +++ /dev/null @@ -1,12 +0,0 @@ -variable "region" { - type = string -} - -variable "rds_vpc" { - type = string -} - -variable "eks_cluster_name" { - type = string -} - diff --git a/rsts/community/contribute.rst b/rsts/community/contribute.rst index d018dadac9..942fee29b1 100644 --- a/rsts/community/contribute.rst +++ b/rsts/community/contribute.rst @@ -13,15 +13,15 @@ Here are some guidelines for you to follow, which will make your first and follo TL;DR: Find the repo-specific contribution guidelines in the `Component Reference <#component-reference>`__ section. -๐Ÿ’ป Becoming a Contributor +๐Ÿ’ป Becoming a contributor ========================= -An issue tagged with ``good first issue`` is the best place to start for first-time contributors. You can find them `here `__. +An issue tagged with `good first issue `__ is the best place to start for first-time contributors. **Appetizer for every repo: Fork and clone the concerned repository. Create a new branch on your fork and make the required changes. Create a pull request once your work is ready for review.** .. note:: - To open a pull request, follow `this guide `__. + To open a pull request, refer to `GitHub's guide `__ for detailed instructions. Example PR for your reference: `GitHub PR `__. A couple of checks are introduced to help maintain the robustness of the project. @@ -34,7 +34,8 @@ On a side note, format your Go code with ``golangci-lint`` followed by ``goimpor If make targets are not available, you can manually format the code. Refer to `Effective Go `__, `Black `__, and `Isort `__ for full coding standards. -As you become more involved with the project you may be able to be added as a contributor to the repos you're working on, but there is a medium term effort to move all development to forks โœจ. +As you become more involved with the project, you may be able to be added as a contributor to the repos you're working on, +but there is a medium term effort to move all development to forks. ๐Ÿ“ƒ Documentation ================ @@ -46,14 +47,7 @@ For API- and code-related content, it extracts docstrings from the code files. To get started, refer to the `reStructuredText reference `__. -For minor edits that donโ€™t require a local setup, you can edit the GitHub page in the documentation to propose improvements. - -The edit option can be found at the bottom of a page, as shown below. - -.. figure:: https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/contribution_guide/docs_edit.png - :alt: GitHub edit option for Documentation - :align: center - :figclass: align-center +For minor edits that don't require a local setup, you can edit the GitHub page in the documentation to propose improvements. Intersphinx *********** @@ -138,18 +132,17 @@ Output: :py:meth:`Method ` -๐Ÿงฑ Component Reference +๐Ÿงฑ Component reference ====================== -To understand how the below components interact with each other, refer to :ref:`Understand the lifecycle of a workflow ` +To understand how the below components interact with each other, refer to :ref:`Understand the lifecycle of a workflow `. .. figure:: https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/contribution_guide/dependency_graph.png :alt: Dependency graph between various flyteorg repos :align: center :figclass: align-center - The dependency graph between various flyte.org repos - + The dependency graph between various flyte repos ``flyte`` ********* @@ -291,54 +284,73 @@ To understand how the below components interact with each other, refer to :ref:` * - **Guidelines**: Refer to the `FlyteCTL Contribution Guide `__ -๐Ÿ”ฎ Recommended Iteration Cycle +๐Ÿ”ฎ Recommended iteration cycle ============================== -As you may have read in other parts of the documentation, this repo contains go code as well that pulls in all the backend components (admin, propeller, data catalog, console) into one executable. -The Flyte team is also working on migrating the core backend repositories into one repo, some time in 2023. For the time being, you can still contribute by making changes to the individual repos, and then bringing them into this ``flyte`` repo. This setup works well for backend golang development, but is not tested for ``flyteconsole`` development. That development cycle will look a bit different. This setup here will allow you to run the Flyte binary from your IDE, hitting any breakpoints you may have, but will connect you to all the other resources of the demo environment (like postgres, rds). -Setup -***** +As you may have already read in other parts of the documentation, the `Flyte repository `__ includes Go code +that integrates all backend components (admin, propeller, data catalog, console) into a single executable. +The Flyte team is currently working on consolidating the core backend repositories into one repository, which is expected to be completed by 2023. +In the meantime, you can contribute to the individual repositories and then merge your changes into the `Flyte repository `__. +This setup is suitable for Go-based backend development, but it has not been tested for Flyteconsole development, which has a different development cycle. +Nonetheless, this setup allows you to run the Flyte binary from your IDE, enabling you to debug your code effectively by setting breakpoints. +Additionally, this setup connects you to all other resources in the demo environment, such as PostgreSQL and RDS. -Dev Mode Cluster ----------------- -To launch the dependencies, teardown any old sandboxes you may have, and then run :: +Dev mode cluster +**************** + +To launch the dependencies, teardown any old sandboxes you may have, and then run: - ``flytectl demo start --dev`` +.. code-block:: -This will run the demo environment but without Flyte itself. This makes it so that you the developer can run it later, on your host machine. + flytectl demo start --dev + +This command will launch the demo environment without running Flyte. By doing so, developers can run Flyte later on their host machine. Set up Flyte configuration --------------------------- -#. Copy the file ``flyte-single-binary-local.yaml`` to ``~/.flyte/local-dev-config.yaml`` -#. Replace instances of ``$HOME`` with the real path of your home directory. +************************** + +#. Copy the file ``flyte-single-binary-local.yaml`` to ``~/.flyte/local-dev-config.yaml``. +#. Replace occurrences of ``$HOME`` with the actual path of your home directory. -Cluster Resources ------------------ -You'll notice one of the entries in the config is ``cluster_resources.templatePath``. In this folder you should put the templates for the cluster resource controller to use. For now, it's okay to just start with the namespace one. Create a file called ``~/.flyte/cluster-resource-templates/00_namespace.yaml`` with the following :: +Cluster resources +***************** - .. literalinclude:: ../../charts/flyte-binary/eks-production.yaml - :lines: 81-85 +One of the configuration entries you will notice is ``cluster_resources.templatePath``. +This folder should contain the templates that the cluster resource controller will use. +To begin, you can create a file called ``~/.flyte/cluster-resource-templates/00_namespace.yaml`` with the following content: -Pull Console Artifacts ----------------------- -Run the following command from the base folder of this repo to pull in the static assets for Flyteconsole :: +.. literalinclude:: ../../charts/flyte-binary/eks-production.yaml + :lines: 81-87 + +Pull console artifacts +********************** + +Run the following command from the base folder of the Flyte repository to pull in the static assets for Flyteconsole: + +.. code-block:: make cmd/single/dist -Build & Iterate ---------------- -Update using ``go get github.com/flyteorg/&gitsha`` to bring in the code of the component you're testing. From there, you can run :: +Build and iterate +***************** + +To bring in the code of the component you are testing, use the command go get ``github.com/flyteorg/&gitsha``. +Once you have done that, you can run the following command: + +.. code-block:: POD_NAMESPACE=flyte go run -tags console cmd/main.go start --config ~/.flyte/local-dev-config.yaml -The ``POD_NAMESPACE`` environment is required for the webhook to work. Of course you can create a build target in your IDE with the same effective command as well. +The ``POD_NAMESPACE`` environment variable is necessary for the webhook to function correctly. +You can also create a build target in your IDE with the same command. -After it's running, you should still be able to go to ``localhost:30080/console`` to see Flyte but now hosted by your host computer. It relies on a Docker host mapping to get the correct IP for your local host. +Once it is up and running, you can access Flyte hosted by your local machine by going to ``localhost:30080/console``. +The Docker host mapping is used to obtain the correct IP address for your local host. -๐Ÿž File an Issue +๐Ÿž File an issue ================ -`GitHub Issues `__ is used for issue tracking. The following are available issue types that you could use for filing an issue. +We use `GitHub Issues `__ for issue tracking. The following issue types are available for filing an issue: * `Plugin Request `__ * `Bug Report `__ @@ -351,7 +363,4 @@ After it's running, you should still be able to go to ``localhost:30080/console` If none of the above fit your requirements, file a `blank `__ issue. Also, add relevant labels to your issue. For example, if you are filing a Flytekit plugin request, add the ``flytekit`` label. -| - For feedback at any point in the contribution process, feel free to reach out to us on `Slack `__. - diff --git a/requirements.in b/stats/requirements.in similarity index 100% rename from requirements.in rename to stats/requirements.in diff --git a/requirements.txt b/stats/requirements.txt similarity index 100% rename from requirements.txt rename to stats/requirements.txt