├── 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"}]}]} --------------------------------------------------------------------------------