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
Binary file modified cli/cmd/testdata/testcli.tar.gz
Binary file not shown.
4 changes: 2 additions & 2 deletions cli/cmd/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ func AddUpdateCmd(rootCmd *cobra.Command) {
func (c *UpdateCmd) SelfUpdate(p portal.Portal) error {
currentVersion := semver.MustParse(c.Version.Version())

latest, err := p.GetLatestBuild(portal.OmsProduct)
latest, err := p.GetLatestBuild(portal.OmsProduct, "")
if err != nil {
return fmt.Errorf("failed to OMS Portal for latest version: %w", err)
return fmt.Errorf("failed to query OMS Portal for latest version: %w", err)
}
latestVersion := semver.MustParse(strings.TrimPrefix(latest.Version, "oms-v"))

Expand Down
4 changes: 2 additions & 2 deletions cli/cmd/update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ var _ = Describe("Update", func() {
mockVersion.EXPECT().Arch().Return("fakearch")
mockVersion.EXPECT().Version().Return("0.0.0")
mockVersion.EXPECT().Os().Return("fakeos")
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct).Return(latestBuild, nil)
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct, "").Return(latestBuild, nil)
mockPortal.EXPECT().DownloadBuildArtifact(portal.OmsProduct, buildToDownload, mock.Anything).RunAndReturn(
func(product portal.Product, build portal.Build, file io.Writer) error {
embeddedFile, err := testdata.Open("testdata/testcli.tar.gz")
Expand All @@ -90,7 +90,7 @@ var _ = Describe("Update", func() {

It("Detects when current verison is latest version", func() {
mockVersion.EXPECT().Version().Return(latestBuild.Version)
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct).Return(latestBuild, nil)
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct, "").Return(latestBuild, nil)
err := c.SelfUpdate(mockPortal)
Expect(err).NotTo(HaveOccurred())
})
Expand Down
36 changes: 23 additions & 13 deletions internal/portal/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (

type Portal interface {
DownloadBuildArtifact(product Product, build Build, file io.Writer) error
GetLatestBuild(product Product) (Build, error)
GetLatestBuild(product Product, version string) (Build, error)
}

type PortalClient struct {
Expand Down Expand Up @@ -122,18 +122,12 @@ func (c *PortalClient) ListBuilds(product Product) (availablePackages Builds, er
}

func (c *PortalClient) GetCodesphereBuildByVersion(version string) (Build, error) {
packages, err := c.ListBuilds(CodesphereProduct)
latestBuild, err := c.GetLatestBuild(CodesphereProduct, version)
if err != nil {
return Build{}, fmt.Errorf("failed to list Codesphere packages: %w", err)
return Build{}, fmt.Errorf("failed to get latest build for version %s: %w", version, err)
}

for _, build := range packages.Builds {
if build.Version == version {
return build, nil
}
}

return Build{}, fmt.Errorf("version %s not found", version)
return latestBuild, nil
}

func compareBuilds(l, r Build) int {
Expand Down Expand Up @@ -170,7 +164,7 @@ func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file
return nil
}

func (c *PortalClient) GetLatestBuild(product Product) (Build, error) {
func (c *PortalClient) GetLatestBuild(product Product, version string) (Build, error) {
packages, err := c.ListBuilds(product)
if err != nil {
return Build{}, fmt.Errorf("failed to list %s packages: %w", product, err)
Expand All @@ -180,8 +174,24 @@ func (c *PortalClient) GetLatestBuild(product Product) (Build, error) {
return Build{}, errors.New("no builds returned")
}

// Builds are always ordered by date, newest build is latest version
return packages.Builds[len(packages.Builds)-1], nil
if version == "" {
return packages.Builds[len(packages.Builds)-1], nil
}

matchingPackages := []Build{}
for _, build := range packages.Builds {
if build.Version == version {
// Builds are always ordered by date, newest build is latest version
matchingPackages = append(matchingPackages, build)
}
}

if len(matchingPackages) == 0 {
return Build{}, fmt.Errorf("version %s not found", version)
}

// Builds are always ordered by date, return newest build
return matchingPackages[len(matchingPackages)-1], nil
}

// WriteCounter is a custom io.Writer that counts bytes written and logs progress.
Expand Down
6 changes: 3 additions & 3 deletions internal/portal/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ var _ = Describe("PortalClient", func() {
It("returns an error and an empty build", func() {
expectedResult := portal.Build{}
packages, err := client.GetCodesphereBuildByVersion("1.42.3")
Expect(err).To(MatchError("version 1.42.3 not found"))
Expect(err.Error()).To(MatchRegexp(".*version 1.42.3 not found"))
Expect(packages).To(Equal(expectedResult))
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/codesphere"))
})
Expand Down Expand Up @@ -278,7 +278,7 @@ var _ = Describe("PortalClient", func() {
Date: lastBuild,
Version: "1.42.1",
}
packages, err := client.GetLatestBuild(portal.OmsProduct)
packages, err := client.GetLatestBuild(portal.OmsProduct, "")
Expect(err).NotTo(HaveOccurred())
Expect(packages).To(Equal(expectedResult))
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/oms"))
Expand All @@ -296,7 +296,7 @@ var _ = Describe("PortalClient", func() {
})
It("returns an error and an empty build", func() {
expectedResult := portal.Build{}
packages, err := client.GetLatestBuild(portal.OmsProduct)
packages, err := client.GetLatestBuild(portal.OmsProduct, "")
Expect(err).To(MatchError("no builds returned"))
Expect(packages).To(Equal(expectedResult))
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/oms"))
Expand Down
27 changes: 14 additions & 13 deletions internal/portal/mocks.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified internal/util/testdata/testdata1.tar.gz
Binary file not shown.