*: abstractions and ImageService
plus some fix here and there Signed-off-by: Antonio Murdaca <runcom@redhat.com>
This commit is contained in:
parent
d54ae80ba6
commit
06e013cd3d
5 changed files with 176 additions and 99 deletions
|
@ -19,6 +19,11 @@ func main() {
|
||||||
log.Fatalf("failed to listen: %v", err)
|
log.Fatalf("failed to listen: %v", err)
|
||||||
}
|
}
|
||||||
s := grpc.NewServer()
|
s := grpc.NewServer()
|
||||||
runtime.RegisterRuntimeServiceServer(s, &server.Server{})
|
service, err := server.New("")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
runtime.RegisterRuntimeServiceServer(s, service)
|
||||||
|
runtime.RegisterImageServiceServer(s, service)
|
||||||
s.Serve(lis)
|
s.Serve(lis)
|
||||||
}
|
}
|
||||||
|
|
26
server/image.go
Normal file
26
server/image.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
pb "github.com/kubernetes/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListImages lists existing images.
|
||||||
|
func (s *Server) ListImages(ctx context.Context, req *pb.ListImagesRequest) (*pb.ListImagesResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImageStatus returns the status of the image.
|
||||||
|
func (s *Server) ImageStatus(ctx context.Context, req *pb.ImageStatusRequest) (*pb.ImageStatusResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PullImage pulls a image with authentication config.
|
||||||
|
func (s *Server) PullImage(ctx context.Context, req *pb.PullImageRequest) (*pb.PullImageResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveImage removes the image.
|
||||||
|
func (s *Server) RemoveImage(ctx context.Context, req *pb.RemoveImageRequest) (*pb.RemoveImageResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
108
server/runtime.go
Normal file
108
server/runtime.go
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
pb "github.com/kubernetes/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
||||||
|
"github.com/opencontainers/ocitools/generate"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Version returns the runtime name, runtime version and runtime API version
|
||||||
|
func (s *Server) Version(ctx context.Context, req *pb.VersionRequest) (*pb.VersionResponse, error) {
|
||||||
|
version, err := getGPRCVersion()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
runtimeVersion, err := s.runtime.Version()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// taking const address
|
||||||
|
rav := runtimeAPIVersion
|
||||||
|
runtimeName := s.runtime.Name()
|
||||||
|
|
||||||
|
return &pb.VersionResponse{
|
||||||
|
Version: &version,
|
||||||
|
RuntimeName: &runtimeName,
|
||||||
|
RuntimeVersion: &runtimeVersion,
|
||||||
|
RuntimeApiVersion: &rav,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreatePodSandbox creates a pod-level sandbox.
|
||||||
|
// The definition of PodSandbox is at https://github.com/kubernetes/kubernetes/pull/25899
|
||||||
|
func (s *Server) CreatePodSandbox(ctx context.Context, req *pb.CreatePodSandboxRequest) (*pb.CreatePodSandboxResponse, error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// TODO: Parametrize as a global argument to ocid
|
||||||
|
ocidSandboxDir := "/var/lib/ocid/sandbox"
|
||||||
|
podSandboxDir := filepath.Join(ocidSandboxDir, req.GetConfig().GetName())
|
||||||
|
|
||||||
|
g := generate.New()
|
||||||
|
|
||||||
|
// TODO: Customize the config per the settings in the req
|
||||||
|
err = g.SaveToFile(filepath.Join(podSandboxDir, "config.json"))
|
||||||
|
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// StopPodSandbox stops the sandbox. If there are any running containers in the
|
||||||
|
// sandbox, they should be force terminated.
|
||||||
|
func (s *Server) StopPodSandbox(context.Context, *pb.StopPodSandboxRequest) (*pb.StopPodSandboxResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeletePodSandbox deletes the sandbox. If there are any running containers in the
|
||||||
|
// sandbox, they should be force deleted.
|
||||||
|
func (s *Server) DeletePodSandbox(context.Context, *pb.DeletePodSandboxRequest) (*pb.DeletePodSandboxResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodSandboxStatus returns the Status of the PodSandbox.
|
||||||
|
func (s *Server) PodSandboxStatus(context.Context, *pb.PodSandboxStatusRequest) (*pb.PodSandboxStatusResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPodSandbox returns a list of SandBox.
|
||||||
|
func (s *Server) ListPodSandbox(context.Context, *pb.ListPodSandboxRequest) (*pb.ListPodSandboxResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateContainer creates a new container in specified PodSandbox
|
||||||
|
func (s *Server) CreateContainer(context.Context, *pb.CreateContainerRequest) (*pb.CreateContainerResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartContainer starts the container.
|
||||||
|
func (s *Server) StartContainer(context.Context, *pb.StartContainerRequest) (*pb.StartContainerResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StopContainer stops a running container with a grace period (i.e., timeout).
|
||||||
|
func (s *Server) StopContainer(context.Context, *pb.StopContainerRequest) (*pb.StopContainerResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveContainer removes the container. If the container is running, the container
|
||||||
|
// should be force removed.
|
||||||
|
func (s *Server) RemoveContainer(context.Context, *pb.RemoveContainerRequest) (*pb.RemoveContainerResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListContainers lists all containers by filters.
|
||||||
|
func (s *Server) ListContainers(context.Context, *pb.ListContainersRequest) (*pb.ListContainersResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainerStatus returns status of the container.
|
||||||
|
func (s *Server) ContainerStatus(context.Context, *pb.ContainerStatusRequest) (*pb.ContainerStatusResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exec executes the command in the container.
|
||||||
|
func (s *Server) Exec(pb.RuntimeService_ExecServer) error {
|
||||||
|
return nil
|
||||||
|
}
|
125
server/server.go
125
server/server.go
|
@ -1,113 +1,52 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
const (
|
||||||
"path/filepath"
|
runtimeAPIVersion = "v1alpha1"
|
||||||
|
|
||||||
pb "github.com/kubernetes/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
|
||||||
"github.com/opencontainers/ocitools/generate"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server implements the RuntimeService
|
// Server implements the RuntimeService and ImageService
|
||||||
type Server struct{}
|
type Server struct {
|
||||||
|
runtime ociRuntime
|
||||||
// Version returns the runtime name, runtime version and runtime API version
|
|
||||||
func (s *Server) Version(ctx context.Context, req *pb.VersionRequest) (*pb.VersionResponse, error) {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
version, err := getGPRCVersion()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
runtimeName := "runc"
|
// New creates a new Server with options provided
|
||||||
|
func New(runtimePath string) (*Server, error) {
|
||||||
runtimeVersion, err := execRuncVersion("runc", "-v")
|
// TODO(runcom): runtimePath arg is unused but it might be useful
|
||||||
if err != nil {
|
// if we're willing to open the doors to other runtimes in the future.
|
||||||
return nil, err
|
r := &runcRuntime{}
|
||||||
}
|
return &Server{
|
||||||
|
runtime: r,
|
||||||
runtimeApiVersion := "v1alpha1"
|
|
||||||
|
|
||||||
return &pb.VersionResponse{
|
|
||||||
Version: &version,
|
|
||||||
RuntimeName: &runtimeName,
|
|
||||||
RuntimeVersion: &runtimeVersion,
|
|
||||||
RuntimeApiVersion: &runtimeApiVersion,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreatePodSandbox creates a pod-level sandbox.
|
// TODO(runcom): export? this is being done just because runc shows a 3 line version :/
|
||||||
// The definition of PodSandbox is at https://github.com/kubernetes/kubernetes/pull/25899
|
// but it might actually be a useful abstraction (?)
|
||||||
func (s *Server) CreatePodSandbox(ctx context.Context, req *pb.CreatePodSandboxRequest) (*pb.CreatePodSandboxResponse, error) {
|
type ociRuntime interface {
|
||||||
var err error
|
Name() string
|
||||||
|
Path() (string, error)
|
||||||
// TODO: Parametrize as a global argument to ocid
|
Version() (string, error)
|
||||||
ocidSandboxDir := "/var/lib/ocid/sandbox"
|
|
||||||
podSandboxDir := filepath.Join(ocidSandboxDir, req.GetConfig().GetName())
|
|
||||||
|
|
||||||
g := generate.New()
|
|
||||||
|
|
||||||
// TODO: Customize the config per the settings in the req
|
|
||||||
err = g.SaveToFile(filepath.Join(podSandboxDir, "config.json"))
|
|
||||||
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StopPodSandbox stops the sandbox. If there are any running containers in the
|
type runcRuntime struct {
|
||||||
// sandbox, they should be force terminated.
|
|
||||||
func (s *Server) StopPodSandbox(context.Context, *pb.StopPodSandboxRequest) (*pb.StopPodSandboxResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeletePodSandbox deletes the sandbox. If there are any running containers in the
|
func (r *runcRuntime) Name() string {
|
||||||
// sandbox, they should be force deleted.
|
return "runc"
|
||||||
func (s *Server) DeletePodSandbox(context.Context, *pb.DeletePodSandboxRequest) (*pb.DeletePodSandboxResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PodSandboxStatus returns the Status of the PodSandbox.
|
func (r *runcRuntime) Path() (string, error) {
|
||||||
func (s *Server) PodSandboxStatus(context.Context, *pb.PodSandboxStatusRequest) (*pb.PodSandboxStatusResponse, error) {
|
// TODO(runcom): we're saying runc is always in $PATH here for now
|
||||||
return nil, nil
|
return "runc", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListPodSandbox returns a list of SandBox.
|
func (r *runcRuntime) Version() (string, error) {
|
||||||
func (s *Server) ListPodSandbox(context.Context, *pb.ListPodSandboxRequest) (*pb.ListPodSandboxResponse, error) {
|
path, err := r.Path()
|
||||||
return nil, nil
|
if err != nil {
|
||||||
|
return "", err
|
||||||
}
|
}
|
||||||
|
runtimeVersion, err := execRuncVersion(path, "-v")
|
||||||
// CreateContainer creates a new container in specified PodSandbox
|
if err != nil {
|
||||||
func (s *Server) CreateContainer(context.Context, *pb.CreateContainerRequest) (*pb.CreateContainerResponse, error) {
|
return "", err
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
return runtimeVersion, nil
|
||||||
// StartContainer starts the container.
|
|
||||||
func (s *Server) StartContainer(context.Context, *pb.StartContainerRequest) (*pb.StartContainerResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopContainer stops a running container with a grace period (i.e., timeout).
|
|
||||||
func (s *Server) StopContainer(context.Context, *pb.StopContainerRequest) (*pb.StopContainerResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveContainer removes the container. If the container is running, the container
|
|
||||||
// should be force removed.
|
|
||||||
func (s *Server) RemoveContainer(context.Context, *pb.RemoveContainerRequest) (*pb.RemoveContainerResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListContainers lists all containers by filters.
|
|
||||||
func (s *Server) ListContainers(context.Context, *pb.ListContainersRequest) (*pb.ListContainersResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerStatus returns status of the container.
|
|
||||||
func (s *Server) ContainerStatus(context.Context, *pb.ContainerStatusRequest) (*pb.ContainerStatusResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exec executes the command in the container.
|
|
||||||
func (s *Server) Exec(pb.RuntimeService_ExecServer) error {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,5 @@ func getGPRCVersion() (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
return out, nil
|
||||||
return out, err
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue