Skip to content

Commit

Permalink
feat: impl'd describe for resources (redhat-developer#553)
Browse files Browse the repository at this point in the history
Signed-off-by: Andre Dietisheim <[email protected]>
  • Loading branch information
adietish committed Aug 7, 2024
1 parent 7d4d1b9 commit 7f92676
Show file tree
Hide file tree
Showing 48 changed files with 5,125 additions and 90 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*******************************************************************************
* Copyright (c) 2020 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package com.redhat.devtools.intellij.kubernetes.actions

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.diagnostic.logger
import com.redhat.devtools.intellij.common.actions.StructureTreeAction
import com.redhat.devtools.intellij.kubernetes.editor.describe.DescriptionViewerFactory
import com.redhat.devtools.intellij.kubernetes.model.Notification
import io.fabric8.kubernetes.api.model.HasMetadata
import io.fabric8.kubernetes.api.model.Pod
import javax.swing.tree.TreePath

class DescribeResourceAction: StructureTreeAction() {

override fun actionPerformed(event: AnActionEvent?, path: TreePath?, selected: Any?) {
// not called
}

override fun actionPerformed(event: AnActionEvent?, path: Array<out TreePath>?, selected: Array<out Any>?) {
val descriptor = selected?.get(0)?.getDescriptor() ?: return
val project = descriptor.project ?: return
val toDescribe: HasMetadata = descriptor.element as? HasMetadata? ?: return
try {
DescriptionViewerFactory.instance.openEditor(toDescribe, project)
} catch (e: RuntimeException) {
logger<DescribeResourceAction>().warn("Error opening editor ${toDescribe.metadata.name}", e)
Notification().error(
"Error opening editor ${toDescribe.metadata.name}",
"Could not open editor for ${toDescribe.kind} '${toDescribe.metadata.name}'."
)
}
}

override fun isVisible(selected: Array<out Any>?): Boolean {
return selected?.size == 1
&& isVisible(selected.firstOrNull())
}

override fun isVisible(selected: Any?): Boolean {
val element = selected?.getElement<HasMetadata>()
return element is Pod
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ abstract class ConsoleTab<T : ConsoleView, W : Any?>(
var i = 0
do {
val container = model.getElementAt(i).container
if (isRunning(getStatus(container, pod.status))) {
if (isRunning(container.getStatus(pod.status))) {
return i
}
} while (++i < model.size)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*******************************************************************************
* Copyright (c) 2021 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package com.redhat.devtools.intellij.kubernetes.editor

import com.intellij.openapi.fileEditor.impl.EditorTabTitleProvider
import com.intellij.openapi.fileEditor.impl.UniqueNameEditorTabTitleProvider
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.redhat.devtools.intellij.kubernetes.editor.describe.DescriptionViewerTabTitleProvider

open class KubernetesEditorsTabTitleProvider(
private val fallback: EditorTabTitleProvider = UniqueNameEditorTabTitleProvider()
) : EditorTabTitleProvider {

override fun getEditorTabTitle(project: Project, file: VirtualFile): String? {
return ResourceEditorTabTitleProvider().getEditorTabTitle(project, file)
?: DescriptionViewerTabTitleProvider().getEditorTabTitle(project, file)
?: fallback.getEditorTabTitle(project, file)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2021 Red Hat, Inc.
* Copyright (c) 2024 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution,
Expand All @@ -11,54 +11,45 @@
package com.redhat.devtools.intellij.kubernetes.editor

import com.intellij.openapi.fileEditor.impl.EditorTabTitleProvider
import com.intellij.openapi.fileEditor.impl.UniqueNameEditorTabTitleProvider
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.redhat.devtools.intellij.common.validation.KubernetesResourceInfo
import com.redhat.devtools.intellij.kubernetes.editor.util.isKubernetesResource

open class ResourceEditorTabTitleProvider(
private val fallback: EditorTabTitleProvider = UniqueNameEditorTabTitleProvider()
) : EditorTabTitleProvider {

companion object {
const val TITLE_UNKNOWN_CLUSTERRESOURCE = "Unknown Cluster Resource"
const val TITLE_UNKNOWN_NAME = "unknown name"
}

override fun getEditorTabTitle(project: Project, file: VirtualFile): String? {
return if (isTemporary(file)) {
val resourceInfo = getKubernetesResourceInfo(file, project)
if (resourceInfo != null
&& isKubernetesResource(resourceInfo)
) {
getTitleFor(resourceInfo)
} else {
TITLE_UNKNOWN_CLUSTERRESOURCE
}
} else {
fallback.getEditorTabTitle(project, file)
}
}

private fun getTitleFor(info: KubernetesResourceInfo): String {
val name = info.name ?: TITLE_UNKNOWN_NAME
val namespace = info.namespace
return if (namespace == null) {
name
} else {
"$name@$namespace"
}
}

/* for testing purposes */
protected open fun getKubernetesResourceInfo(file: VirtualFile, project: Project): KubernetesResourceInfo? {
return com.redhat.devtools.intellij.kubernetes.editor.util.getKubernetesResourceInfo(file, project)
}

/* for testing purposes */
protected open fun isTemporary(file: VirtualFile): Boolean {
return ResourceFile.isTemporary(file)
}
open class ResourceEditorTabTitleProvider: EditorTabTitleProvider {
companion object {
const val TITLE_UNKNOWN_CLUSTERRESOURCE = "Unknown Cluster Resource"
const val TITLE_UNKNOWN_NAME = "unknown name"
}

override fun getEditorTabTitle(project: Project, file: VirtualFile): String? {
if (!isResourceFile(file)) {
return null
}

val resourceInfo = getKubernetesResourceInfo(file, project)
return if (resourceInfo != null
&& isKubernetesResource(resourceInfo)
) {
getTitleFor(resourceInfo)
} else {
TITLE_UNKNOWN_CLUSTERRESOURCE
}
}

private fun getTitleFor(info: KubernetesResourceInfo): String {
val name = info.name ?: TITLE_UNKNOWN_NAME
val namespace = info.namespace ?: return name
return "$name@$namespace"
}

protected open fun isResourceFile(file: VirtualFile): Boolean {
return ResourceFile.isResourceFile(file)
}

/* for testing purposes */
protected open fun getKubernetesResourceInfo(file: VirtualFile, project: Project): KubernetesResourceInfo? {
return com.redhat.devtools.intellij.kubernetes.editor.util.getKubernetesResourceInfo(file, project)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ open class ResourceFile protected constructor(
&& virtualFile.path.startsWith(TEMP_FOLDER.toString())
}

fun isResourceFile(virtualFile: VirtualFile?): Boolean {
return isTemporary(virtualFile)
}

private fun isYamlOrJson(file: VirtualFile): Boolean {
if (true == file.extension?.isBlank()) {
return false
Expand Down
Loading

0 comments on commit 7f92676

Please sign in to comment.