summaryrefslogtreecommitdiff
path: root/server/container_start.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/container_start.go')
-rw-r--r--server/container_start.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/server/container_start.go b/server/container_start.go
new file mode 100644
index 000000000..85be09484
--- /dev/null
+++ b/server/container_start.go
@@ -0,0 +1,43 @@
+package server
+
+import (
+ "fmt"
+
+ "github.com/kubernetes-incubator/cri-o/oci"
+ "github.com/sirupsen/logrus"
+ "golang.org/x/net/context"
+ pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
+)
+
+// StartContainer starts the container.
+func (s *Server) StartContainer(ctx context.Context, req *pb.StartContainerRequest) (*pb.StartContainerResponse, error) {
+ logrus.Debugf("StartContainerRequest %+v", req)
+ c, err := s.GetContainerFromRequest(req.ContainerId)
+ if err != nil {
+ return nil, err
+ }
+ state := s.Runtime().ContainerStatus(c)
+ if state.Status != oci.ContainerStateCreated {
+ return nil, fmt.Errorf("container %s is not in created state: %s", c.ID(), state.Status)
+ }
+
+ defer func() {
+ // if the call to StartContainer fails below we still want to fill
+ // some fields of a container status. In particular, we're going to
+ // adjust container started/finished time and set an error to be
+ // returned in the Reason field for container status call.
+ if err != nil {
+ s.Runtime().SetStartFailed(c, err)
+ }
+ s.ContainerStateToDisk(c)
+ }()
+
+ err = s.Runtime().StartContainer(c)
+ if err != nil {
+ return nil, fmt.Errorf("failed to start container %s: %v", c.ID(), err)
+ }
+
+ resp := &pb.StartContainerResponse{}
+ logrus.Debugf("StartContainerResponse %+v", resp)
+ return resp, nil
+}