Skip to content

Commit 505418f

Browse files
committed
fix: display kubeconfig parse error on startup (redhat-developer#809)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent 3bd1212 commit 505418f

File tree

13 files changed

+520
-512
lines changed

13 files changed

+520
-512
lines changed

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/actions/RefreshAction.kt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,19 @@ import com.redhat.devtools.intellij.common.actions.StructureTreeAction
1717
import com.redhat.devtools.intellij.kubernetes.model.context.IActiveContext
1818
import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService
1919
import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService.sendTelemetry
20+
import com.redhat.devtools.intellij.kubernetes.tree.TreeStructure
2021
import com.redhat.devtools.intellij.kubernetes.tree.util.getResourceKind
2122
import javax.swing.tree.TreePath
2223

2324
class RefreshAction : StructureTreeAction(IActiveContext::class.java) {
2425

2526
override fun actionPerformed(event: AnActionEvent?, path: TreePath?, selectedNode: Any?) {
2627
val descriptor = selectedNode?.getDescriptor()
28+
val refreshMessage = getRefreshMessage(descriptor)
2729
run(
28-
"Refreshing $selectedNode...", true,
30+
"Refreshing $refreshMessage..", true,
2931
Progressive {
30-
val telemetry = TelemetryService.instance.action(
31-
"refresh ${
32-
if (descriptor != null) {
33-
"resource"
34-
} else {
35-
"all contexts"
36-
}
37-
} "
38-
)
32+
val telemetry = TelemetryService.instance.action("refresh $refreshMessage")
3933
try {
4034
if (descriptor != null) {
4135
descriptor.invalidate()
@@ -46,15 +40,17 @@ class RefreshAction : StructureTreeAction(IActiveContext::class.java) {
4640
}
4741
} catch (e: Exception) {
4842
logger<RefreshAction>().warn(
49-
"Could not refresh ${
50-
if (descriptor != null) {
51-
"$descriptor resources"
52-
} else {
53-
"all contexts."
54-
}
55-
}", e
43+
"Could not refresh $refreshMessage", e
5644
)
5745
}
5846
})
5947
}
48+
49+
private fun getRefreshMessage(descriptor: TreeStructure.Descriptor<*>?): String {
50+
return if (descriptor != null) {
51+
"resource $descriptor"
52+
} else {
53+
"all contexts"
54+
}
55+
}
6056
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/actions/SetAsCurrentClusterAction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ class SetAsCurrentClusterAction: StructureTreeAction(IContext::class.java) {
2525
val context: IContext = selectedNode?.getElement() ?: return
2626
val telemetry = TelemetryService.instance
2727
.action(NAME_PREFIX_CONTEXT + "switch")
28-
run("Setting ${context.context.name} as current cluster...", true,
28+
run("Setting ${context.name} as current cluster...", true,
2929
Progressive {
3030
try {
3131
getResourceModel()?.setCurrentContext(context)
3232
telemetry.success().send()
3333
} catch (e: Exception) {
3434
logger<SetAsCurrentClusterAction>().warn(
35-
"Could not set current context to ${context.context.name}.", e
35+
"Could not set current context to ${context.name}.", e
3636
)
3737
telemetry.error(e).send()
3838
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/model/AllContexts.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.redhat.devtools.intellij.kubernetes.model.context.IActiveContext
2121
import com.redhat.devtools.intellij.kubernetes.model.context.IContext
2222
import com.redhat.devtools.intellij.kubernetes.model.resource.ResourceKind
2323
import com.redhat.devtools.intellij.kubernetes.model.util.ResettableLazyProperty
24+
import com.redhat.devtools.intellij.kubernetes.model.util.ResourceException
25+
import com.redhat.devtools.intellij.kubernetes.model.util.toMessage
2426
import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService
2527
import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService.NAME_PREFIX_CONTEXT
2628
import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService.PROP_IS_OPENSHIFT
@@ -113,7 +115,7 @@ open class AllContexts(
113115
val all = createContexts(client.get(), client.get()?.config)
114116
_all.addAll(all)
115117
} catch (e: Exception) {
116-
//
118+
throw ResourceException("Could not parse kube config: ${toMessage(e)}", e)
117119
}
118120
}
119121
return _all
@@ -124,7 +126,7 @@ open class AllContexts(
124126
if (current == context) {
125127
return current
126128
}
127-
val newClient = clientFactory.invoke(context.context.context.namespace, context.context.name)
129+
val newClient = clientFactory.invoke(context.namespace, context.name)
128130
val new = setCurrentContext(newClient, emptyList())
129131
if (new != null) {
130132
modelChange.fireAllContextsChanged()
@@ -134,7 +136,7 @@ open class AllContexts(
134136

135137
override fun setCurrentNamespace(namespace: String): IActiveContext<out HasMetadata, out KubernetesClient>? {
136138
val old = this.current ?: return null
137-
val newClient = clientFactory.invoke(namespace, old.context.name)
139+
val newClient = clientFactory.invoke(namespace, old.name)
138140
val new = setCurrentContext(newClient, old.getWatched())
139141
if (new != null) {
140142
modelChange.fireCurrentNamespaceChanged(new, old)
@@ -173,6 +175,7 @@ open class AllContexts(
173175
lock.write {
174176
this.current?.close()
175177
clearAllContexts() // latter access will cause reload
178+
client.reset()
176179
}
177180
modelChange.fireAllContextsChanged()
178181
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/model/context/ActiveContext.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ abstract class ActiveContext<N : HasMetadata, C : KubernetesClient>(
487487
}
488488

489489
override fun close() {
490-
logger<ActiveContext<*, *>>().debug("Closing context ${context.name}.")
490+
logger<ActiveContext<*, *>>().debug("Closing context $name.")
491491
watch.close()
492492
dashboard.close()
493493
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/model/context/Context.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ package com.redhat.devtools.intellij.kubernetes.model.context
1313
import io.fabric8.kubernetes.api.model.NamedContext
1414

1515
interface IContext {
16-
val context: NamedContext
1716
val active: Boolean
17+
val name: String?
18+
val namespace: String?
1819
}
1920

20-
open class Context(override val context: NamedContext): IContext {
21+
open class Context(private val context: NamedContext): IContext {
2122
override val active: Boolean = false
22-
}
23+
override val name: String?
24+
get() = context.name
25+
override val namespace: String?
26+
get() = context.context?.namespace
27+
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/model/context/IActiveContext.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ interface IActiveContext<N: HasMetadata, C: KubernetesClient>: IContext {
6565
}
6666
}
6767

68-
val name: String?
69-
get() {
70-
return context.name
71-
}
7268
/**
7369
* The master url for this context. This is the url of the cluster for this context.
7470
*/

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/tree/KubernetesDescriptors.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@ import javax.swing.Icon
5050

5151
object KubernetesDescriptors {
5252

53-
fun createDescriptor(element: Any, childrenKind: ResourceKind<out HasMetadata>?, parent: NodeDescriptor<*>?, model: IResourceModel, project: Project): NodeDescriptor<*>? {
53+
fun createDescriptor(
54+
element: Any,
55+
childrenKind: ResourceKind<out HasMetadata>?,
56+
parent: NodeDescriptor<*>?,
57+
model: IResourceModel,
58+
project: Project
59+
): NodeDescriptor<*>? {
5460
return when {
5561
element is DescriptorFactory<*> ->
5662
element.create(parent, model, project)

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/tree/TreeStructure.kt

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ open class TreeStructure(
7070
private fun getChildElements(element: Any, contribution: ITreeStructureContribution): Collection<Any> {
7171
return try {
7272
contribution.getChildElements(element)
73-
} catch (e: java.lang.Exception) {
73+
} catch (e: Exception) {
7474
logger<TreeStructure>().warn(e)
7575
listOf(e)
7676
}
@@ -101,24 +101,31 @@ open class TreeStructure(
101101
}
102102

103103
override fun createDescriptor(element: Any, parent: NodeDescriptor<*>?): NodeDescriptor<*> {
104-
val descriptor: NodeDescriptor<*>? =
104+
return try {
105+
val descriptor: NodeDescriptor<*>? =
105106
getValidContributions()
106-
.map { it.createDescriptor(element, parent, project) }
107-
.find { it != null }
108-
if (descriptor != null) {
109-
return descriptor
110-
}
111-
return when (element) {
112-
is IContext -> ContextDescriptor(element, parent, model, project)
113-
is Exception -> ErrorDescriptor(element, parent, model, project)
114-
is Folder -> FolderDescriptor(element, parent, model, project)
115-
else -> Descriptor(element, null, parent, model, project)
107+
.map { it.createDescriptor(element, parent, project) }
108+
.find { it != null }
109+
descriptor ?: when (element) {
110+
is IContext -> ContextDescriptor(element, parent, model, project)
111+
is Exception -> ErrorDescriptor(element, parent, model, project)
112+
is Folder -> FolderDescriptor(element, parent, model, project)
113+
else -> Descriptor(element, null, parent, model, project)
114+
}
115+
} catch (e: Exception) {
116+
ErrorDescriptor(e, parent, model, project)
116117
}
117118
}
118119

119120
private fun getValidContributions(): Collection<ITreeStructureContribution> {
120121
return contributions
121-
.filter { it.canContribute() }
122+
.filter {
123+
try {
124+
it.canContribute()
125+
} catch (e: Exception) {
126+
false
127+
}
128+
}
122129
}
123130

124131
private fun getTreeStructureExtensions(model: IResourceModel): List<ITreeStructureContribution> {
@@ -167,11 +174,7 @@ open class TreeStructure(
167174
project
168175
) {
169176
override fun getLabel(element: C?): String {
170-
return if (element?.context?.name == null) {
171-
"<unknown context>"
172-
} else {
173-
element.context.name
174-
}
177+
return element?.name ?: "<unknown context>"
175178
}
176179

177180
override fun getIcon(element: C): Icon? {
@@ -237,26 +240,22 @@ open class TreeStructure(
237240
}
238241

239242
private class ErrorDescriptor(
240-
exception: java.lang.Exception,
243+
exception: Exception,
241244
parent: NodeDescriptor<*>?,
242245
model: IResourceModel,
243246
project: Project
244-
) : Descriptor<java.lang.Exception>(
247+
) : Descriptor<Exception>(
245248
exception,
246249
null,
247250
parent,
248251
model,
249252
project
250253
) {
251-
override fun getLabel(element: java.lang.Exception?): String {
252-
return getMessage(element)
253-
}
254-
255-
private fun getMessage(e: Exception?): String {
256-
return toMessage(e)
254+
override fun getLabel(element: Exception?): String {
255+
return toMessage(element)
257256
}
258257

259-
override fun getIcon(element: java.lang.Exception): Icon {
258+
override fun getIcon(element: Exception): Icon {
260259
return AllIcons.General.BalloonError
261260
}
262261
}

src/main/kotlin/com/redhat/devtools/intellij/kubernetes/tree/TreeUpdater.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
package com.redhat.devtools.intellij.kubernetes.tree
1212

1313
import com.intellij.ide.util.treeView.AbstractTreeStructure
14-
import com.intellij.ide.util.treeView.NodeDescriptor
1514
import com.intellij.openapi.Disposable
1615
import com.intellij.openapi.util.Disposer
1716
import com.intellij.ui.tree.StructureTreeModel
@@ -20,7 +19,6 @@ import com.redhat.devtools.intellij.kubernetes.actions.getDescriptor
2019
import com.redhat.devtools.intellij.kubernetes.model.IResourceModel
2120
import com.redhat.devtools.intellij.kubernetes.model.IResourceModelListener
2221
import com.redhat.devtools.intellij.kubernetes.model.context.IActiveContext
23-
import javax.swing.tree.DefaultMutableTreeNode
2422
import javax.swing.tree.TreeNode
2523
import javax.swing.tree.TreePath
2624

@@ -123,9 +121,8 @@ class TreeUpdater(
123121
}
124122
}
125123

126-
private fun isRootNode(element: Any?): Boolean {
127-
val descriptor = (treeModel.root as? DefaultMutableTreeNode)?.userObject as? NodeDescriptor<*>
128-
return element == descriptor?.element
124+
private fun isRootElement(element: Any?): Boolean {
125+
return element == structure.rootElement
129126
}
130127

131128
private fun invalidateRoot() {
@@ -150,7 +147,7 @@ class TreeUpdater(
150147
private fun findNodes(element: Any?): Collection<TreeNode> {
151148
return if (element == null) {
152149
emptyList()
153-
} else if (isRootNode(element)) {
150+
} else if (isRootElement(element)) {
154151
listOf(treeModel.root)
155152
} else {
156153
findNodes({ node: TreeNode -> hasElement(element, node) }, treeModel.root)

0 commit comments

Comments
 (0)