2019-01-12 04:58:27 +00:00
|
|
|
/*
|
|
|
|
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 {
|
2019-09-27 21:51:53 +00:00
|
|
|
errlist = append(errlist, fmt.Errorf("failed to SyncPod: %v", p.SyncError))
|
2019-01-12 04:58:27 +00:00
|
|
|
}
|
|
|
|
for _, result := range p.SyncResults {
|
|
|
|
if result.Error != nil {
|
2019-09-27 21:51:53 +00:00
|
|
|
errlist = append(errlist, fmt.Errorf("failed to %q for %q with %v: %q", result.Action, result.Target,
|
2019-01-12 04:58:27 +00:00
|
|
|
result.Error, result.Message))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return utilerrors.NewAggregate(errlist)
|
|
|
|
}
|