├── requirements.txt ├── Dockerfile ├── images ├── .DS_Store ├── rocket_flow_chart.png ├── rocket_mental_model.png └── rocket_mental_model_A.png ├── .gitignore ├── dags └── rockets │ ├── images │ ├── pslv_image_20190224012254.jpeg │ ├── kuaizhou_image_20191027094423.jpeg │ ├── soyuz_2.1b_image_20230802085331.jpg │ ├── cz-6a_liftoff__image_20241020123401.jpg │ ├── falcon2520925_image_20221009234147.png │ ├── cz-12_on_its_la_image_20241128132937.jpg │ ├── falcon_9_on_slc_image_20241024165956.jpg │ ├── soyuz_on_the_la_image_20241127185454.jpg │ └── long2520march25203_image_20190222031215.jpeg │ ├── includes │ ├── get_pictures.py │ └── email_sender.py │ ├── rockets.py │ └── launches │ └── launches.json ├── README.md └── docker-compose.yaml /requirements.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM apache/airflow:2.10.3 -------------------------------------------------------------------------------- /images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/images/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | configs/ 2 | logs/ 3 | plugins/ 4 | my_venv/ 5 | __pycache__/ 6 | .env 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /images/rocket_flow_chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/images/rocket_flow_chart.png -------------------------------------------------------------------------------- /images/rocket_mental_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/images/rocket_mental_model.png -------------------------------------------------------------------------------- /images/rocket_mental_model_A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/images/rocket_mental_model_A.png -------------------------------------------------------------------------------- /dags/rockets/images/pslv_image_20190224012254.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/pslv_image_20190224012254.jpeg -------------------------------------------------------------------------------- /dags/rockets/images/kuaizhou_image_20191027094423.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/kuaizhou_image_20191027094423.jpeg -------------------------------------------------------------------------------- /dags/rockets/images/soyuz_2.1b_image_20230802085331.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/soyuz_2.1b_image_20230802085331.jpg -------------------------------------------------------------------------------- /dags/rockets/images/cz-6a_liftoff__image_20241020123401.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/cz-6a_liftoff__image_20241020123401.jpg -------------------------------------------------------------------------------- /dags/rockets/images/falcon2520925_image_20221009234147.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/falcon2520925_image_20221009234147.png -------------------------------------------------------------------------------- /dags/rockets/images/cz-12_on_its_la_image_20241128132937.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/cz-12_on_its_la_image_20241128132937.jpg -------------------------------------------------------------------------------- /dags/rockets/images/falcon_9_on_slc_image_20241024165956.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/falcon_9_on_slc_image_20241024165956.jpg -------------------------------------------------------------------------------- /dags/rockets/images/soyuz_on_the_la_image_20241127185454.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/soyuz_on_the_la_image_20241127185454.jpg -------------------------------------------------------------------------------- /dags/rockets/images/long2520march25203_image_20190222031215.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chisomnwa/rocket_project/main/dags/rockets/images/long2520march25203_image_20190222031215.jpeg -------------------------------------------------------------------------------- /dags/rockets/includes/get_pictures.py: -------------------------------------------------------------------------------- 1 | import json 2 | import requests 3 | 4 | # write a function to download all pictures in the launches.json file 5 | def _get_pictures(): 6 | # Load the JSON data 7 | with open("/opt/airflow/dags/rockets/launches/launches.json") as f: 8 | launches = json.load(f) 9 | 10 | # Initialize a list to store image URLs 11 | image_urls = [] 12 | 13 | # Extract image URLs from the JSON data 14 | for launch in launches["results"]: 15 | image_urls.append(launch["image"]) 16 | 17 | # Download each image from the URLs 18 | for image_url in image_urls: 19 | response = requests.get(image_url) 20 | image_filename = image_url.split("/")[-1] 21 | target_file = f"/opt/airflow/dags/rockets/images/{image_filename}" 22 | 23 | with open(target_file, "wb") as f: 24 | f.write(response.content) 25 | print(f"Download {image_url} to {target_file} successful") 26 | -------------------------------------------------------------------------------- /dags/rockets/includes/email_sender.py: -------------------------------------------------------------------------------- 1 | import smtplib 2 | import ssl 3 | from email.message import EmailMessage 4 | 5 | def task_fail_alert(context): 6 | state = context.get("task_instance").state 7 | dag = context.get("task_instance").dag_id 8 | task = context.get("task_instance").task_id 9 | exec_date = context.get("task_instance").start_date 10 | log = context.get("task_instance").log_url 11 | env_name = context["params"].get("environment") 12 | dag_owner = context["param"].get("dag_owner") 13 | 14 | email_sender = "your_email_address" 15 | email_password = "your_password" 16 | email_receiver = "receiver_email" 17 | 18 | print(context) 19 | 20 | subject = f"task {task} in dag {dag} failed" 21 | body = f''' 22 | Hey {dag_owner} 23 | 24 | The task {task} in dag {dag} running in {env_name} has failed for run date {exec_date}. 25 | 26 | Here is the log url: {log} 27 | ''' 28 | 29 | em = EmailMessage() 30 | em['From'] = email_sender 31 | em['To'] = email_receiver 32 | em['Subject'] = subject 33 | em.set_content(body) 34 | 35 | cotext=ssl.create_default_context() 36 | 37 | with smtplib.SMTP_SSL('SMTP.gmail.com', 465, context=context) as smtp: 38 | smtp.login(email_sender, email_password) 39 | smtp.sendmail(email_sender, email_receiver, em.as_string) 40 | print("Email Sent Successfully") 41 | -------------------------------------------------------------------------------- /dags/rockets/rockets.py: -------------------------------------------------------------------------------- 1 | # import the required airflow modules 2 | from airflow import DAG 3 | from airflow.utils.dates import datetime 4 | from airflow.operators.bash import BashOperator 5 | from airflow.operators.python import PythonOperator 6 | 7 | from rockets.includes.get_pictures import _get_pictures 8 | from rockets.includes.email_sender import task_fail_alert 9 | from airflow.models import Variable 10 | 11 | # Create default arguments 12 | default_args = { 13 | "on_failure_callback": task_fail_alert, 14 | "params": { 15 | "environment": Variable.get("environment"), 16 | "dag_owner": "Chisom" 17 | } 18 | } 19 | 20 | # Instantitae a DAG - First Method 21 | # dag = DAG( 22 | # dag_id="rocket", 23 | # start_date=datetime(2025, 11, 18), 24 | # schedule_interval=None 25 | # ) 26 | 27 | # Instatiate a DAG - Second Method 28 | # This is using a context manager to manage your resources 29 | with DAG( 30 | dag_id="rocket", 31 | start_date=datetime(2024, 11, 27), 32 | schedule_interval=None, 33 | catchup=False, 34 | tags=['CoreDataEngineer'], 35 | default_args=default_args 36 | ) as dag: 37 | 38 | # the first task: configure a bash operator to download launches 39 | download_launches = BashOperator( 40 | task_id='download_launches', 41 | bash_command="curl -o /opt/airflow/dags/rockets/launches/launches.json -L https://ll.thespacedevs.com/2.0.0/launch/upcoming/" 42 | ) 43 | 44 | 45 | # the second task: write a function to download all pictures in the launches.json file 46 | get_pictures = PythonOperator( 47 | task_id='get_pictures', 48 | python_callable=_get_pictures 49 | ) 50 | 51 | # the third task: create a notification task that runs bash echo command 52 | notify = BashOperator( 53 | task_id='notify', 54 | bash_command='echo "There are now $(ls /opt/airflow/dags/rockets/images/ | wc -1) images"' 55 | ) 56 | 57 | # specify the dependencies 58 | download_launches >> get_pictures >> notify 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rocket Enthusiast Case Study 2 | 3 | Let us dig into a use case of a rocket enthusiast to see how Airflow might help him. 4 | 5 | We will cover the life of a rocket enthuisast named **John** who tracks and follows every single ***rocket launch.*** The news about rocket launches is found in many news sources that John keeps track of, and, ideally, John woud like to have all his rocket news aggregated in a single location. John recently picked up programming and would like to have some sort of automated way to collect information of all rocket launches and eventually some sort of personal insight into the latest rocket news. To start small, John decided to first collect images of rockets. 6 | 7 | ## Exploring the data 8 | for the data, we make use of the [Launch library 2](https://thespacedevs.com/llapi), an online repository of data about both histoical and future rocket launches from various resources. It is free and open API for anybody on the planet (subject to rate limits). John is currently only interested in upcoming rocket launches. Luckily, the launch Library provides exactly the [data](https://ll.thespacedevs.com/2.0.0/launch/) he is looking for. It provides data about upcoming launches, together with URLs of where to find images of the respective rockets. Here's a snippet of the data this URL returns. 9 | 10 | $ curl -L "https://ll.thespacedevs.com/2.0.0/launch/" 11 | 12 | ```java 13 | { 14 | "count": 7361, 15 | "next": "https://ll.thespacedevs.com/2.0.0/launch/?limit=10&offset=10", 16 | "previous": null, 17 | "results": [ 18 | { 19 | "id": "e3df2ecd-c239-472f-95e4-2b89b4f75800", 20 | "url": "https://ll.thespacedevs.com/2.0.0/launch/e3df2ecd-c239-472f-95e4-2b89b4f75800/", 21 | "launch_library_id": null, 22 | "slug": "sputnik-8k74ps-sputnik-1", 23 | "name": "Sputnik 8K74PS | Sputnik 1", 24 | "status": { 25 | "id": 3, 26 | "name": "Success" 27 | }, 28 | "net": "1957-10-04T19:28:34Z", 29 | "window_end": "1957-10-04T19:28:34Z", 30 | "window_start": "1957-10-04T19:28:34Z", 31 | ... 32 | "image": "https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/sputnik_8k74ps_image_20210830185541.jpg", 33 | "infographic": null, 34 | "program": [] 35 | },] 36 | }, 37 | 38 | { 39 | { 40 | "id": "f8c9f344-a6df-4f30-873a-90fe3a7840b3", 41 | "url": "https://ll.thespacedevs.com/2.0.0/launch/f8c9f344-a6df-4f30-873a-90fe3a7840b3/", 42 | "launch_library_id": null, 43 | "slug": "sputnik-8k74ps-sputnik-1", 44 | "name": "Sputnik 8K74PS | Sputnik 1", 45 | "status": { 46 | "id": 3, 47 | "name": "Success" 48 | }, 49 | "net": "1957-11-03T02:30:00Z", 50 | "window_end": "1957-11-03T02:30:00Z", 51 | "window_start": "1957-11-03T02:30:00Z", 52 | ... 53 | "image": "https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/sputnik_8k74ps_image_20210830185541.jpg", 54 | "infographic": null, 55 | "program": [] 56 | }, 57 | }, 58 | 59 | ... 60 | ``` 61 | 62 | ## Mental Model 63 | As you can see, the data is in JSON format and provides rocket launch information, and for every launch, there's information about the specific rocket, such as **ID**, **name**, and the **image URL**. This is exactly what John needs and he initially draws this plan to collect the images of upcoming rocket launches (e.g., to point his screensaver to the directory holding these images). 64 | 65 |
66 |
67 |
68 | ## Flow chart
69 | This flow chart shows the process that will be taken for the successful completion of the project. It serves as a guideline, which is an important step to take before we start representing and manifesting the entire process in codes.
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | #
18 |
19 | # Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL.
20 | #
21 | # WARNING: This configuration is for local development. Do not use it in a production deployment.
22 | #
23 | # This configuration supports basic configuration using environment variables or an .env file
24 | # The following variables are supported:
25 | #
26 | # AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow.
27 | # Default: apache/airflow:2.10.3
28 | # AIRFLOW_UID - User ID in Airflow containers
29 | # Default: 50000
30 | # AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed.
31 | # Default: .
32 | # Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode
33 | #
34 | # _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested).
35 | # Default: airflow
36 | # _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested).
37 | # Default: airflow
38 | # _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers.
39 | # Use this option ONLY for quick checks. Installing requirements at container
40 | # startup is done EVERY TIME the service is started.
41 | # A better way is to build a custom image or extend the official image
42 | # as described in https://airflow.apache.org/docs/docker-stack/build.html.
43 | # Default: ''
44 | #
45 | # Feel free to modify this file to suit your needs.
46 | ---
47 | x-airflow-common:
48 | &airflow-common
49 | # In order to add custom dependencies or upgrade provider packages you can use your extended image.
50 | # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml
51 | # and uncomment the "build" line below, Then run `docker-compose build` to build the images.
52 | image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.10.3}
53 | # build: .
54 | environment:
55 | &airflow-common-env
56 | AIRFLOW__CORE__EXECUTOR: CeleryExecutor
57 | AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
58 | AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
59 | AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0
60 | AIRFLOW__CORE__FERNET_KEY: ''
61 | AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
62 | AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
63 | AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session'
64 | # yamllint disable rule:line-length
65 | # Use simple http server on scheduler for health checks
66 | # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server
67 | # yamllint enable rule:line-length
68 | AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: 'true'
69 | # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks
70 | # for other purpose (development, test and especially production usage) build/extend Airflow image.
71 | _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-}
72 | # The following line can be used to set a custom config file, stored in the local config folder
73 | # If you want to use it, outcomment it and replace airflow.cfg with the name of your config file
74 | # AIRFLOW_CONFIG: '/opt/airflow/config/airflow.cfg'
75 | AIRFLOW__CORE__TEST_CONNECTION: Enabled # You wilL see it enabled in the web server UI
76 | volumes:
77 | - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
78 | - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
79 | - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config
80 | - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
81 | user: "${AIRFLOW_UID:-50000}:0"
82 | depends_on:
83 | &airflow-common-depends-on
84 | redis:
85 | condition: service_healthy
86 | postgres:
87 | condition: service_healthy
88 |
89 | services:
90 | postgres:
91 | image: postgres:13
92 | environment:
93 | POSTGRES_USER: airflow
94 | POSTGRES_PASSWORD: airflow
95 | POSTGRES_DB: airflow
96 | volumes:
97 | - postgres-db-volume:/var/lib/postgresql/data
98 | healthcheck:
99 | test: ["CMD", "pg_isready", "-U", "airflow"]
100 | interval: 10s
101 | retries: 5
102 | start_period: 5s
103 | restart: always
104 |
105 | wiki_results: # I created this daabase for storing the rocket images
106 | image: postgres:12-alpine
107 | environment:
108 | POSTGRES_USER: airflow
109 | POSTGRES_PASSWORD: airflow
110 | POSTGRES_DB: airflow
111 | ports:
112 | - "5433:5432"
113 | volumes:
114 | - ./scripts/create_table.sql:/docker-entrypoint-initdb.d/create_table.sql
115 | healthcheck:
116 | test: ["CMD", "pg_isready", "-U", "airflow"]
117 | interval: 10s
118 | retries: 5
119 | start_period: 5s
120 | restart: always
121 |
122 | redis:
123 | # Redis is limited to 7.2-bookworm due to licencing change
124 | # https://redis.io/blog/redis-adopts-dual-source-available-licensing/
125 | image: redis:7.2-bookworm
126 | expose:
127 | - 6379
128 | healthcheck:
129 | test: ["CMD", "redis-cli", "ping"]
130 | interval: 10s
131 | timeout: 30s
132 | retries: 50
133 | start_period: 30s
134 | restart: always
135 |
136 | airflow-webserver:
137 | <<: *airflow-common
138 | command: webserver
139 | ports:
140 | - "8080:8080"
141 | healthcheck:
142 | test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
143 | interval: 30s
144 | timeout: 10s
145 | retries: 5
146 | start_period: 30s
147 | restart: always
148 | depends_on:
149 | <<: *airflow-common-depends-on
150 | airflow-init:
151 | condition: service_completed_successfully
152 |
153 | airflow-scheduler:
154 | <<: *airflow-common
155 | command: scheduler
156 | healthcheck:
157 | test: ["CMD", "curl", "--fail", "http://localhost:8974/health"]
158 | interval: 30s
159 | timeout: 10s
160 | retries: 5
161 | start_period: 30s
162 | restart: always
163 | depends_on:
164 | <<: *airflow-common-depends-on
165 | airflow-init:
166 | condition: service_completed_successfully
167 |
168 | airflow-worker:
169 | <<: *airflow-common
170 | command: celery worker
171 | healthcheck:
172 | # yamllint disable rule:line-length
173 | test:
174 | - "CMD-SHELL"
175 | - 'celery --app airflow.providers.celery.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}" || celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"'
176 | interval: 30s
177 | timeout: 10s
178 | retries: 5
179 | start_period: 30s
180 | environment:
181 | <<: *airflow-common-env
182 | # Required to handle warm shutdown of the celery workers properly
183 | # See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation
184 | DUMB_INIT_SETSID: "0"
185 | restart: always
186 | depends_on:
187 | <<: *airflow-common-depends-on
188 | airflow-init:
189 | condition: service_completed_successfully
190 |
191 | airflow-triggerer:
192 | <<: *airflow-common
193 | command: triggerer
194 | healthcheck:
195 | test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"']
196 | interval: 30s
197 | timeout: 10s
198 | retries: 5
199 | start_period: 30s
200 | restart: always
201 | depends_on:
202 | <<: *airflow-common-depends-on
203 | airflow-init:
204 | condition: service_completed_successfully
205 |
206 | airflow-init:
207 | <<: *airflow-common
208 | entrypoint: /bin/bash
209 | # yamllint disable rule:line-length
210 | command:
211 | - -c
212 | - |
213 | if [[ -z "${AIRFLOW_UID}" ]]; then
214 | echo
215 | echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m"
216 | echo "If you are on Linux, you SHOULD follow the instructions below to set "
217 | echo "AIRFLOW_UID environment variable, otherwise files will be owned by root."
218 | echo "For other operating systems you can get rid of the warning with manually created .env file:"
219 | echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user"
220 | echo
221 | fi
222 | one_meg=1048576
223 | mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg))
224 | cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat)
225 | disk_available=$$(df / | tail -1 | awk '{print $$4}')
226 | warning_resources="false"
227 | if (( mem_available < 4000 )) ; then
228 | echo
229 | echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m"
230 | echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))"
231 | echo
232 | warning_resources="true"
233 | fi
234 | if (( cpus_available < 2 )); then
235 | echo
236 | echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m"
237 | echo "At least 2 CPUs recommended. You have $${cpus_available}"
238 | echo
239 | warning_resources="true"
240 | fi
241 | if (( disk_available < one_meg * 10 )); then
242 | echo
243 | echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m"
244 | echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))"
245 | echo
246 | warning_resources="true"
247 | fi
248 | if [[ $${warning_resources} == "true" ]]; then
249 | echo
250 | echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m"
251 | echo "Please follow the instructions to increase amount of resources available:"
252 | echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin"
253 | echo
254 | fi
255 | mkdir -p /sources/logs /sources/dags /sources/plugins
256 | chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins}
257 | exec /entrypoint airflow version
258 | # yamllint enable rule:line-length
259 | environment:
260 | <<: *airflow-common-env
261 | _AIRFLOW_DB_MIGRATE: 'true'
262 | _AIRFLOW_WWW_USER_CREATE: 'true'
263 | _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
264 | _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}
265 | _PIP_ADDITIONAL_REQUIREMENTS: ''
266 | user: "0:0"
267 | volumes:
268 | - ${AIRFLOW_PROJ_DIR:-.}:/sources
269 |
270 | airflow-cli:
271 | <<: *airflow-common
272 | profiles:
273 | - debug
274 | environment:
275 | <<: *airflow-common-env
276 | CONNECTION_CHECK_MAX_COUNT: "0"
277 | # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252
278 | command:
279 | - bash
280 | - -c
281 | - airflow
282 |
283 | # You can enable flower by adding "--profile flower" option e.g. docker-compose --profile flower up
284 | # or by explicitly targeted on the command line e.g. docker-compose up flower.
285 | # See: https://docs.docker.com/compose/profiles/
286 | flower:
287 | <<: *airflow-common
288 | command: celery flower
289 | profiles:
290 | - flower
291 | ports:
292 | - "5555:5555"
293 | healthcheck:
294 | test: ["CMD", "curl", "--fail", "http://localhost:5555/"]
295 | interval: 30s
296 | timeout: 10s
297 | retries: 5
298 | start_period: 30s
299 | restart: always
300 | depends_on:
301 | <<: *airflow-common-depends-on
302 | airflow-init:
303 | condition: service_completed_successfully
304 |
305 | volumes:
306 | postgres-db-volume:
307 |
--------------------------------------------------------------------------------
/dags/rockets/launches/launches.json:
--------------------------------------------------------------------------------
1 | {"count":347,"next":"https://ll.thespacedevs.com/2.0.0/launch/upcoming/?limit=10&offset=10","previous":null,"results":[{"id":"f9834e80-9578-4095-9db8-67f5ec6ef5af","url":"https://ll.thespacedevs.com/2.0.0/launch/f9834e80-9578-4095-9db8-67f5ec6ef5af/","launch_library_id":null,"slug":"soyuz-21afregat-m-kondor-fka-no2","name":"Soyuz 2.1a/Fregat-M | Kondor-FKA No.2","status":{"id":3,"name":"Success"},"net":"2024-11-29T21:50:25Z","window_end":"2024-11-29T21:50:25Z","window_start":"2024-11-29T21:50:25Z","inhold":false,"tbdtime":false,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":63,"url":"https://ll.thespacedevs.com/2.0.0/agencies/63/","name":"Russian Federal Space Agency (ROSCOSMOS)","type":"Government"},"rocket":{"id":8179,"configuration":{"id":45,"launch_library_id":83,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/45/","name":"Soyuz 2.1a/Fregat-M","family":"Soyuz","full_name":"Soyuz 2.1a Fregat-M","variant":"Fregat-M"}},"mission":{"id":6757,"launch_library_id":null,"name":"Kondor-FKA No.2","description":"The Kondor-FKA is a small civilian radar Earth observation satellite designed by NPO Mashinostroyeniya as a civilian counterpart to the Kondor-E satellite.\r\n\r\nThe Kondor satellite features a S-band synthetic aperture radar (SAR), which can conduct both continous swath surweys or detailed spot surveys. The swath width is 10 km. Ground resolution is 1 to 2 m in spotlight mode, 1 to 3 m in stripmap mode and 5 to 30 m in ScanSAR mode.","launch_designator":null,"type":"Earth Science","orbit":{"id":17,"name":"Sun-Synchronous Orbit","abbrev":"SSO"}},"pad":{"id":83,"url":"https://ll.thespacedevs.com/2.0.0/pad/83/","agency_id":63,"name":"Cosmodrome Site 1S","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Vostochny_Cosmodrome","map_url":"https://www.google.com/maps?q=51.884395,128.333932","latitude":"51.884395","longitude":"128.333932","location":{"id":18,"url":"https://ll.thespacedevs.com/2.0.0/location/18/","name":"Vostochny Cosmodrome, Siberia, Russian Federation","country_code":"RUS","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_18_20200803142401.jpg","total_launch_count":19,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_83_20200803143544.jpg","total_launch_count":18},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/soyuz_on_the_la_image_20241127185454.jpg","infographic":null,"program":[]},{"id":"7beb2fcf-acb3-4cf1-b31b-f2655416d1ed","url":"https://ll.thespacedevs.com/2.0.0/launch/7beb2fcf-acb3-4cf1-b31b-f2655416d1ed/","launch_library_id":null,"slug":"falcon-9-block-5-starlink-group-6-65","name":"Falcon 9 Block 5 | Starlink Group 6-65","status":{"id":3,"name":"Success"},"net":"2024-11-30T05:00:00Z","window_end":"2024-11-30T09:00:00Z","window_start":"2024-11-30T05:00:00Z","inhold":false,"tbdtime":false,"tbddate":false,"probability":85,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"},"rocket":{"id":8420,"configuration":{"id":164,"launch_library_id":188,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/164/","name":"Falcon 9","family":"Falcon","full_name":"Falcon 9 Block 5","variant":"Block 5"}},"mission":{"id":7009,"launch_library_id":null,"name":"Starlink Group 6-65","description":"A batch of 24 satellites for the Starlink mega-constellation - SpaceX's project for space-based Internet communication system.","launch_designator":null,"type":"Communications","orbit":{"id":8,"name":"Low Earth Orbit","abbrev":"LEO"}},"pad":{"id":80,"url":"https://ll.thespacedevs.com/2.0.0/pad/80/","agency_id":121,"name":"Space Launch Complex 40","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Cape_Canaveral_Air_Force_Station_Space_Launch_Complex_40","map_url":"https://www.google.com/maps?q=28.56194122,-80.57735736","latitude":"28.56194122","longitude":"-80.57735736","location":{"id":12,"url":"https://ll.thespacedevs.com/2.0.0/location/12/","name":"Cape Canaveral SFS, FL, USA","country_code":"USA","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_12_20200803142519.jpg","total_launch_count":990,"total_landing_count":59},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_80_20200803143323.jpg","total_launch_count":276},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/falcon2520925_image_20221009234147.png","infographic":null,"program":[{"id":25,"url":"https://ll.thespacedevs.com/2.0.0/program/25/","name":"Starlink","description":"Starlink is a satellite internet constellation operated by American aerospace company SpaceX","agencies":[{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"}],"image_url":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/starlink_program_20231228154508.jpeg","start_date":"2018-02-22T14:17:00Z","end_date":null,"info_url":"https://starlink.com","wiki_url":"https://en.wikipedia.org/wiki/Starlink"}]},{"id":"fed1b36f-965c-46ac-bb4d-8154930c4492","url":"https://ll.thespacedevs.com/2.0.0/launch/fed1b36f-965c-46ac-bb4d-8154930c4492/","launch_library_id":null,"slug":"falcon-9-block-5-nrol-126","name":"Falcon 9 Block 5 | NROL-126","status":{"id":1,"name":"Go"},"net":"2024-11-30T08:10:00Z","window_end":"2024-11-30T12:08:00Z","window_start":"2024-11-30T08:08:00Z","inhold":false,"tbdtime":false,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"},"rocket":{"id":8421,"configuration":{"id":164,"launch_library_id":188,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/164/","name":"Falcon 9","family":"Falcon","full_name":"Falcon 9 Block 5","variant":"Block 5"}},"mission":{"id":7010,"launch_library_id":null,"name":"NROL-126","description":"Fifth batch of satellites for a reconnaissance satellite constellation built by SpaceX and Northrop Grumman for the National Reconnaissance Office to provide imaging and other reconnaissance capabilities.","launch_designator":null,"type":"Government/Top Secret","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":16,"url":"https://ll.thespacedevs.com/2.0.0/pad/16/","agency_id":null,"name":"Space Launch Complex 4E","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Vandenberg_Space_Launch_Complex_4#SLC-4E","map_url":"https://www.google.com/maps?q=34.632,-120.611","latitude":"34.632","longitude":"-120.611","location":{"id":11,"url":"https://ll.thespacedevs.com/2.0.0/location/11/","name":"Vandenberg SFB, CA, USA","country_code":"USA","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_11_20200803142416.jpg","total_launch_count":780,"total_landing_count":21},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_16_20200803143532.jpg","total_launch_count":168},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/falcon_9_on_slc_image_20241024165956.jpg","infographic":null,"program":[]},{"id":"87c8453f-8428-4acd-bbbe-9f37493f674f","url":"https://ll.thespacedevs.com/2.0.0/launch/87c8453f-8428-4acd-bbbe-9f37493f674f/","launch_library_id":null,"slug":"long-march-12-maiden-flight","name":"Long March 12 | Maiden Flight","status":{"id":1,"name":"Go"},"net":"2024-11-30T14:30:00Z","window_end":"2024-11-30T16:08:00Z","window_start":"2024-11-30T14:17:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":88,"url":"https://ll.thespacedevs.com/2.0.0/agencies/88/","name":"China Aerospace Science and Technology Corporation","type":"Government"},"rocket":{"id":8425,"configuration":{"id":517,"launch_library_id":null,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/517/","name":"Long March 12","family":"Long March","full_name":"Long March 12","variant":"12"}},"mission":{"id":7014,"launch_library_id":null,"name":"Maiden Flight","description":"First launch of the Long March 12 launch vehicle and the first launch from the Wenchang Commercial Space Launch Site. Payload on board and target orbit are TBD.","launch_designator":null,"type":"Test Flight","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":219,"url":"https://ll.thespacedevs.com/2.0.0/pad/219/","agency_id":null,"name":"Commercial LC-2","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Wenchang_Commercial_Space_Launch_Site","map_url":"https://www.google.com/maps?q=19.59755,110.936481","latitude":"19.59755","longitude":"110.936481","location":{"id":8,"url":"https://ll.thespacedevs.com/2.0.0/location/8/","name":"Wenchang Space Launch Site, People's Republic of China","country_code":"CHN","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_8_20200803142445.jpg","total_launch_count":32,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_commercial_lc-2_20231225074048.jpg","total_launch_count":0},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/cz-12_on_its_la_image_20241128132937.jpg","infographic":null,"program":[]},{"id":"81fe0bdd-6a33-4976-9bad-4a1268400b1e","url":"https://ll.thespacedevs.com/2.0.0/launch/81fe0bdd-6a33-4976-9bad-4a1268400b1e/","launch_library_id":null,"slug":"long-march-6a-unknown-payload","name":"Long March 6A | Unknown Payload","status":{"id":1,"name":"Go"},"net":"2024-12-02T04:55:00Z","window_end":"2024-12-02T05:06:00Z","window_start":"2024-12-02T04:45:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":88,"url":"https://ll.thespacedevs.com/2.0.0/agencies/88/","name":"China Aerospace Science and Technology Corporation","type":"Government"},"rocket":{"id":8427,"configuration":{"id":478,"launch_library_id":null,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/478/","name":"Long March 6A","family":"Long March","full_name":"Long March 6A","variant":""}},"mission":{"id":7016,"launch_library_id":null,"name":"Unknown Payload","description":"Possibly CZ-6A launch with a batch of G60 Low Earth Orbit communication constellation satellites, details TBD.","launch_designator":null,"type":"Unknown","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":200,"url":"https://ll.thespacedevs.com/2.0.0/pad/200/","agency_id":null,"name":"Launch Complex 9A","info_url":null,"wiki_url":null,"map_url":"https://www.google.com/maps?q=38.8583,111.5802","latitude":"38.8583","longitude":"111.5802","location":{"id":19,"url":"https://ll.thespacedevs.com/2.0.0/location/19/","name":"Taiyuan Satellite Launch Center, People's Republic of China","country_code":"CHN","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_19_20200803142421.jpg","total_launch_count":135,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_launch_complex_9a_20220330003717.jpg","total_launch_count":9},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/cz-6a_liftoff__image_20241020123401.jpg","infographic":null,"program":[]},{"id":"351bf216-4cae-49df-82d0-9afaeb5df0f2","url":"https://ll.thespacedevs.com/2.0.0/launch/351bf216-4cae-49df-82d0-9afaeb5df0f2/","launch_library_id":null,"slug":"long-march-3be-unknown-payload","name":"Long March 3B/E | Unknown Payload","status":{"id":1,"name":"Go"},"net":"2024-12-03T05:55:00Z","window_end":"2024-12-03T06:21:00Z","window_start":"2024-12-03T05:46:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":88,"url":"https://ll.thespacedevs.com/2.0.0/agencies/88/","name":"China Aerospace Science and Technology Corporation","type":"Government"},"rocket":{"id":8434,"configuration":{"id":50,"launch_library_id":69,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/50/","name":"Long March 3","family":"Long March","full_name":"Long March 3B/E","variant":"B/E"}},"mission":{"id":7023,"launch_library_id":null,"name":"Unknown Payload","description":"Details TBD.","launch_designator":null,"type":"Unknown","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":45,"url":"https://ll.thespacedevs.com/2.0.0/pad/45/","agency_id":null,"name":"Launch Complex 2 (LC-2)","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Xichang_Satellite_Launch_Center","map_url":"https://www.google.com/maps?q=28.245564,102.026751","latitude":"28.245564","longitude":"102.026751","location":{"id":16,"url":"https://ll.thespacedevs.com/2.0.0/location/16/","name":"Xichang Satellite Launch Center, People's Republic of China","country_code":"CHN","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_16_20200803142513.jpg","total_launch_count":214,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_45_20200803143520.jpg","total_launch_count":113},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/long2520march25203_image_20190222031215.jpeg","infographic":null,"program":[]},{"id":"66475296-048d-480b-b886-3644c1a1b6a4","url":"https://ll.thespacedevs.com/2.0.0/launch/66475296-048d-480b-b886-3644c1a1b6a4/","launch_library_id":null,"slug":"soyuz-21b-kosmos-unknown-payload","name":"Soyuz 2.1b | Kosmos (Unknown Payload)","status":{"id":1,"name":"Go"},"net":"2024-12-03T16:00:00Z","window_end":"2024-12-03T19:00:00Z","window_start":"2024-12-03T16:00:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":193,"url":"https://ll.thespacedevs.com/2.0.0/agencies/193/","name":"Russian Space Forces","type":"Government"},"rocket":{"id":8412,"configuration":{"id":15,"launch_library_id":3,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/15/","name":"Soyuz 2.1b","family":"Soyuz","full_name":"Soyuz 2.1b","variant":""}},"mission":{"id":7001,"launch_library_id":null,"name":"Kosmos (Unknown Payload)","description":"Russian military satellite(s) of unknown variant.","launch_designator":null,"type":"Government/Top Secret","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":48,"url":"https://ll.thespacedevs.com/2.0.0/pad/48/","agency_id":163,"name":"Unknown Pad","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Plesetsk_Cosmodrome","map_url":"https://www.google.com/maps?q=62.925556,40.577778","latitude":"62.925556","longitude":"40.577778","location":{"id":6,"url":"https://ll.thespacedevs.com/2.0.0/location/6/","name":"Plesetsk Cosmodrome, Russian Federation","country_code":"RUS","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_6_20200803142434.jpg","total_launch_count":1670,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_48_20200803143459.jpg","total_launch_count":0},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/soyuz_2.1b_image_20230802085331.jpg","infographic":null,"program":[]},{"id":"a757f8b0-4e5c-4223-bc27-361a8206a3bf","url":"https://ll.thespacedevs.com/2.0.0/launch/a757f8b0-4e5c-4223-bc27-361a8206a3bf/","launch_library_id":null,"slug":"falcon-9-block-5-starlink-group-9-14","name":"Falcon 9 Block 5 | Starlink Group 9-14","status":{"id":2,"name":"TBD"},"net":"2024-12-04T00:29:00Z","window_end":"2024-12-04T04:29:00Z","window_start":"2024-12-04T00:29:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"},"rocket":{"id":8422,"configuration":{"id":164,"launch_library_id":188,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/164/","name":"Falcon 9","family":"Falcon","full_name":"Falcon 9 Block 5","variant":"Block 5"}},"mission":{"id":7011,"launch_library_id":null,"name":"Starlink Group 9-14","description":"A batch of satellites for the Starlink mega-constellation - SpaceX's project for space-based Internet communication system.","launch_designator":null,"type":"Communications","orbit":{"id":8,"name":"Low Earth Orbit","abbrev":"LEO"}},"pad":{"id":16,"url":"https://ll.thespacedevs.com/2.0.0/pad/16/","agency_id":null,"name":"Space Launch Complex 4E","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Vandenberg_Space_Launch_Complex_4#SLC-4E","map_url":"https://www.google.com/maps?q=34.632,-120.611","latitude":"34.632","longitude":"-120.611","location":{"id":11,"url":"https://ll.thespacedevs.com/2.0.0/location/11/","name":"Vandenberg SFB, CA, USA","country_code":"USA","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_11_20200803142416.jpg","total_launch_count":780,"total_landing_count":21},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_16_20200803143532.jpg","total_launch_count":168},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/falcon2520925_image_20221009234147.png","infographic":null,"program":[{"id":25,"url":"https://ll.thespacedevs.com/2.0.0/program/25/","name":"Starlink","description":"Starlink is a satellite internet constellation operated by American aerospace company SpaceX","agencies":[{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"}],"image_url":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/starlink_program_20231228154508.jpeg","start_date":"2018-02-22T14:17:00Z","end_date":null,"info_url":"https://starlink.com","wiki_url":"https://en.wikipedia.org/wiki/Starlink"}]},{"id":"fb9a85a6-209d-4433-a1a3-906e5cbceaf0","url":"https://ll.thespacedevs.com/2.0.0/launch/fb9a85a6-209d-4433-a1a3-906e5cbceaf0/","launch_library_id":null,"slug":"kuaizhou-1a-unknown-payload","name":"Kuaizhou-1A | Unknown Payload","status":{"id":1,"name":"Go"},"net":"2024-12-04T04:50:00Z","window_end":"2024-12-04T05:21:00Z","window_start":"2024-12-04T04:36:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":194,"url":"https://ll.thespacedevs.com/2.0.0/agencies/194/","name":"ExPace","type":"Commercial"},"rocket":{"id":8439,"configuration":{"id":135,"launch_library_id":155,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/135/","name":"Kuaizhou","family":"Kuaizhou","full_name":"Kuaizhou-1A","variant":"1A"}},"mission":{"id":7028,"launch_library_id":null,"name":"Unknown Payload","description":"Details TBD.","launch_designator":null,"type":"Unknown","orbit":{"id":25,"name":"Unknown","abbrev":"N/A"}},"pad":{"id":157,"url":"https://ll.thespacedevs.com/2.0.0/pad/157/","agency_id":null,"name":"Mobile Launcher Pad","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Xichang_Satellite_Launch_Center","map_url":"https://www.google.com/maps?q=28.242774,102.032944","latitude":"28.242774","longitude":"102.032944","location":{"id":16,"url":"https://ll.thespacedevs.com/2.0.0/location/16/","name":"Xichang Satellite Launch Center, People's Republic of China","country_code":"CHN","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_16_20200803142513.jpg","total_launch_count":214,"total_landing_count":0},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_157_20200803143359.jpg","total_launch_count":6},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/kuaizhou_image_20191027094423.jpeg","infographic":null,"program":[]},{"id":"f50d89cf-7c9a-4b7e-bc6e-f7e59950995d","url":"https://ll.thespacedevs.com/2.0.0/launch/f50d89cf-7c9a-4b7e-bc6e-f7e59950995d/","launch_library_id":null,"slug":"falcon-9-block-5-starlink-group-6-70","name":"Falcon 9 Block 5 | Starlink Group 6-70","status":{"id":2,"name":"TBD"},"net":"2024-12-04T08:29:00Z","window_end":"2024-12-04T12:29:00Z","window_start":"2024-12-04T08:29:00Z","inhold":false,"tbdtime":true,"tbddate":false,"probability":null,"holdreason":"","failreason":"","hashtag":null,"launch_service_provider":{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"},"rocket":{"id":8432,"configuration":{"id":164,"launch_library_id":188,"url":"https://ll.thespacedevs.com/2.0.0/config/launcher/164/","name":"Falcon 9","family":"Falcon","full_name":"Falcon 9 Block 5","variant":"Block 5"}},"mission":{"id":7021,"launch_library_id":null,"name":"Starlink Group 6-70","description":"A batch of satellites for the Starlink mega-constellation - SpaceX's project for space-based Internet communication system.","launch_designator":null,"type":"Communications","orbit":{"id":8,"name":"Low Earth Orbit","abbrev":"LEO"}},"pad":{"id":80,"url":"https://ll.thespacedevs.com/2.0.0/pad/80/","agency_id":121,"name":"Space Launch Complex 40","info_url":null,"wiki_url":"https://en.wikipedia.org/wiki/Cape_Canaveral_Air_Force_Station_Space_Launch_Complex_40","map_url":"https://www.google.com/maps?q=28.56194122,-80.57735736","latitude":"28.56194122","longitude":"-80.57735736","location":{"id":12,"url":"https://ll.thespacedevs.com/2.0.0/location/12/","name":"Cape Canaveral SFS, FL, USA","country_code":"USA","map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/location_12_20200803142519.jpg","total_launch_count":990,"total_landing_count":59},"map_image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/map_images/pad_80_20200803143323.jpg","total_launch_count":276},"webcast_live":false,"image":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/falcon2520925_image_20221009234147.png","infographic":null,"program":[{"id":25,"url":"https://ll.thespacedevs.com/2.0.0/program/25/","name":"Starlink","description":"Starlink is a satellite internet constellation operated by American aerospace company SpaceX","agencies":[{"id":121,"url":"https://ll.thespacedevs.com/2.0.0/agencies/121/","name":"SpaceX","type":"Commercial"}],"image_url":"https://thespacedevs-prod.nyc3.digitaloceanspaces.com/media/images/starlink_program_20231228154508.jpeg","start_date":"2018-02-22T14:17:00Z","end_date":null,"info_url":"https://starlink.com","wiki_url":"https://en.wikipedia.org/wiki/Starlink"}]}]}
--------------------------------------------------------------------------------