blob: 57c8f0a8a5353a43c4c53b9fff61a1620eb32786 [file] [log] [blame]
/*
* Copyright 2019 WeBank
*
* 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.
*/
package com.webank.wedatasphere.linkis.manager.label.service.impl
import java.util
import com.webank.wedatasphere.linkis.common.utils.Logging
import com.webank.wedatasphere.linkis.manager.common.entity.label.LabelKeyValue
import com.webank.wedatasphere.linkis.manager.common.entity.persistence.PersistenceLabel
import com.webank.wedatasphere.linkis.manager.common.entity.resource.NodeResource
import com.webank.wedatasphere.linkis.manager.common.utils.ResourceUtils
import com.webank.wedatasphere.linkis.manager.label.builder.factory.LabelBuilderFactoryContext
import com.webank.wedatasphere.linkis.manager.label.entity.Label
import com.webank.wedatasphere.linkis.manager.label.entity.engine.EngineInstanceLabel
import com.webank.wedatasphere.linkis.manager.label.service.ResourceLabelService
import com.webank.wedatasphere.linkis.manager.persistence.ResourceLabelPersistence
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import scala.collection.JavaConversions._
@Component
class DefaultResourceLabelService extends ResourceLabelService with Logging {
@Autowired
private var resourceLabelPersistence: ResourceLabelPersistence = _
private val labelBuilderFactory = LabelBuilderFactoryContext.getLabelBuilderFactory
private def convertPersistenceLabel(label: Label[_]): PersistenceLabel = {
label match {
case persistenceLabel: PersistenceLabel =>
persistenceLabel
case _ =>
labelBuilderFactory.convertLabel[PersistenceLabel](label, classOf[PersistenceLabel])
}
}
/**
* 通过传入的Labels 查找所有和Resource相关的Label
* 包含CombineLabel,需要CombineLabel的所有Label Key 出现过
* 默认返回的是PersistenceLabel,方便加快性能
*
* @param labels
* @return
*/
override def getResourceLabels(labels: util.List[Label[_]]): util.List[Label[_]] = {
val labelKeyValueList = labels.flatMap { label =>
val persistenceLabel = convertPersistenceLabel(label)
persistenceLabel.getValue.map { keyValue =>
new LabelKeyValue(keyValue._1, keyValue._2)
}
}.filter(null != _).toList
val resourceLabels = resourceLabelPersistence.getResourceLabels(labelKeyValueList)
resourceLabels.map{ label =>
val realyLabel:Label[_] = labelBuilderFactory.createLabel(label.getLabelKey, label.getValue)
realyLabel
}
}
/**
* 设置某个Label的资源数值,如果不存在add,存在对应的Label update
* lABEL 不存在需要插入Label先
*
* @param label
* @param resource
*/
override def setResourceToLabel(label: Label[_], resource: NodeResource): Unit = {
resourceLabelPersistence.setResourceToLabel(convertPersistenceLabel(label), ResourceUtils.toPersistenceResource(resource))
}
/**
* 通过Label 返回对应的Resource
*
* @param label
* @return
*/
override def getResourceByLabel(label: Label[_]): NodeResource = {
val persistenceResource = label match {
case p: PersistenceLabel => resourceLabelPersistence.getResourceByLabel(p)
case _ => resourceLabelPersistence.getResourceByLabel(convertPersistenceLabel(label))
}
if(persistenceResource.isEmpty){
null
} else {
// TODO: 判断取哪个resource
ResourceUtils.fromPersistenceResource(persistenceResource.get(0))
}
}
/**
* 清理Label的资源信息和记录
* 1. 清理Label对应的Resource信息
* 2. 清理包含改Label的CombinedLabel的Resource信息
*
* @param label
*/
override def removeResourceByLabel(label: Label[_]): Unit = {
resourceLabelPersistence.removeResourceByLabel(convertPersistenceLabel(label))
}
override def removeResourceByLabels(labels: util.List[Label[_]]): Unit = {
resourceLabelPersistence.removeResourceByLabels(labels.map(convertPersistenceLabel))
}
override def setEngineConnResourceToLabel(label: Label[_], nodeResource: NodeResource): Unit = {
label match {
case label:EngineInstanceLabel =>
val resource = ResourceUtils.toPersistenceResource(nodeResource)
resource.setTicketId(label.getInstance())
resourceLabelPersistence.setResourceToLabel(convertPersistenceLabel(label), resource)
case _ =>
}
}
}