/*
 * 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.
 */

package org.apache.shardingsphere.ui.servcie;

import org.apache.shardingsphere.ui.common.dto.InstanceDTO;
import org.apache.shardingsphere.ui.common.dto.ReadDataSourceDTO;

import java.util.Collection;

/**
 * Governance operation service.
 */
public interface GovernanceService {
    
    /**
     * Get all instances.
     *
     * @return all instances
     */
    Collection<InstanceDTO> getALLInstance();
    
    /**
     * Update instance status.
     *
     * @param instanceId instance id
     * @param enabled enabled
     */
    void updateInstanceStatus(String instanceId, boolean enabled);
    
    /**
     * Get all read data source.
     *
     * @return all read data source dto
     */
    Collection<ReadDataSourceDTO> getAllReadDataSource();
    
    /**
     * update read data source status.
     *
     * @param schemaNames schema name
     * @param readDataSourceName read data source name
     * @param enabled enabled
     */
    void updateReadDataSourceStatus(String schemaNames, String readDataSourceName, boolean enabled);
}
