diff --git a/api/kubernetes/cli/applications.go b/api/kubernetes/cli/applications.go index 9a5e120540..3a15925324 100644 --- a/api/kubernetes/cli/applications.go +++ b/api/kubernetes/cli/applications.go @@ -430,6 +430,13 @@ func (kcl *KubeClient) GetApplicationFromServiceSelector(pods []corev1.Pod, serv updateOwnerReferenceToDeployment(&pod, replicaSets) } + if len(pod.OwnerReferences) == 0 { + return &models.K8sApplication{ + Name: pod.Name, + Kind: "Pod", + }, nil + } + return &models.K8sApplication{ Name: pod.OwnerReferences[0].Name, Kind: pod.OwnerReferences[0].Kind, diff --git a/api/kubernetes/cli/cronjob.go b/api/kubernetes/cli/cronjob.go index fa9cdf3fd4..6dbc6a4554 100644 --- a/api/kubernetes/cli/cronjob.go +++ b/api/kubernetes/cli/cronjob.go @@ -79,11 +79,16 @@ func (kcl *KubeClient) parseCronJob(cronJob batchv1.CronJob, jobsList *batchv1.J suspend = *cronJob.Spec.Suspend } + var command string + if len(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers) > 0 { + command = strings.Join(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Command, " ") + } + return models.K8sCronJob{ Id: string(cronJob.UID), Name: cronJob.Name, Namespace: cronJob.Namespace, - Command: strings.Join(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Command, " "), + Command: command, Schedule: cronJob.Spec.Schedule, Timezone: timezone, Suspend: suspend, diff --git a/api/kubernetes/cli/ingress.go b/api/kubernetes/cli/ingress.go index 9a8a343ad8..022df559bb 100644 --- a/api/kubernetes/cli/ingress.go +++ b/api/kubernetes/cli/ingress.go @@ -190,8 +190,10 @@ func parseIngress(ingress netv1.Ingress) models.K8sIngressInfo { if p.PathType != nil { path.PathType = string(*p.PathType) } - path.ServiceName = p.Backend.Service.Name - path.Port = int(p.Backend.Service.Port.Number) + if p.Backend.Service != nil { + path.ServiceName = p.Backend.Service.Name + path.Port = int(p.Backend.Service.Port.Number) + } result.Paths = append(result.Paths, path) } } diff --git a/api/kubernetes/cli/job.go b/api/kubernetes/cli/job.go index 75075a6d18..8949436f31 100644 --- a/api/kubernetes/cli/job.go +++ b/api/kubernetes/cli/job.go @@ -11,6 +11,7 @@ import ( models "github.com/portainer/portainer/api/http/models/kubernetes" "github.com/rs/zerolog/log" batchv1 "k8s.io/api/batch/v1" + corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -84,15 +85,32 @@ func (kcl *KubeClient) parseJob(job batchv1.Job) models.K8sJob { status, failedReason := determineJobStatus(job) podName := getJobPodName(kcl, job) + var command string + var container corev1.Container + if len(job.Spec.Template.Spec.Containers) > 0 { + command = strings.Join(job.Spec.Template.Spec.Containers[0].Command, " ") + container = job.Spec.Template.Spec.Containers[0] + } + + var backoffLimit int32 + if job.Spec.BackoffLimit != nil { + backoffLimit = *job.Spec.BackoffLimit + } + + var completions int32 + if job.Spec.Completions != nil { + completions = *job.Spec.Completions + } + return models.K8sJob{ ID: string(job.UID), Namespace: job.Namespace, Name: job.Name, PodName: podName, - Command: strings.Join(job.Spec.Template.Spec.Containers[0].Command, " "), - Container: job.Spec.Template.Spec.Containers[0], - BackoffLimit: *job.Spec.BackoffLimit, - Completions: *job.Spec.Completions, + Command: command, + Container: container, + BackoffLimit: backoffLimit, + Completions: completions, StartTime: times.start, FinishTime: times.finish, Duration: times.duration, diff --git a/api/kubernetes/cli/pod.go b/api/kubernetes/cli/pod.go index 4cb0109979..ab6eb68a88 100644 --- a/api/kubernetes/cli/pod.go +++ b/api/kubernetes/cli/pod.go @@ -128,10 +128,15 @@ func (kcl *KubeClient) CreateUserShellPod(ctx context.Context, serviceAccountNam return nil, errors.Wrap(err, "aborting pod creation; error waiting for shell pod ready status") } + var containerName string + if len(shellPod.Spec.Containers) > 0 { + containerName = shellPod.Spec.Containers[0].Name + } + podData := &portainer.KubernetesShellPod{ Namespace: shellPod.Namespace, PodName: shellPod.Name, - ContainerName: shellPod.Spec.Containers[0].Name, + ContainerName: containerName, ShellExecCommand: "env TERM=xterm-256color /bin/bash", } diff --git a/api/ldap/ldap.go b/api/ldap/ldap.go index c7cae76eea..abb90f1afa 100644 --- a/api/ldap/ldap.go +++ b/api/ldap/ldap.go @@ -294,7 +294,9 @@ func getGroupsByUser(userDN string, conn *ldap.Conn, settings []portainer.LDAPGr for _, entry := range sr.Entries { for _, attr := range entry.Attributes { - groups = append(groups, attr.Values[0]) + if len(attr.Values) > 0 { + groups = append(groups, attr.Values[0]) + } } } } diff --git a/pkg/edge/utils.go b/pkg/edge/utils.go index 4d0456b570..e0d5833596 100644 --- a/pkg/edge/utils.go +++ b/pkg/edge/utils.go @@ -40,6 +40,10 @@ func GetEndpointIDFromEdgeKey(edgeKey string) (int, error) { keyInfo := strings.Split(string(decodedKey), "|") + if len(keyInfo) != 4 { + return 0, errors.New("invalid key format") + } + return strconv.Atoi(keyInfo[3]) }