/*-
 * ============LICENSE_START=======================================================
 * OSAM Core
 * ================================================================================
 * Copyright (C) 2018 Netsia
 * ================================================================================
 * Licensed 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.api.service;

import org.onap.osam.model.dao.PmConfigs;
import org.onap.osam.model.dao.PmGroupConfig;
import org.onap.osam.model.dao.PmConfig;

import java.util.List;

public interface PmConfigsService extends AbstractStorageService<Long,PmConfigs>{

    List<PmConfig> getPmConfigByPmConfigsId(Long pmConfigsId);

    List<PmConfig> getPmConfigByPmConfigGroupId(Long pmGroupConfigsId);

    void addPmGroupConfig(PmConfig pmConfig);

    void addPmGroupConfig(PmGroupConfig pmGroupConfig);

    void removePmConfig(Long pmConfigId);

    void removeGroupPmConfig(Long pmGroupConfigId);

}
