40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
package kubernetes
|
|
|
|
import (
|
|
"context"
|
|
"github.com/kandev/kandev/internal/task/models"
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
kubeclient "k8s.io/client-go/kubernetes"
|
|
)
|
|
|
|
type environmentStatusResult struct {
|
|
record *models.KubernetesEnvironment
|
|
err error
|
|
}
|
|
type podStatusResult struct {
|
|
pod *corev1.Pod
|
|
err error
|
|
}
|
|
|
|
// A request projects one observed physical state onto every authorized session.
|
|
// Identity and task authorization remain checked separately for every row.
|
|
type sessionStatusCache struct {
|
|
client kubeclient.Interface
|
|
environments map[string]environmentStatusResult
|
|
pods map[string]podStatusResult
|
|
}
|
|
|
|
func newSessionStatusCache(client kubeclient.Interface) *sessionStatusCache {
|
|
return &sessionStatusCache{client: client, environments: make(map[string]environmentStatusResult), pods: make(map[string]podStatusResult)}
|
|
}
|
|
func (c *sessionStatusCache) pod(ctx context.Context, namespace, name string) (*corev1.Pod, error) {
|
|
key := namespace + "/" + name
|
|
result, exists := c.pods[key]
|
|
if !exists {
|
|
result.pod, result.err = c.client.CoreV1().Pods(namespace).Get(ctx, name, metav1.GetOptions{})
|
|
c.pods[key] = result
|
|
}
|
|
return result.pod, result.err
|
|
}
|