mirror of https://github.com/k3s-io/k3s
129 lines
4.2 KiB
Go
129 lines
4.2 KiB
Go
|
/*
|
||
|
Copyright 2015 The Kubernetes Authors.
|
||
|
|
||
|
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 container
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||
|
)
|
||
|
|
||
|
// TODO(random-liu): We need to better organize runtime errors for introspection.
|
||
|
|
||
|
// Container Terminated and Kubelet is backing off the restart
|
||
|
var ErrCrashLoopBackOff = errors.New("CrashLoopBackOff")
|
||
|
|
||
|
var (
|
||
|
// ErrContainerNotFound returned when a container in the given pod with the
|
||
|
// given container name was not found, amongst those managed by the kubelet.
|
||
|
ErrContainerNotFound = errors.New("no matching container")
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrRunContainer = errors.New("RunContainerError")
|
||
|
ErrKillContainer = errors.New("KillContainerError")
|
||
|
ErrVerifyNonRoot = errors.New("VerifyNonRootError")
|
||
|
ErrRunInitContainer = errors.New("RunInitContainerError")
|
||
|
ErrCreatePodSandbox = errors.New("CreatePodSandboxError")
|
||
|
ErrConfigPodSandbox = errors.New("ConfigPodSandboxError")
|
||
|
ErrKillPodSandbox = errors.New("KillPodSandboxError")
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrSetupNetwork = errors.New("SetupNetworkError")
|
||
|
ErrTeardownNetwork = errors.New("TeardownNetworkError")
|
||
|
)
|
||
|
|
||
|
// SyncAction indicates different kind of actions in SyncPod() and KillPod(). Now there are only actions
|
||
|
// about start/kill container and setup/teardown network.
|
||
|
type SyncAction string
|
||
|
|
||
|
const (
|
||
|
StartContainer SyncAction = "StartContainer"
|
||
|
KillContainer SyncAction = "KillContainer"
|
||
|
SetupNetwork SyncAction = "SetupNetwork"
|
||
|
TeardownNetwork SyncAction = "TeardownNetwork"
|
||
|
InitContainer SyncAction = "InitContainer"
|
||
|
CreatePodSandbox SyncAction = "CreatePodSandbox"
|
||
|
ConfigPodSandbox SyncAction = "ConfigPodSandbox"
|
||
|
KillPodSandbox SyncAction = "KillPodSandbox"
|
||
|
)
|
||
|
|
||
|
// SyncResult is the result of sync action.
|
||
|
type SyncResult struct {
|
||
|
// The associated action of the result
|
||
|
Action SyncAction
|
||
|
// The target of the action, now the target can only be:
|
||
|
// * Container: Target should be container name
|
||
|
// * Network: Target is useless now, we just set it as pod full name now
|
||
|
Target interface{}
|
||
|
// Brief error reason
|
||
|
Error error
|
||
|
// Human readable error reason
|
||
|
Message string
|
||
|
}
|
||
|
|
||
|
// NewSyncResult generates new SyncResult with specific Action and Target
|
||
|
func NewSyncResult(action SyncAction, target interface{}) *SyncResult {
|
||
|
return &SyncResult{Action: action, Target: target}
|
||
|
}
|
||
|
|
||
|
// Fail fails the SyncResult with specific error and message
|
||
|
func (r *SyncResult) Fail(err error, msg string) {
|
||
|
r.Error, r.Message = err, msg
|
||
|
}
|
||
|
|
||
|
// PodSyncResult is the summary result of SyncPod() and KillPod()
|
||
|
type PodSyncResult struct {
|
||
|
// Result of different sync actions
|
||
|
SyncResults []*SyncResult
|
||
|
// Error encountered in SyncPod() and KillPod() that is not already included in SyncResults
|
||
|
SyncError error
|
||
|
}
|
||
|
|
||
|
// AddSyncResult adds multiple SyncResult to current PodSyncResult
|
||
|
func (p *PodSyncResult) AddSyncResult(result ...*SyncResult) {
|
||
|
p.SyncResults = append(p.SyncResults, result...)
|
||
|
}
|
||
|
|
||
|
// AddPodSyncResult merges a PodSyncResult to current one
|
||
|
func (p *PodSyncResult) AddPodSyncResult(result PodSyncResult) {
|
||
|
p.AddSyncResult(result.SyncResults...)
|
||
|
p.SyncError = result.SyncError
|
||
|
}
|
||
|
|
||
|
// Fail fails the PodSyncResult with an error occurred in SyncPod() and KillPod() itself
|
||
|
func (p *PodSyncResult) Fail(err error) {
|
||
|
p.SyncError = err
|
||
|
}
|
||
|
|
||
|
// Error returns an error summarizing all the errors in PodSyncResult
|
||
|
func (p *PodSyncResult) Error() error {
|
||
|
errlist := []error{}
|
||
|
if p.SyncError != nil {
|
||
|
errlist = append(errlist, fmt.Errorf("failed to SyncPod: %v\n", p.SyncError))
|
||
|
}
|
||
|
for _, result := range p.SyncResults {
|
||
|
if result.Error != nil {
|
||
|
errlist = append(errlist, fmt.Errorf("failed to %q for %q with %v: %q\n", result.Action, result.Target,
|
||
|
result.Error, result.Message))
|
||
|
}
|
||
|
}
|
||
|
return utilerrors.NewAggregate(errlist)
|
||
|
}
|