<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<metainfo>
    <schemaVersion>2.0</schemaVersion>
    <services>
        <service>
            <name>DOLPHIN</name>
            <displayName>Dolphin Scheduler</displayName>
            <comment>分布式易扩展的可视化DAG工作流任务调度系统</comment>
            <version>1.3.3</version>
            <components>
                <component>
                    <name>DOLPHIN_MASTER</name>
                    <displayName>DS Master</displayName>
                    <category>MASTER</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/dolphin_master_service.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>

                <component>
                    <name>DOLPHIN_LOGGER</name>
                    <displayName>DS Logger</displayName>
                    <category>SLAVE</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/dolphin_logger_service.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>

                <component>
                    <name>DOLPHIN_WORKER</name>
                    <displayName>DS Worker</displayName>
                    <category>SLAVE</category>
                    <cardinality>1+</cardinality>
                    <dependencies>
                        <dependency>
                            <name>DOLPHIN/DOLPHIN_LOGGER</name>
                            <scope>host</scope>
                            <auto-deploy>
                                <enabled>true</enabled>
                            </auto-deploy>
                        </dependency>
                    </dependencies>
                    <commandScript>
                        <script>scripts/dolphin_worker_service.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>

                <component>
                    <name>DOLPHIN_ALERT</name>
                    <displayName>DS Alert</displayName>
                    <category>SLAVE</category>
                    <cardinality>1</cardinality>
                    <commandScript>
                        <script>scripts/dolphin_alert_service.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>

                <component>
                    <name>DOLPHIN_API</name>
                    <displayName>DS_Api</displayName>
                    <category>SLAVE</category>
                    <cardinality>1</cardinality>
                    <commandScript>
                        <script>scripts/dolphin_api_service.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>
            </components>

            <requiredServices>
                <service>ZOOKEEPER</service>
            </requiredServices>

            <osSpecifics>
                <osSpecific>
                    <osFamily>any</osFamily>
                    <packages>
                        <package>
                            <name>apache-dolphinscheduler*</name>
                        </package>
                    </packages>
                </osSpecific>
            </osSpecifics>

            <configuration-dependencies>
                <config-type>dolphin-alert</config-type>
                <config-type>dolphin-app-api</config-type>
                <config-type>dolphin-app-dao</config-type>
                <config-type>dolphin-common</config-type>
                <config-type>dolphin-env</config-type>
                <config-type>dolphin-quartz</config-type>
            </configuration-dependencies>

            <themes>
                <theme>
                    <fileName>theme.json</fileName>
                    <default>true</default>
                </theme>
            </themes>

            <quickLinksConfigurations-dir>quicklinks</quickLinksConfigurations-dir>
            <quickLinksConfigurations>
                <quickLinksConfiguration>
                    <fileName>quicklinks.json</fileName>
                    <default>true</default>
                </quickLinksConfiguration>
            </quickLinksConfigurations>
        </service>
    </services>
</metainfo>