Skip to content

Commit

Permalink
feat: support envd-server image (#1150)
Browse files Browse the repository at this point in the history
* feat: support envd-server image

Signed-off-by: Keming <kemingy94@gmail.com>

* support dep

Signed-off-by: Keming <kemingy94@gmail.com>

* use image name instead of digest

Signed-off-by: Keming <kemingy94@gmail.com>

* update envd server version

Signed-off-by: Keming <kemingyang@tensorchord.ai>

Signed-off-by: Keming <kemingy94@gmail.com>
Signed-off-by: Keming <kemingyang@tensorchord.ai>
  • Loading branch information
kemingy authored Nov 7, 2022
1 parent f9e7c67 commit c364958
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 34 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/spf13/viper v1.14.0
github.com/stretchr/testify v1.8.1
github.com/tensorchord/envd-server v0.0.6
github.com/tensorchord/envd-server v0.0.7
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f
github.com/urfave/cli/v2 v2.23.4
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -619,8 +619,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/tensorchord/envd-server v0.0.6 h1:U/FLcIDRSIEavtfuJYJzW/pZQ1yC8umN/UaNUG0aWPs=
github.com/tensorchord/envd-server v0.0.6/go.mod h1:TveWA1l+UWI87y4kbNS4f6OaYJaAFb9XOhTB1hcBPDw=
github.com/tensorchord/envd-server v0.0.7 h1:9fSY+lbKYXJwEz9ju+OAvdoVKjqX6JPy5DGR37iPSXQ=
github.com/tensorchord/envd-server v0.0.7/go.mod h1:dVHjUZoyZ8VbYEz0wGzk+tdAEQ7u5Ri4y6prh/+xtn0=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274 h1:wbyZxD6IPFp0sl5uscMOJRsz5UKGFiNiD16e+MVfKZY=
github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA=
Expand Down
8 changes: 4 additions & 4 deletions pkg/app/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,14 @@ func renderImages(imgs []types.EnvdImage, w io.Writer) {

for _, img := range imgs {
envRow := make([]string, 8)
envRow[0] = types.GetImageName(img)
envRow[0] = img.Name
envRow[1] = stringOrNone(img.BuildContext)
envRow[2] = strconv.FormatBool(img.GPU)
envRow[3] = stringOrNone(img.CUDA)
envRow[4] = stringOrNone(img.CUDNN)
envRow[5] = stringid.TruncateID(img.ImageSummary.ID)
envRow[6] = createdSinceString(img.ImageSummary.Created)
envRow[7] = units.HumanSizeWithPrecision(float64(img.ImageSummary.Size), 3)
envRow[5] = stringid.TruncateID(img.Digest)
envRow[6] = createdSinceString(img.Created)
envRow[7] = units.HumanSizeWithPrecision(float64(img.Size), 3)
table.Append(envRow)
}
table.Render()
Expand Down
22 changes: 12 additions & 10 deletions pkg/envd/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func (e dockerEngine) ListImage(ctx context.Context) ([]types.EnvdImage, error)

envdImgs := make([]types.EnvdImage, 0)
for _, img := range images {
envdImg, err := types.NewImage(img)
envdImg, err := types.NewImageFromSummary(img)
if err != nil {
return nil, errors.Wrap(err, "failed to create envd image from the docker image")
}
Expand Down Expand Up @@ -161,7 +161,7 @@ func (e dockerEngine) ListImageDependency(ctx context.Context, image string) (*t
}

img := images[0]
dep, err := types.NewDependencyFromImage(img)
dep, err := types.NewDependencyFromImageSummary(img)
if err != nil {
return nil, errors.Wrap(err, "failed to create dependency from image")
}
Expand Down Expand Up @@ -526,10 +526,8 @@ func (e dockerEngine) getContainerTag(ctx context.Context, name string) ([]strin
return tags, err
}
for _, img := range images {
for _, tag := range img.ImageSummary.RepoTags {
if strings.HasPrefix(tag, fmt.Sprintf("%s:", name)) {
tags = append(tags, tag)
}
if strings.HasPrefix(img.Name, fmt.Sprintf("%s:", name)) {
tags = append(tags, img.Name)
}
}
if len(tags) == 0 {
Expand Down Expand Up @@ -591,18 +589,22 @@ func (e dockerEngine) GPUEnabled(ctx context.Context) (bool, error) {
}
}

func (e dockerEngine) GetImage(ctx context.Context, image string) (dockertypes.ImageSummary, error) {
func (e dockerEngine) GetImage(ctx context.Context, image string) (types.EnvdImage, error) {
images, err := e.ImageList(ctx, dockertypes.ImageListOptions{
Filters: dockerFiltersWithName(image),
})
if err != nil {
return dockertypes.ImageSummary{}, err
return types.EnvdImage{}, err
}
if len(images) == 0 {
return dockertypes.ImageSummary{},
return types.EnvdImage{},
errors.Errorf("image %s not found", image)
}
return images[0], nil
img, err := types.NewImageFromSummary(images[0])
if err != nil {
return types.EnvdImage{}, err
}
return *img, nil
}

func (e dockerEngine) PruneImage(ctx context.Context) (dockertypes.ImagesPruneReport, error) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/envd/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ type SSHClient interface {
type ImageClient interface {
ListImage(ctx context.Context) ([]types.EnvdImage, error)
ListImageDependency(ctx context.Context, image string) (*types.Dependency, error)
GetImage(ctx context.Context, image string) (dockertypes.ImageSummary, error)
GetImage(ctx context.Context, image string) (types.EnvdImage, error)
PruneImage(ctx context.Context) (dockertypes.ImagesPruneReport, error)
}

Expand Down
38 changes: 33 additions & 5 deletions pkg/envd/envdserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,19 @@ type envdServerEngine struct {
}

func (e *envdServerEngine) ListImage(ctx context.Context) ([]types.EnvdImage, error) {
return nil, errors.New("not implemented")
resp, err := e.ImageList(ctx, e.IdentityToken)
if err != nil {
return nil, errors.Wrap(err, "failed to list image")
}
images := []types.EnvdImage{}
for _, meta := range resp.Items {
image, err := types.NewImageFromMeta(meta)
if err != nil {
return nil, errors.Wrap(err, "failed to create envd image")
}
images = append(images, *image)
}
return images, nil
}

func (e envdServerEngine) Destroy(ctx context.Context, name string) (string, error) {
Expand All @@ -48,15 +60,31 @@ func (e envdServerEngine) Destroy(ctx context.Context, name string) (string, err
}

func (e *envdServerEngine) ListImageDependency(ctx context.Context, image string) (*types.Dependency, error) {
return nil, errors.New("not implemented")
img, err := e.GetImage(ctx, image)
if err != nil {
return nil, err
}
dep, err := types.NewDependencyFromLabels(img.Labels)
if err != nil {
return nil, err
}
return dep, nil
}

func (e *envdServerEngine) GetImage(ctx context.Context, image string) (dockertypes.ImageSummary, error) {
return dockertypes.ImageSummary{}, errors.New("not implemented")
func (e *envdServerEngine) GetImage(ctx context.Context, image string) (types.EnvdImage, error) {
resp, err := e.ImageGet(ctx, e.IdentityToken, image)
if err != nil {
return types.EnvdImage{}, errors.Wrapf(err, "failed to get the image: %s", image)
}
img, err := types.NewImageFromMeta(resp.ImageMeta)
if err != nil {
return types.EnvdImage{}, errors.Wrapf(err, "failed to convert the image from image meta", image)
}
return *img, nil
}

func (e envdServerEngine) PruneImage(ctx context.Context) (dockertypes.ImagesPruneReport, error) {
return dockertypes.ImagesPruneReport{}, errors.New("not implemented")
return dockertypes.ImagesPruneReport{}, errors.New("not implemented for envd-server")
}

func (e *envdServerEngine) GetInfo(ctx context.Context) (*types.EnvdInfo, error) {
Expand Down
35 changes: 24 additions & 11 deletions pkg/types/envd.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ var BaseAptPackage = []string{
}

type EnvdImage struct {
types.ImageSummary
servertypes.ImageMeta

EnvdManifest `json:",inline,omitempty"`
}
Expand Down Expand Up @@ -172,9 +172,17 @@ func DefaultPathEnv() string {
return DefaultPathEnvUnix
}

func NewImage(image types.ImageSummary) (*EnvdImage, error) {
func NewImageFromSummary(image types.ImageSummary) (*EnvdImage, error) {
img := EnvdImage{
ImageSummary: image,
ImageMeta: servertypes.ImageMeta{
Digest: image.ID,
Created: image.Created,
Size: image.Size,
Labels: image.Labels,
},
}
if len(image.RepoTags) > 0 {
img.Name = image.RepoTags[0]
}
m, err := newManifest(image.Labels)
if err != nil {
Expand All @@ -184,6 +192,18 @@ func NewImage(image types.ImageSummary) (*EnvdImage, error) {
return &img, nil
}

func NewImageFromMeta(meta servertypes.ImageMeta) (*EnvdImage, error) {
img := EnvdImage{
ImageMeta: meta,
}
manifest, err := newManifest(img.Labels)
if err != nil {
return nil, err
}
img.EnvdManifest = manifest
return &img, nil
}

func NewEnvironmentFromContainer(ctr types.Container) (*EnvdEnvironment, error) {
env := EnvdEnvironment{
Image: ctr.Image,
Expand Down Expand Up @@ -254,7 +274,7 @@ func NewDependencyFromContainerJSON(ctr types.ContainerJSON) (*Dependency, error
return NewDependencyFromLabels(ctr.Config.Labels)
}

func NewDependencyFromImage(img types.ImageSummary) (*Dependency, error) {
func NewDependencyFromImageSummary(img types.ImageSummary) (*Dependency, error) {
return NewDependencyFromLabels(img.Labels)
}

Expand All @@ -276,13 +296,6 @@ func NewPortBindingFromContainerJSON(ctr types.ContainerJSON) []PortBinding {
return ports
}

func GetImageName(image EnvdImage) string {
if len(image.ImageSummary.RepoTags) != 0 {
return image.ImageSummary.RepoTags[0]
}
return "<none>"
}

func NewDependencyFromLabels(label map[string]string) (*Dependency, error) {
dep := Dependency{}
if pkgs, ok := label[ImageLabelAPT]; ok {
Expand Down

0 comments on commit c364958

Please sign in to comment.