diff --git a/cri_image_service.go b/cri_image_service.go deleted file mode 100644 index 7c6f6c490..000000000 --- a/cri_image_service.go +++ /dev/null @@ -1,333 +0,0 @@ -// MIT License -// -// Copyright (c) 2020 Plamen Petrov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package main - -import ( - "encoding/json" - "strconv" - "strings" - - imagedigest "github.com/opencontainers/go-digest" - log "github.com/sirupsen/logrus" - - "github.com/containerd/containerd" - "github.com/containerd/containerd/errdefs" - containerdimages "github.com/containerd/containerd/images" - ctrdutil "github.com/containerd/cri/pkg/containerd/util" - "github.com/containerd/cri/pkg/store" - imagestore "github.com/containerd/cri/pkg/store/image" - "github.com/docker/distribution/reference" - distribution "github.com/docker/distribution/reference" - imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" - "golang.org/x/net/context" - criruntime "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" -) - -type imageServer struct { - criruntime.ImageServiceServer - client *containerd.Client - imageStore *imagestore.Store -} - -// NewImageServer Creates a new image server -func NewImageServer(client *containerd.Client) *imageServer { - is := &imageServer{ - client: client, - imageStore: imagestore.NewStore(client), - } - - return is -} - -// PullImage Pulls an image -func (s *imageServer) PullImage(ctx context.Context, r *criruntime.PullImageRequest) (*criruntime.PullImageResponse, error) { - log.Debug("Received PullImage") - - ctx = ctrdutil.WithNamespace(ctx) - - imageRef := r.GetImage().GetImage() - namedRef, err := distribution.ParseDockerRef(imageRef) - if err != nil { - return nil, errors.Wrapf(err, "failed to parse image reference %q", imageRef) - } - - ref := namedRef.String() - if ref != imageRef { - log.Debugf("PullImage using normalized image ref: %q", ref) - } - - var ( - isSchema1 bool - imageHandler containerdimages.HandlerFunc = func(_ context.Context, - desc imagespec.Descriptor) ([]imagespec.Descriptor, error) { - if desc.MediaType == containerdimages.MediaTypeDockerSchema1Manifest { - isSchema1 = true - } - return nil, nil - } - ) - - pullOpts := []containerd.RemoteOpt{ - containerd.WithSchema1Conversion, - containerd.WithPullSnapshotter("devmapper"), - containerd.WithPullUnpack, - containerd.WithImageHandler(imageHandler), - } - - image, err := s.client.Pull(ctx, ref, pullOpts...) - if err != nil { - return nil, errors.Wrapf(err, "failed to pull and unpack image %q", ref) - } - - configDesc, err := image.Config(ctx) - if err != nil { - return nil, errors.Wrap(err, "get image config descriptor") - } - - imageID := configDesc.Digest.String() - - repoDigest, repoTag := getRepoDigestAndTag(namedRef, image.Target().Digest, isSchema1) - for _, r := range []string{imageID, repoTag, repoDigest} { - if r == "" { - continue - } - if err := s.createImageReference(ctx, r, image.Target()); err != nil { - return nil, errors.Wrapf(err, "failed to create image reference %q", r) - } - - if err := s.imageStore.Update(ctx, r); err != nil { - return nil, errors.Wrapf(err, "failed to update image store %q", r) - } - } - - log.Debugf("Pulled image %q with image id %q, repo tag %q, repo digest %q", imageRef, imageID, - repoTag, repoDigest) - - return &criruntime.PullImageResponse{ImageRef: imageID}, nil -} - -// RemoveImage Removes an image. Does not return error if image does not exist -func (s *imageServer) RemoveImage(ctx context.Context, r *criruntime.RemoveImageRequest) (*criruntime.RemoveImageResponse, error) { - // (Plamen) Does not implement the full remove image functionality. we do not remove the entry for the image from the image store - _, err := s.localResolve(r.GetImage().GetImage()) - if err != nil { - if err == store.ErrNotExist { - // return empty without error when image not found. - return &criruntime.RemoveImageResponse{}, nil - } - return nil, errors.Wrapf(err, "can not resolve %q locally", r.GetImage().GetImage()) - } - - return &criruntime.RemoveImageResponse{}, nil -} - -// ListImages Lists the pulled images -func (s *imageServer) ListImages(ctx context.Context, r *criruntime.ListImagesRequest) (*criruntime.ListImagesResponse, error) { - imagesInStore := s.imageStore.List() - - var images []*criruntime.Image - for _, image := range imagesInStore { - images = append(images, toCRIImage(image)) - } - - return &criruntime.ListImagesResponse{Images: images}, nil -} - -// ImageFsInfo Returns info about the file system usage. STUB -func (c *imageServer) ImageFsInfo(ctx context.Context, r *criruntime.ImageFsInfoRequest) (*criruntime.ImageFsInfoResponse, error) { - return &criruntime.ImageFsInfoResponse{ - ImageFilesystems: []*criruntime.FilesystemUsage{ - { - Timestamp: int64(1337), - FsId: &criruntime.FilesystemIdentifier{Mountpoint: "placeholder"}, - UsedBytes: &criruntime.UInt64Value{Value: uint64(1337)}, - InodesUsed: &criruntime.UInt64Value{Value: uint64(1337)}, - }, - }, - }, nil -} - -// ImageStatus Returns the status of an image -func (s *imageServer) ImageStatus(ctx context.Context, r *criruntime.ImageStatusRequest) (*criruntime.ImageStatusResponse, error) { - image, err := s.localResolve(r.GetImage().GetImage()) - if err != nil { - if err == store.ErrNotExist { - // return empty without error when image not found. - return &criruntime.ImageStatusResponse{}, nil - } - return nil, errors.Wrapf(err, "can not resolve %q locally", r.GetImage().GetImage()) - } - - runtimeImage := toCRIImage(image) - info, err := s.toCRIImageInfo(ctx, &image, r.GetVerbose()) - if err != nil { - return nil, errors.Wrap(err, "failed to generate image info") - } - - return &criruntime.ImageStatusResponse{ - Image: runtimeImage, - Info: info, - }, nil -} - -// getRepoDigestAngTag returns image repoDigest and repoTag of the named image reference. -func getRepoDigestAndTag(namedRef distribution.Named, digest imagedigest.Digest, schema1 bool) (string, string) { - var repoTag, repoDigest string - if _, ok := namedRef.(distribution.NamedTagged); ok { - repoTag = namedRef.String() - } - if _, ok := namedRef.(distribution.Canonical); ok { - repoDigest = namedRef.String() - } else if !schema1 { - // digest is not actual repo digest for schema1 image. - repoDigest = namedRef.Name() + "@" + digest.String() - } - return repoDigest, repoTag -} - -func (s *imageServer) createImageReference(ctx context.Context, name string, desc imagespec.Descriptor) error { - img := containerdimages.Image{ - Name: name, - Target: desc, - } - - oldImg, err := s.client.ImageService().Create(ctx, img) - if err == nil || !errdefs.IsAlreadyExists(err) { - return err - } - if oldImg.Target.Digest == img.Target.Digest { - return nil - } - _, err = s.client.ImageService().Update(ctx, img, "target", "labels") - return err -} - -// returns the image associated with the ref -func (s *imageServer) localResolve(refOrID string) (imagestore.Image, error) { - getImageID := func(refOrId string) string { - if _, err := imagedigest.Parse(refOrID); err == nil { - return refOrID - } - return func(ref string) string { - // ref is not image id, try to resolve it locally. - // TODO(random-liu): Handle this error better for debugging. - normalized, err := reference.ParseDockerRef(ref) - if err != nil { - return "" - } - id, err := s.imageStore.Resolve(normalized.String()) - if err != nil { - return "" - } - return id - }(refOrID) - } - - imageID := getImageID(refOrID) - if imageID == "" { - // Try to treat ref as imageID - imageID = refOrID - } - return s.imageStore.Get(imageID) -} - -type verboseImageInfo struct { - ChainID string `json:"chainID"` - ImageSpec imagespec.Image `json:"imageSpec"` -} - -// toCRIImage converts internal image object to CRI runtime.Image. -func toCRIImage(image imagestore.Image) *criruntime.Image { - repoTags, repoDigests := parseImageReferences(image.References) - runtimeImage := &criruntime.Image{ - Id: image.ID, - RepoTags: repoTags, - RepoDigests: repoDigests, - Size_: uint64(image.Size), - } - uid, username := getUserFromImage(image.ImageSpec.Config.User) - if uid != nil { - runtimeImage.Uid = &criruntime.Int64Value{Value: *uid} - } - runtimeImage.Username = username - - return runtimeImage -} - -// toCRIImageInfo converts internal image object information to CRI image status response info map. -func (s *imageServer) toCRIImageInfo(ctx context.Context, image *imagestore.Image, verbose bool) (map[string]string, error) { - if !verbose { - return nil, nil - } - - info := make(map[string]string) - - imi := &verboseImageInfo{ - ChainID: image.ChainID, - ImageSpec: image.ImageSpec, - } - - m, err := json.Marshal(imi) - if err == nil { - info["info"] = string(m) - } else { - log.WithError(err).Errorf("failed to marshal info %v", imi) - info["info"] = err.Error() - } - - return info, nil -} - -func parseImageReferences(refs []string) ([]string, []string) { - var tags, digests []string - for _, ref := range refs { - parsed, err := reference.ParseAnyReference(ref) - if err != nil { - continue - } - if _, ok := parsed.(reference.Canonical); ok { - digests = append(digests, parsed.String()) - } else if _, ok := parsed.(reference.Tagged); ok { - tags = append(tags, parsed.String()) - } - } - return tags, digests -} - -func getUserFromImage(user string) (*int64, string) { - // return both empty if user is not specified in the image. - if user == "" { - return nil, "" - } - // split instances where the id may contain user:group - user = strings.Split(user, ":")[0] - // user could be either uid or user name. Try to interpret as numeric uid. - uid, err := strconv.ParseInt(user, 10, 64) - if err != nil { - // If user is non numeric, assume it's user name. - return nil, user - } - // If user is a numeric uid. - return &uid, "" -} diff --git a/fccd-orchestrator.go b/fccd-orchestrator.go index 46da84434..c564fb015 100644 --- a/fccd-orchestrator.go +++ b/fccd-orchestrator.go @@ -34,10 +34,11 @@ import ( ctrdlog "github.com/containerd/containerd/log" log "github.com/sirupsen/logrus" + fccdcri "github.com/ustiugov/fccd-orchestrator/cri" ctriface "github.com/ustiugov/fccd-orchestrator/ctriface" hpb "github.com/ustiugov/fccd-orchestrator/helloworld" + pb "github.com/ustiugov/fccd-orchestrator/proto" "google.golang.org/grpc" - criruntime "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" ) const ( @@ -123,116 +124,123 @@ func main() { funcPool = NewFuncPool(*isSaveMemory, *servedThreshold, *pinnedFuncNum, testModeOn) - is := NewImageServer(orch.GetCtrdClient()) + go orchServe() + is := fccdcri.NewImageService(orch.GetCtrdClient(), *snapshotter) imageServe(is) - runtimeServe() fwdServe() } +type server struct { + pb.UnimplementedOrchestratorServer +} + type fwdServer struct { hpb.UnimplementedFwdGreeterServer } -type runtimeServer struct { - criruntime.RuntimeServiceServer +func orchServe() { + lis, err := net.Listen("tcp", port) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + s := grpc.NewServer() + pb.RegisterOrchestratorServer(s, &server{}) + + log.Println("Listening on port" + port) + if err := s.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } } -func imageServe(is *imageServer) { - lis, err := net.Listen("unix", "/users/plamenpp/fccd-image.sock") +func fwdServe() { + lis, err := net.Listen("tcp", fwdPort) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() - criruntime.RegisterImageServiceServer(s, is) + hpb.RegisterFwdGreeterServer(s, &fwdServer{}) + log.Println("Listening on port" + fwdPort) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } -func runtimeServe() { - lis, err := net.Listen("unix", "/users/plamenpp/fccd-runtime.sock") +func imageServe(is *fccdcri.ImageService) { + lis, err := net.Listen("unix", "/users/plamenpp/fccd-image.sock") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() - criruntime.RegisterRuntimeServiceServer(s, &runtimeServer{}) + fccdcri.RegisterImageService(s, is) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } -func fwdServe() { - lis, err := net.Listen("tcp", fwdPort) +/*func runtimeServe() { + lis, err := net.Listen("unix", "/users/plamenpp/fccd-runtime.sock") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() - hpb.RegisterFwdGreeterServer(s, &fwdServer{}) + criruntime.RegisterRuntimeServiceServer(s, &runtimeServer{}) - log.Println("Listening on port" + fwdPort) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } -} +}*/ -func (s *fwdServer) FwdHello(ctx context.Context, in *hpb.FwdHelloReq) (*hpb.FwdHelloResp, error) { +// StartVM, StopSingleVM and StopVMs are legacy functions that manage functions and VMs +// Should be used only to bootstrap an experiment (e.g., quick parallel start of many functions) +func (s *server) StartVM(ctx context.Context, in *pb.StartVMReq) (*pb.StartVMResp, error) { fID := in.GetId() imageName := in.GetImage() - payload := in.GetPayload() - - logger := log.WithFields(log.Fields{"fID": fID, "image": imageName, "payload": payload}) - logger.Debug("Received FwdHelloVM") + log.WithFields(log.Fields{"fID": fID, "image": imageName}).Info("Received direct StartVM") - resp, _, err := funcPool.Serve(ctx, fID, imageName, payload) - return resp, err -} + tProfile := "not supported anymore" -// Version Stub -func (c *runtimeServer) Version(ctx context.Context, r *criruntime.VersionRequest) (*criruntime.VersionResponse, error) { - return &criruntime.VersionResponse{ - Version: "n/a", - RuntimeName: "fccd", - RuntimeVersion: "0.0.0", - RuntimeApiVersion: "0.0.0", - }, nil -} + _, _, err := funcPool.Serve(ctx, fID, imageName, "record") + if err != nil { + return &pb.StartVMResp{Message: "First serve failed", Profile: tProfile}, err + } -// RunPodSandbox Stub -func (c *runtimeServer) RunPodSandbox(ctx context.Context, r *criruntime.RunPodSandboxRequest) (*criruntime.RunPodSandboxResponse, error) { - return &criruntime.RunPodSandboxResponse{PodSandboxId: "stub"}, nil + return &pb.StartVMResp{Message: "started VM instance for a function " + fID, Profile: tProfile}, nil } -// StopPodSandbox Stub -func (c *runtimeServer) StopPodSandbox(ctx context.Context, r *criruntime.StopPodSandboxRequest) (*criruntime.StopPodSandboxResponse, error) { - return &criruntime.StopPodSandboxResponse{}, nil -} +func (s *server) StopSingleVM(ctx context.Context, in *pb.StopSingleVMReq) (*pb.Status, error) { + fID := in.GetId() + isSync := true + log.WithFields(log.Fields{"fID": fID}).Info("Received direct StopVM") + message, err := funcPool.RemoveInstance(fID, "bogus imageName", isSync) + if err != nil { + log.Warn(message, err) + } -// RemovePodSandbox Stub -func (c *runtimeServer) RemovePodSandbox(ctx context.Context, r *criruntime.RemovePodSandboxRequest) (*criruntime.RemovePodSandboxResponse, error) { - return &criruntime.RemovePodSandboxResponse{}, nil + return &pb.Status{Message: message}, err } -// PodSandboxStatus Stub TODO: finish -func (c *runtimeServer) PodSandboxStatus(ctx context.Context, r *criruntime.PodSandboxStatusRequest) (*criruntime.PodSandboxStatusResponse, error) { - return &criruntime.PodSandboxStatusResponse{ - Status: nil, - }, nil +// Note: this function is to be used only before tearing down the whole orchestrator +func (s *server) StopVMs(ctx context.Context, in *pb.StopVMsReq) (*pb.Status, error) { + log.Info("Received StopVMs") + err := orch.StopActiveVMs() + if err != nil { + log.Printf("Failed to stop VMs, err: %v\n", err) + return &pb.Status{Message: "Failed to stop VMs"}, err + } + os.Exit(0) + return &pb.Status{Message: "Stopped VMs"}, nil } -// ListPodSandbox Stub TODO: finish -func (c *runtimeServer) ListPodSandbox(ctx context.Context, r *criruntime.ListPodSandboxRequest) (*criruntime.ListPodSandboxResponse, error) { - return nil, nil -} +func (s *fwdServer) FwdHello(ctx context.Context, in *hpb.FwdHelloReq) (*hpb.FwdHelloResp, error) { + fID := in.GetId() + imageName := in.GetImage() + payload := in.GetPayload() -// CreateContainer creates a new container in the given PodSandbox. TODO -func (c *runtimeServer) CreateContainer(ctx context.Context, r *criruntime.CreateContainerRequest) (*criruntime.CreateContainerResponse, error) { - //config := r.GetConfig() - return nil, nil -} + logger := log.WithFields(log.Fields{"fID": fID, "image": imageName, "payload": payload}) + logger.Debug("Received FwdHelloVM") -// StartContainer starts the container. TODO -func (c *runtimeServer) StartContainer(ctx context.Context, r *criruntime.StartContainerRequest) (*criruntime.StartContainerResponse, error) { - return nil, nil + resp, _, err := funcPool.Serve(ctx, fID, imageName, payload) + return resp, err } diff --git a/go.mod b/go.mod index 7b385efa6..40c15c282 100644 --- a/go.mod +++ b/go.mod @@ -20,28 +20,17 @@ replace k8s.io/klog => k8s.io/klog v1.0.0 replace k8s.io/kubernetes => k8s.io/kubernetes v1.16.6 -replace github.com/containerd/containerd => github.com/containerd/containerd v1.3.6 - require ( github.com/containerd/containerd v1.3.6 - github.com/containerd/cri v1.11.1-0.20200320165605-f864905c93b9 - github.com/docker/distribution v2.7.1+incompatible - github.com/firecracker-microvm/firecracker-containerd v0.0.0-00010101000000-000000000000 - github.com/firecracker-microvm/firecracker-go-sdk v0.0.0-00010101000000-000000000000 - github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.0.1 - github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52 // indirect - github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.6.0 + github.com/sirupsen/logrus v1.7.0 github.com/stretchr/testify v1.6.1 - github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201007110818-0e04fcb257fe + github.com/ustiugov/fccd-orchestrator/cri v0.0.0-20201009133152-4cbafaef80d5 + github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201009133152-4cbafaef80d5 github.com/ustiugov/fccd-orchestrator/helloworld v0.0.0-20200803195925-0629e1cf4599 github.com/ustiugov/fccd-orchestrator/metrics v0.0.0-20200907081336-fae0d2f696c4 - github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200803195925-0629e1cf4599 // indirect - golang.org/x/net v0.0.0-20200707034311-ab3426394381 - golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - google.golang.org/grpc v1.31.0 - k8s.io/cri-api v0.0.0-00010101000000-000000000000 + github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200803195925-0629e1cf4599 + golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520 + google.golang.org/grpc v1.33.0 ) // Workaround for github.com/containerd/containerd issue #3031 diff --git a/go.sum b/go.sum index f7cc52132..3f1c8d958 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,7 @@ github.com/containerd/containerd v1.3.7 h1:eFSOChY8TTcxvkzp8g+Ov1RL0MYww7XEeK0y+ github.com/containerd/containerd v1.3.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20181027224239-bea7585dbfac/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb h1:nXPkFq8X1a9ycY3GYQpFNxHh3j2JgY7zDZfq2EXMIzk= github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= github.com/containerd/continuity v0.0.0-20200709052629-daa8e1ccc0bc h1:lDK/G7OlwUnJW3O6nv/8M89bMupV6FuLK6FXmC3ueWc= @@ -87,6 +88,7 @@ github.com/containerd/cri v1.11.1-0.20200320165605-f864905c93b9 h1:yZzB3PVwyfp9s github.com/containerd/cri v1.11.1-0.20200320165605-f864905c93b9/go.mod h1:DavH5Qa8+6jOmeOMO3dhWoqksucZDe06LfuhBz/xPZs= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00 h1:lsjC5ENBl+Zgf38+B0ymougXFp0BaubeIVETltYZTQw= github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b h1:qUtCegLdOUVfVJOw+KDg6eJyE1TGvLlkGEd1091kSSQ= @@ -127,6 +129,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible h1:dvc1KSkIYTVjZgHf/CTC2diTYC8PzhaA5sFISRfNVrE= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20171019062838-86f080cff091/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -275,6 +278,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -393,6 +397,7 @@ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWEr github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= @@ -405,6 +410,7 @@ github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rm github.com/opencontainers/runtime-spec v0.1.2-0.20181106065543-31e0d16c1cb7/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= @@ -482,6 +488,8 @@ github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -518,6 +526,10 @@ github.com/ustiugov/fccd-orchestrator v0.0.0-20200416160505-409015e84eac/go.mod github.com/ustiugov/fccd-orchestrator v0.0.0-20200416161510-f6f32fa5d52b/go.mod h1:stbdPtf4fPytuyUsKEUdDsv1CoCSpG6u2XxypGTonXs= github.com/ustiugov/fccd-orchestrator v0.0.0-20200416171230-6533745bd3b1/go.mod h1:1QV7J7KkhH6d5fcF5ueg7IymQSpM/mspoVpYIr+tdCw= github.com/ustiugov/fccd-orchestrator v0.0.0-20200421101715-3d8808b0d980/go.mod h1:KxjWdnprMYPUKq6lO/VXN+9lyaP4NeJMLtmdyKd8Jb0= +github.com/ustiugov/fccd-orchestrator/cri v0.0.0-20201009122956-69edda9e3f99 h1:4LsqGw3USGrs2WFrhyqK5laOfS4trnqRMiF8WYPU+js= +github.com/ustiugov/fccd-orchestrator/cri v0.0.0-20201009122956-69edda9e3f99/go.mod h1:pySWx+zM5yInOm/hzWwyrfFZFB1kCMfh8YQ7acqmsng= +github.com/ustiugov/fccd-orchestrator/cri v0.0.0-20201009133152-4cbafaef80d5 h1:LMTpzQ9+ForzbPMjpktl07dWpzkpS5G8Bzf+DP/p4u8= +github.com/ustiugov/fccd-orchestrator/cri v0.0.0-20201009133152-4cbafaef80d5/go.mod h1:Lrt1LFaJsATj7sRK8SHFdVe1XYitSH1YuVWl9WCjCW0= github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200416161917-c9cd3cf6dbcf h1:/eSdcjyJ9rQmw3VQcfAKMKnRPI6DoXAztiNyOl1GN84= github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200416161917-c9cd3cf6dbcf/go.mod h1:2x1L5ydHhOsleqG/GQ9MLWgjF1YQF91u5pe0TvKEjhI= github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200417191122-72eef2f2433e h1:YkxEGHYR18sI1GahT6EfcSwyf422JBsrIi6HuE6gkjM= @@ -696,6 +708,10 @@ github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200914140331-3dc4e3cd94c github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200914140331-3dc4e3cd94c4/go.mod h1:5FVJxceicLi5ex98MAVWyNa6fK2R0etUWUIx1FPIJ4o= github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201007110818-0e04fcb257fe h1:js3jEX4eSgpsHqgb1gqdb6SvOJDu969bY3A1UKUu8s0= github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201007110818-0e04fcb257fe/go.mod h1:5FVJxceicLi5ex98MAVWyNa6fK2R0etUWUIx1FPIJ4o= +github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201009122956-69edda9e3f99 h1:24kxxUt0lpHVLf64g9qsVJJ2uVtRaTvdKrVhJZ0qObk= +github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201009122956-69edda9e3f99/go.mod h1:5FVJxceicLi5ex98MAVWyNa6fK2R0etUWUIx1FPIJ4o= +github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201009133152-4cbafaef80d5 h1:K6qEI19y4oM7YB0ffZEc5a6OsByh2zOn/cmJxdIxOlA= +github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20201009133152-4cbafaef80d5/go.mod h1:5FVJxceicLi5ex98MAVWyNa6fK2R0etUWUIx1FPIJ4o= github.com/ustiugov/fccd-orchestrator/helloworld v0.0.0-20200710144657-9fbec6857e48/go.mod h1:5dhCs/XynpQoQcrhd/YgUBjGahhNpTknQUcC1kHRCaA= github.com/ustiugov/fccd-orchestrator/helloworld v0.0.0-20200710145415-bb09d1a68889/go.mod h1:5dhCs/XynpQoQcrhd/YgUBjGahhNpTknQUcC1kHRCaA= github.com/ustiugov/fccd-orchestrator/helloworld v0.0.0-20200710150633-096cac68bd72 h1:r67pqykSYWZHFYfIKuT44PTXFJWu5lJcatkV16d3vKU= @@ -968,6 +984,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M= +golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 h1:1GKfLldebiSdhTlt3nalwrb7L40Tixr/0IH+kSbRgmk= +golang.org/x/net v0.0.0-20201009032441-dbdefad45b89/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -980,6 +998,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03i golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520 h1:Bx6FllMpG4NWDOfhMBz1VR2QYNp/SAOHPIAsaVmxfPo= +golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1004,6 +1024,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1019,6 +1040,9 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd h1:wefLe/3g5tC0FcXw3NneLA5tHgbyouyZlfcSjNfOdgk= golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -1100,6 +1124,8 @@ google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.0 h1:IBKSUNL2uBS2DkJBncPP+TwT0sp9tgA8A75NjHt6umg= +google.golang.org/grpc v1.33.0/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=