Skip to content

Commit bc9375c

Browse files
authored
fix: readd extract package to commands that need the package (#67)
ClickUp task: https://app.clickup.com/t/869b1kyav --------- Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com> Co-authored-by: siherrmann <25087590+siherrmann@users.noreply.github.com>
1 parent 0bbe3a9 commit bc9375c

12 files changed

+560
-229
lines changed

cli/cmd/build_image.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type BuildImageOpts struct {
2828
Dockerfile string
2929
Package string
3030
Registry string
31+
Force bool
3132
}
3233

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

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

6870
// AddBuildImageCmd adds the build image command to the parent command
6971
func (c *BuildImageCmd) BuildImage(pm installer.PackageManager, im system.ImageManager) error {
72+
err := pm.Extract(c.Opts.Force)
73+
if err != nil {
74+
return fmt.Errorf("failed to extract package: %w", err)
75+
}
76+
7077
codesphereVersion, err := pm.GetCodesphereVersion()
7178
if err != nil {
7279
return fmt.Errorf("failed to get codesphere version from package: %w", err)

cli/cmd/build_image_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ var _ = Describe("BuildImageCmd", func() {
4949

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

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

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

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

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

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

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

118+
mockPackageManager.EXPECT().Extract(false).Return(nil)
115119
mockPackageManager.EXPECT().GetCodesphereVersion().Return("codesphere-v1.66.0", nil)
116120
mockImageManager.EXPECT().BuildImage("Dockerfile", "my-registry.com/my-image:codesphere-v1.66.0", ".").Return(nil)
117121
mockImageManager.EXPECT().PushImage("my-registry.com/my-image:codesphere-v1.66.0").Return(nil)

cli/cmd/build_images.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type BuildImagesCmd struct {
2626
type BuildImagesOpts struct {
2727
*GlobalOptions
2828
Config string
29+
Force bool
2930
}
3031

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

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

@@ -74,6 +76,11 @@ func (c *BuildImagesCmd) BuildAndPushImages(pm installer.PackageManager, cm inst
7476
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")
7577
}
7678

79+
err = pm.Extract(c.Opts.Force)
80+
if err != nil {
81+
return fmt.Errorf("failed to extract package: %w", err)
82+
}
83+
7784
codesphereVersion, err := pm.GetCodesphereVersion()
7885
if err != nil {
7986
return fmt.Errorf("failed to get codesphere version from package: %w", err)

cli/cmd/build_images_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ var _ = Describe("BuildImagesCmd", func() {
197197
},
198198
}
199199
mockConfigManager.EXPECT().ParseConfigYaml("config-without-dockerfile.yaml").Return(configWithoutDockerfile, nil)
200+
mockPackageManager.EXPECT().Extract(false).Return(nil)
200201
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
201202

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

@@ -271,6 +273,7 @@ var _ = Describe("BuildImagesCmd", func() {
271273
},
272274
}
273275
mockConfigManager.EXPECT().ParseConfigYaml("config-with-dockerfile.yaml").Return(configWithDockerfile, nil)
276+
mockPackageManager.EXPECT().Extract(false).Return(nil)
274277
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
275278
mockImageManager.EXPECT().BuildImage("Dockerfile", "registry.example.com/my-ubuntu-24.04-default:1.0.0", ".").Return(nil)
276279
mockImageManager.EXPECT().PushImage("registry.example.com/my-ubuntu-24.04-default:1.0.0").Return(errors.New("push failed"))
@@ -310,6 +313,7 @@ var _ = Describe("BuildImagesCmd", func() {
310313
},
311314
}
312315
mockConfigManager.EXPECT().ParseConfigYaml("config-with-dockerfile.yaml").Return(configWithDockerfile, nil)
316+
mockPackageManager.EXPECT().Extract(false).Return(nil)
313317
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
314318
mockImageManager.EXPECT().BuildImage("Dockerfile", "registry.example.com/my-ubuntu-24.04-default:1.0.0", ".").Return(nil)
315319
mockImageManager.EXPECT().PushImage("registry.example.com/my-ubuntu-24.04-default:1.0.0").Return(nil)
@@ -366,6 +370,7 @@ var _ = Describe("BuildImagesCmd", func() {
366370
},
367371
}
368372
mockConfigManager.EXPECT().ParseConfigYaml("config-with-multiple-images.yaml").Return(configWithMultipleImages, nil)
373+
mockPackageManager.EXPECT().Extract(false).Return(nil)
369374
mockPackageManager.EXPECT().GetCodesphereVersion().Return("1.0.0", nil)
370375

371376
// Expect calls for my-ubuntu-24.04 default flavor

cli/cmd/extend_baseimage.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ func AddExtendBaseimageCmd(extend *cobra.Command, opts *GlobalOptions) {
7575
}
7676

7777
func (c *ExtendBaseimageCmd) ExtendBaseimage(pm installer.PackageManager, im system.ImageManager) error {
78+
err := pm.Extract(c.Opts.Force)
79+
if err != nil {
80+
return fmt.Errorf("failed to extract package: %w", err)
81+
}
82+
7883
imageName, err := pm.GetBaseimageName(c.Opts.Baseimage)
7984
if err != nil {
8085
return fmt.Errorf("failed to get image name: %w", err)

cli/cmd/extend_baseimage_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ var _ = Describe("ExtendBaseimageCmd", func() {
6666
mockPackageManager := installer.NewMockPackageManager(GinkgoT())
6767
mockImageManager := system.NewMockImageManager(GinkgoT())
6868

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

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

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

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

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

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

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

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

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

148+
mockPackageManager.EXPECT().Extract(false).Return(nil)
143149
mockPackageManager.EXPECT().GetBaseimageName("").Return("ubuntu:24.04-base", nil)
144150
mockPackageManager.EXPECT().GetBaseimagePath("", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
145151
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)

cli/cmd/update_dockerfile.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ in the specified Dockerfile to use that base image. The base image is loaded int
8181
}
8282

8383
func (c *UpdateDockerfileCmd) UpdateDockerfile(pm installer.PackageManager, im system.ImageManager, args []string) error {
84+
err := pm.Extract(c.Opts.Force)
85+
if err != nil {
86+
return fmt.Errorf("failed to extract package: %w", err)
87+
}
88+
8489
imageName, err := pm.GetBaseimageName(c.Opts.Baseimage)
8590
if err != nil {
8691
return fmt.Errorf("failed to get image name: %w", err)

cli/cmd/update_dockerfile_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ var _ = Describe("UpdateDockerfileCmd", func() {
8787
c.Opts.Baseimage = "workspace-agent-24.04.tar"
8888
c.Opts.Force = false
8989

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

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

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

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

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

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

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

258+
mockPackageManager.EXPECT().Extract(false).Return(nil)
252259
mockPackageManager.EXPECT().GetBaseimageName("workspace-agent-24.04.tar").Return("registry.example.com/workspace-agent:24.04", nil)
253260
mockPackageManager.EXPECT().GetBaseimagePath("workspace-agent-24.04.tar", false).Return("/test/workdir/deps/codesphere/images/workspace-agent-24.04.tar", nil)
254261
mockPackageManager.EXPECT().FileIO().Return(mockFileIO)

docs/oms-cli_build_image.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ $ oms-cli build image --dockerfile baseimage/Dockerfile --package codesphere-v1.
2222

2323
```
2424
-d, --dockerfile string Path to the Dockerfile to build (required)
25+
-f, --force Force new unpacking of the package even if already extracted
2526
-h, --help help for image
2627
-p, --package string Path to the Codesphere package (required)
2728
-r, --registry string Registry URL to push to (e.g., my-registry.com/my-image) (required)

docs/oms-cli_build_images.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ oms-cli build images [flags]
1515

1616
```
1717
-c, --config string Path to the configuration YAML file
18+
-f, --force Force new unpacking of the package even if already extracted
1819
-h, --help help for images
1920
```
2021

0 commit comments

Comments
 (0)