
The io/ioutil package has been deprecated as of Go 1.16, see https://golang.org/doc/go1.16#ioutil. This commit replaces the existing io/ioutil functions with their new definitions in io and os packages. Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
//go:build linux
|
|
// +build linux
|
|
|
|
/*
|
|
Copyright The containerd 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 runc
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/containerd/containerd/api/events"
|
|
"github.com/containerd/containerd/log"
|
|
"github.com/containerd/containerd/runtime"
|
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// GetTopic converts an event from an interface type to the specific
|
|
// event topic id
|
|
func GetTopic(e interface{}) string {
|
|
switch e.(type) {
|
|
case *events.TaskCreate:
|
|
return runtime.TaskCreateEventTopic
|
|
case *events.TaskStart:
|
|
return runtime.TaskStartEventTopic
|
|
case *events.TaskOOM:
|
|
return runtime.TaskOOMEventTopic
|
|
case *events.TaskExit:
|
|
return runtime.TaskExitEventTopic
|
|
case *events.TaskDelete:
|
|
return runtime.TaskDeleteEventTopic
|
|
case *events.TaskExecAdded:
|
|
return runtime.TaskExecAddedEventTopic
|
|
case *events.TaskExecStarted:
|
|
return runtime.TaskExecStartedEventTopic
|
|
case *events.TaskPaused:
|
|
return runtime.TaskPausedEventTopic
|
|
case *events.TaskResumed:
|
|
return runtime.TaskResumedEventTopic
|
|
case *events.TaskCheckpointed:
|
|
return runtime.TaskCheckpointedEventTopic
|
|
default:
|
|
logrus.Warnf("no topic for type %#v", e)
|
|
}
|
|
return runtime.TaskUnknownTopic
|
|
}
|
|
|
|
// ShouldKillAllOnExit reads the bundle's OCI spec and returns true if
|
|
// there is an error reading the spec or if the container has a private PID namespace
|
|
func ShouldKillAllOnExit(ctx context.Context, bundlePath string) bool {
|
|
var bundleSpec specs.Spec
|
|
bundleConfigContents, err := os.ReadFile(filepath.Join(bundlePath, "config.json"))
|
|
if err != nil {
|
|
log.G(ctx).WithError(err).Error("shouldKillAllOnExit: failed to read config.json")
|
|
return true
|
|
}
|
|
if err := json.Unmarshal(bundleConfigContents, &bundleSpec); err != nil {
|
|
log.G(ctx).WithError(err).Error("shouldKillAllOnExit: failed to unmarshal bundle json")
|
|
return true
|
|
}
|
|
if bundleSpec.Linux != nil {
|
|
for _, ns := range bundleSpec.Linux.Namespaces {
|
|
if ns.Type == specs.PIDNamespace && ns.Path == "" {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|