Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cli/cmd/build_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type BuildImageOpts struct {
Dockerfile string
Package string
Registry string
Force bool
}

func (c *BuildImageCmd) RunE(cmd *cobra.Command, args []string) error {
Expand Down Expand Up @@ -55,6 +56,7 @@ func AddBuildImageCmd(parentCmd *cobra.Command, opts *GlobalOptions) {
imageCmd.cmd.Flags().StringVarP(&imageCmd.Opts.Dockerfile, "dockerfile", "d", "", "Path to the Dockerfile to build (required)")
imageCmd.cmd.Flags().StringVarP(&imageCmd.Opts.Package, "package", "p", "", "Path to the Codesphere package (required)")
imageCmd.cmd.Flags().StringVarP(&imageCmd.Opts.Registry, "registry", "r", "", "Registry URL to push to (e.g., my-registry.com/my-image) (required)")
imageCmd.cmd.Flags().BoolVarP(&imageCmd.Opts.Force, "force", "f", false, "Force new unpacking of the package even if already extracted")

util.MarkFlagRequired(imageCmd.cmd, "dockerfile")
util.MarkFlagRequired(imageCmd.cmd, "package")
Expand All @@ -67,6 +69,11 @@ func AddBuildImageCmd(parentCmd *cobra.Command, opts *GlobalOptions) {

// AddBuildImageCmd adds the build image command to the parent command
func (c *BuildImageCmd) BuildImage(pm installer.PackageManager, im system.ImageManager) error {
err := pm.Extract(c.Opts.Force)
if err != nil {
return fmt.Errorf("failed to extract package: %w", err)
}

codesphereVersion, err := pm.GetCodesphereVersion()
if err != nil {
return fmt.Errorf("failed to get codesphere version from package: %w", err)
Expand Down
6 changes: 5 additions & 1 deletion cli/cmd/build_image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ var _ = Describe("BuildImageCmd", func() {

err := c.RunE(nil, []string{})
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("failed to get codesphere version from package"))
Expect(err.Error()).To(ContainSubstring("failed to extract package"))
})

It("succeeds with valid options", func() {
Expand All @@ -67,6 +67,7 @@ var _ = Describe("BuildImageCmd", func() {
mockPackageManager := installer.NewMockPackageManager(GinkgoT())
mockImageManager := system.NewMockImageManager(GinkgoT())

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("", errors.New("failed to extract version"))

err := c.BuildImage(mockPackageManager, mockImageManager)
Expand All @@ -81,6 +82,7 @@ var _ = Describe("BuildImageCmd", func() {
c.Opts.Dockerfile = "Dockerfile"
c.Opts.Registry = "my-registry.com/my-image"

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("codesphere-v1.66.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "my-registry.com/my-image:codesphere-v1.66.0", ".").Return(errors.New("build failed"))

Expand All @@ -96,6 +98,7 @@ var _ = Describe("BuildImageCmd", func() {
c.Opts.Dockerfile = "Dockerfile"
c.Opts.Registry = "my-registry.com/my-image"

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("codesphere-v1.66.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "my-registry.com/my-image:codesphere-v1.66.0", ".").Return(nil)
mockImageManager.EXPECT().PushImage("my-registry.com/my-image:codesphere-v1.66.0").Return(errors.New("push failed"))
Expand All @@ -112,6 +115,7 @@ var _ = Describe("BuildImageCmd", func() {
c.Opts.Dockerfile = "Dockerfile"
c.Opts.Registry = "my-registry.com/my-image"

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("codesphere-v1.66.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "my-registry.com/my-image:codesphere-v1.66.0", ".").Return(nil)
mockImageManager.EXPECT().PushImage("my-registry.com/my-image:codesphere-v1.66.0").Return(nil)
Expand Down
7 changes: 7 additions & 0 deletions cli/cmd/build_images.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type BuildImagesCmd struct {
type BuildImagesOpts struct {
*GlobalOptions
Config string
Force bool
}

func (c *BuildImagesCmd) RunE(_ *cobra.Command, args []string) error {
Expand Down Expand Up @@ -53,6 +54,7 @@ func AddBuildImagesCmd(build *cobra.Command, opts *GlobalOptions) {
Env: env.NewEnv(),
}
buildImages.cmd.Flags().StringVarP(&buildImages.Opts.Config, "config", "c", "", "Path to the configuration YAML file")
buildImages.cmd.Flags().BoolVarP(&buildImages.Opts.Force, "force", "f", false, "Force new unpacking of the package even if already extracted")

util.MarkFlagRequired(buildImages.cmd, "config")

Expand All @@ -74,6 +76,11 @@ func (c *BuildImagesCmd) BuildAndPushImages(pm installer.PackageManager, cm inst
return fmt.Errorf("registry server (property registry.server) not defined in the config, please specify a valid registry to which the image shall be pushed")
}

err = pm.Extract(c.Opts.Force)
if err != nil {
return fmt.Errorf("failed to extract package: %w", err)
}

codesphereVersion, err := pm.GetCodesphereVersion()
if err != nil {
return fmt.Errorf("failed to get codesphere version from package: %w", err)
Expand Down
5 changes: 5 additions & 0 deletions cli/cmd/build_images_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ var _ = Describe("BuildImagesCmd", func() {
},
}
mockConfigManager.EXPECT().ParseConfigYaml("config-without-dockerfile.yaml").Return(configWithoutDockerfile, nil)
mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)

err := c.BuildAndPushImages(mockPackageManager, mockConfigManager, mockImageManager)
Expand Down Expand Up @@ -233,6 +234,7 @@ var _ = Describe("BuildImagesCmd", func() {
},
}
mockConfigManager.EXPECT().ParseConfigYaml("config-with-dockerfile.yaml").Return(configWithDockerfile, nil)
mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "registry.example.com/my-ubuntu-24.04-default:1.0.0", ".").Return(errors.New("build failed"))

Expand Down Expand Up @@ -271,6 +273,7 @@ var _ = Describe("BuildImagesCmd", func() {
},
}
mockConfigManager.EXPECT().ParseConfigYaml("config-with-dockerfile.yaml").Return(configWithDockerfile, nil)
mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "registry.example.com/my-ubuntu-24.04-default:1.0.0", ".").Return(nil)
mockImageManager.EXPECT().PushImage("registry.example.com/my-ubuntu-24.04-default:1.0.0").Return(errors.New("push failed"))
Expand Down Expand Up @@ -310,6 +313,7 @@ var _ = Describe("BuildImagesCmd", func() {
},
}
mockConfigManager.EXPECT().ParseConfigYaml("config-with-dockerfile.yaml").Return(configWithDockerfile, nil)
mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
mockImageManager.EXPECT().BuildImage("Dockerfile", "registry.example.com/my-ubuntu-24.04-default:1.0.0", ".").Return(nil)
mockImageManager.EXPECT().PushImage("registry.example.com/my-ubuntu-24.04-default:1.0.0").Return(nil)
Expand Down Expand Up @@ -366,6 +370,7 @@ var _ = Describe("BuildImagesCmd", func() {
},
}
mockConfigManager.EXPECT().ParseConfigYaml("config-with-multiple-images.yaml").Return(configWithMultipleImages, nil)
mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)

// Expect calls for my-ubuntu-24.04 default flavor
Expand Down
5 changes: 5 additions & 0 deletions cli/cmd/extend_baseimage.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ func AddExtendBaseimageCmd(extend *cobra.Command, opts *GlobalOptions) {
}

func (c *ExtendBaseimageCmd) ExtendBaseimage(pm installer.PackageManager, im system.ImageManager) error {
err := pm.Extract(c.Opts.Force)
if err != nil {
return fmt.Errorf("failed to extract package: %w", err)
}

imageName, err := pm.GetBaseimageName(c.Opts.Baseimage)
if err != nil {
return fmt.Errorf("failed to get image name: %w", err)
Expand Down
6 changes: 6 additions & 0 deletions cli/cmd/extend_baseimage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
mockPackageManager := installer.NewMockPackageManager(GinkgoT())
mockImageManager := system.NewMockImageManager(GinkgoT())

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("", errors.New("failed to get image name: extraction failed"))

err := c.ExtendBaseimage(mockPackageManager, mockImageManager)
Expand All @@ -77,6 +78,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
mockPackageManager := installer.NewMockPackageManager(GinkgoT())
mockImageManager := system.NewMockImageManager(GinkgoT())

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("", errors.New("failed to extract OCI image index: index extraction failed"))

err := c.ExtendBaseimage(mockPackageManager, mockImageManager)
Expand All @@ -88,6 +90,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
mockPackageManager := installer.NewMockPackageManager(GinkgoT())
mockImageManager := system.NewMockImageManager(GinkgoT())

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("", errors.New("failed to read image tags: no image names found"))

err := c.ExtendBaseimage(mockPackageManager, mockImageManager)
Expand All @@ -106,6 +109,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
defer func() { _ = os.Remove(tempFile.Name()) }()
defer func() { _ = tempFile.Close() }()

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04-base", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)
Expand All @@ -122,6 +126,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
mockImageManager := system.NewMockImageManager(GinkgoT())

c.Opts.Force = true
mockPackageManager.EXPECT().Extract(true).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("", errors.New("failed to extract package to workdir: extraction failed"))

err := c.ExtendBaseimage(mockPackageManager, mockImageManager)
Expand All @@ -140,6 +145,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
defer func() { _ = os.Remove(tempFile.Name()) }()
defer func() { _ = tempFile.Close() }()

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04-base", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)
Expand Down
5 changes: 5 additions & 0 deletions cli/cmd/update_dockerfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ in the specified Dockerfile to use that base image. The base image is loaded int
}

func (c *UpdateDockerfileCmd) UpdateDockerfile(pm installer.PackageManager, im system.ImageManager, args []string) error {
err := pm.Extract(c.Opts.Force)
if err != nil {
return fmt.Errorf("failed to extract package: %w", err)
}

imageName, err := pm.GetBaseimageName(c.Opts.Baseimage)
if err != nil {
return fmt.Errorf("failed to get image name: %w", err)
Expand Down
7 changes: 7 additions & 0 deletions cli/cmd/update_dockerfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = "workspace-agent-24.04.tar"
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("workspace-agent-24.04.tar").Return("", errors.New("failed to extract image"))

err := c.UpdateDockerfile(mockPackageManager, mockImageManager, []string{})
Expand All @@ -103,6 +104,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = ""
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockImageManager.EXPECT().LoadImage("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar").Return(nil)
Expand All @@ -122,6 +124,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = ""
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockImageManager.EXPECT().LoadImage("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar").Return(errors.New("load failed"))
Expand Down Expand Up @@ -152,6 +155,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = ""
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockImageManager.EXPECT().LoadImage("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar").Return(nil)
Expand Down Expand Up @@ -185,6 +189,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = ""
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)
Expand Down Expand Up @@ -217,6 +222,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = "workspace-agent-20.04.tar"
c.Opts.Force = true

mockPackageManager.EXPECT().Extract(true).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("workspace-agent-20.04.tar").Return("ubuntu:20.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("workspace-agent-20.04.tar", true).Return("/test/workdir/deps/codesphere/images/workspace-agent-20.04.tar", nil)
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)
Expand Down Expand Up @@ -249,6 +255,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
c.Opts.Baseimage = "workspace-agent-24.04.tar"
c.Opts.Force = false

mockPackageManager.EXPECT().Extract(false).Return(nil)
mockPackageManager.EXPECT().GetBaseimageName("workspace-agent-24.04.tar").Return("registry.example.com/workspace-agent:24.04", nil)
mockPackageManager.EXPECT().GetBaseimagePath("workspace-agent-24.04.tar", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)
Expand Down
1 change: 1 addition & 0 deletions docs/oms-cli_build_image.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ $ oms-cli build image --dockerfile baseimage/Dockerfile --package codesphere-v1.

```
-d, --dockerfile string Path to the Dockerfile to build (required)
-f, --force Force new unpacking of the package even if already extracted
-h, --help help for image
-p, --package string Path to the Codesphere package (required)
-r, --registry string Registry URL to push to (e.g., my-registry.com/my-image) (required)
Expand Down
1 change: 1 addition & 0 deletions docs/oms-cli_build_images.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ oms-cli build images [flags]

```
-c, --config string Path to the configuration YAML file
-f, --force Force new unpacking of the package even if already extracted
-h, --help help for images
```

Expand Down
12 changes: 0 additions & 12 deletions internal/installer/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,18 +169,6 @@ registry:
Expect(err).ToNot(HaveOccurred())
})
})

Context("ExtractOciImageIndex with various scenarios", func() {
It("handles empty image file path", func() {
// Test moved to package_test.go
Skip("ExtractOciImageIndex tests moved to package_test.go")
})

It("handles directory instead of file", func() {
// Test moved to package_test.go
Skip("ExtractOciImageIndex tests moved to package_test.go")
})
})
})

Describe("Integration scenarios", func() {
Expand Down
Loading