Skip to content

Commit

Permalink
Use the new registry API for fetching public jujud-operator tags for …
Browse files Browse the repository at this point in the history
…upgrade-controller command;
  • Loading branch information
ycliuhw committed Sep 3, 2021
1 parent 385f47b commit 06a5476
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 191 deletions.
15 changes: 6 additions & 9 deletions cmd/juju/commands/upgradecontroller.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"github.com/juju/featureflag"
"github.com/juju/gnuflag"
"github.com/juju/names/v4"
"github.com/juju/version/v2"

"github.com/juju/juju/api/modelconfig"
"github.com/juju/juju/apiserver/params"
Expand Down Expand Up @@ -271,15 +270,13 @@ func (c *upgradeControllerCommand) upgradeCAASController(ctx *cmd.Context) error
}

func (c *baseUpgradeCommand) listOperatorImages(controllerCfg controller.Config) (tools.Versions, error) {
imagePath, err := podcfg.GetJujuOCIImagePath(controllerCfg, version.Zero, 0)
if err != nil {
return nil, errors.Trace(err)
}

imageRepoDetails := controllerCfg.CAASImageRepo()
if !imageRepoDetails.IsPrivate() {
// TODO(ycliuhw): merge ListOperatorImages to Registry API.
return docker.ListOperatorImages(imagePath)
if imageRepoDetails.Empty() {
repoDetails, err := docker.NewImageRepoDetails(podcfg.JujudOCINamespace)
if err != nil {
return nil, errors.Trace(err)
}
imageRepoDetails = *repoDetails
}
reg, err := c.registryAPIFunc(imageRepoDetails)
if err != nil {
Expand Down
27 changes: 4 additions & 23 deletions cmd/juju/commands/upgradecontroller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
package commands

import (
"encoding/json"
"fmt"
"time"

"github.com/golang/mock/gomock"
"github.com/juju/cmd/v3"
Expand Down Expand Up @@ -286,30 +284,13 @@ func (s *UpgradeCAASControllerSuite) upgradeControllerCommand(
}

func (s *UpgradeCAASControllerSuite) TestUpgrade(c *gc.C) {
c.Assert(s.Model.Name(), gc.Equals, "controller")
err := s.ControllerStore.SetCurrentModel("kontroll", "")
c.Assert(err, jc.ErrorIsNil)

assertAndMocks := func(tagsInfo []tagInfo) {
s.PatchValue(&docker.HttpGet, func(url string, timeout time.Duration) ([]byte, error) {
c.Assert(url, gc.Equals, "https://registry.hub.docker.com/v1/repositories/jujusolutions/jujud-operator/tags")
c.Assert(timeout, gc.Equals, 30*time.Second)
return json.Marshal(tagsInfo)
})
}
s.assertUpgradeTests(c, upgradeCAASControllerTests, assertAndMocks, func() cmd.Command {
return s.upgradeControllerCommand(nil, nil)
})
}

func (s *UpgradeCAASControllerSuite) TestUpgradePrivateRegistry(c *gc.C) {
ctrl := gomock.NewController(c)
defer ctrl.Finish()

controllerCfg := s.ControllerConfig
controllerCfg[controller.CAASImageRepo] = `
{
"serveraddress": "quay.io",
"serveraddress": "ghcr.io",
"auth": "xxxxx==",
"repository": "test-account"
}`[1:]
Expand All @@ -318,7 +299,7 @@ func (s *UpgradeCAASControllerSuite) TestUpgradePrivateRegistry(c *gc.C) {
registryAPI := registrymocks.NewMockRegistry(ctrl)
registryAPIFunc := func(imageRepo docker.ImageRepoDetails) (registry.Registry, error) {
c.Assert(imageRepo.Repository, gc.DeepEquals, "test-account")
c.Assert(imageRepo.ServerAddress, gc.DeepEquals, "quay.io")
c.Assert(imageRepo.ServerAddress, gc.DeepEquals, "ghcr.io")
c.Assert(imageRepo.Auth, gc.DeepEquals, "xxxxx==")
c.Assert(imageRepo.IsPrivate(), jc.IsTrue)
registryAPIFuncCalled = true
Expand All @@ -330,7 +311,7 @@ func (s *UpgradeCAASControllerSuite) TestUpgradePrivateRegistry(c *gc.C) {
for _, t := range tagsInfo {
v, err := version.Parse(t.Tag)
c.Check(err, jc.ErrorIsNil)
tags = append(tags, docker.NewImageInfo(v))
tags = append(tags, registry.NewImageInfo(v))
}
gomock.InOrder(
controllerAPI.EXPECT().ControllerConfig().Return(controllerCfg, nil),
Expand All @@ -340,7 +321,7 @@ func (s *UpgradeCAASControllerSuite) TestUpgradePrivateRegistry(c *gc.C) {
)
}

s.assertUpgradeTests(c, upgradeCAASModelTests, assertAndMocks, func() cmd.Command {
s.assertUpgradeTests(c, upgradeCAASControllerTests, assertAndMocks, func() cmd.Command {
return s.upgradeControllerCommand(controllerAPI, registryAPIFunc)
})
c.Assert(registryAPIFuncCalled, jc.IsTrue)
Expand Down
62 changes: 46 additions & 16 deletions cmd/juju/commands/upgrademodel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,11 @@ import (
"archive/tar"
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"path"
"strings"
"time"

"github.com/golang/mock/gomock"
"github.com/juju/cmd/v3"
Expand Down Expand Up @@ -1279,17 +1277,49 @@ func (s *UpgradeCAASModelSuite) upgradeModelCommand(
return newUpgradeJujuCommandForTest(s.ControllerStore, nil, nil, nil, controllerAPI, registryAPINewer)
}

func (s *UpgradeCAASModelSuite) TestUpgrade(c *gc.C) {
func (s *UpgradeCAASModelSuite) TestUpgradePublicRegistry(c *gc.C) {
ctrl := gomock.NewController(c)
defer ctrl.Finish()

controllerCfg := s.ControllerConfig
controllerCfg[controller.CAASImageRepo] = `
{
"serveraddress": "ghcr.io",
"repository": "ghcr.io/test-account"
}`[1:]
registryAPINewerCalled := false
controllerAPI := mocks.NewMockControllerAPI(ctrl)
registryAPI := registrymocks.NewMockRegistry(ctrl)
registryAPINewer := func(imageRepo docker.ImageRepoDetails) (registry.Registry, error) {
c.Assert(imageRepo.Repository, gc.DeepEquals, "ghcr.io/test-account")
c.Assert(imageRepo.ServerAddress, gc.DeepEquals, "ghcr.io")
c.Assert(imageRepo.IsPrivate(), jc.IsFalse)
registryAPINewerCalled = true
return registryAPI, nil
}
modelCfg, err := s.Model.ModelConfig()
c.Check(err, jc.ErrorIsNil)

assertAndMocks := func(tagsInfo []tagInfo) {
s.PatchValue(&docker.HttpGet, func(url string, timeout time.Duration) ([]byte, error) {
c.Assert(url, gc.Equals, "https://registry.hub.docker.com/v1/repositories/jujusolutions/jujud-operator/tags")
c.Assert(timeout, gc.Equals, 30*time.Second)
return json.Marshal(tagsInfo)
})
var tags coretools.Versions
for _, t := range tagsInfo {
v, err := version.Parse(t.Tag)
c.Check(err, jc.ErrorIsNil)
tags = append(tags, registry.NewImageInfo(v))
}
gomock.InOrder(
controllerAPI.EXPECT().ModelConfig().Return(modelCfg.AllAttrs(), nil),
controllerAPI.EXPECT().ControllerConfig().Return(controllerCfg, nil),
registryAPI.EXPECT().Tags("jujud-operator").Return(tags, nil),
registryAPI.EXPECT().Close().Return(nil),
controllerAPI.EXPECT().Close().Return(nil),
)
}

s.assertUpgradeTests(c, upgradeCAASModelTests, assertAndMocks, func() cmd.Command {
return s.upgradeModelCommand(nil, nil)
return s.upgradeModelCommand(controllerAPI, registryAPINewer)
})
c.Assert(registryAPINewerCalled, jc.IsTrue)
}

func (s *UpgradeCAASModelSuite) TestUpgradePrivateRegistry(c *gc.C) {
Expand All @@ -1299,17 +1329,17 @@ func (s *UpgradeCAASModelSuite) TestUpgradePrivateRegistry(c *gc.C) {
controllerCfg := s.ControllerConfig
controllerCfg[controller.CAASImageRepo] = `
{
"serveraddress": "quay.io",
"auth": "xxxxx==",
"repository": "test-account"
"serveraddress": "ghcr.io",
"auth": "dXNlcm5hbWU6cHdkCg==",
"repository": "ghcr.io/test-account"
}`[1:]
registryAPINewerCalled := false
controllerAPI := mocks.NewMockControllerAPI(ctrl)
registryAPI := registrymocks.NewMockRegistry(ctrl)
registryAPINewer := func(imageRepo docker.ImageRepoDetails) (registry.Registry, error) {
c.Assert(imageRepo.Repository, gc.DeepEquals, "test-account")
c.Assert(imageRepo.ServerAddress, gc.DeepEquals, "quay.io")
c.Assert(imageRepo.Auth, gc.DeepEquals, "xxxxx==")
c.Assert(imageRepo.Repository, gc.DeepEquals, "ghcr.io/test-account")
c.Assert(imageRepo.ServerAddress, gc.DeepEquals, "ghcr.io")
c.Assert(imageRepo.Auth, gc.DeepEquals, "dXNlcm5hbWU6cHdkCg==")
c.Assert(imageRepo.IsPrivate(), jc.IsTrue)
registryAPINewerCalled = true
return registryAPI, nil
Expand All @@ -1322,7 +1352,7 @@ func (s *UpgradeCAASModelSuite) TestUpgradePrivateRegistry(c *gc.C) {
for _, t := range tagsInfo {
v, err := version.Parse(t.Tag)
c.Check(err, jc.ErrorIsNil)
tags = append(tags, docker.NewImageInfo(v))
tags = append(tags, registry.NewImageInfo(v))
}
gomock.InOrder(
controllerAPI.EXPECT().ModelConfig().Return(modelCfg.AllAttrs(), nil),
Expand Down
19 changes: 12 additions & 7 deletions controller/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
package controller_test

import (
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
stdtesting "testing"
Expand Down Expand Up @@ -610,9 +612,10 @@ func (s *ConfigSuite) TestCAASImageRepo(c *gc.C) {
gomock.InOrder(
mockRoundTripper.EXPECT().RoundTrip(gomock.Any()).DoAndReturn(
func(req *http.Request) (*http.Response, error) {
c.Assert(req.Header, jc.DeepEquals, http.Header{"Basic": []string{"xxxxx=="}})
token := base64.StdEncoding.EncodeToString([]byte("pwd"))
c.Assert(req.Header, jc.DeepEquals, http.Header{"Authorization": []string{"Bearer " + token}})
c.Assert(req.Method, gc.Equals, `GET`)
c.Assert(req.URL.String(), gc.Equals, `https://quay.io/v1`)
c.Assert(req.URL.String(), gc.Equals, `https://ghcr.io/v2/`)
resps := &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(nil),
Expand All @@ -635,12 +638,14 @@ func (s *ConfigSuite) TestCAASImageRepo(c *gc.C) {
{content: "juju-operator-repo", expected: ""},
{content: "registry.foo.com", expected: ""},
{content: "registry.foo.com/me", expected: ""},
{content: `
{
content: fmt.Sprintf(`
{
"serveraddress": "quay.io",
"auth": "xxxxx==",
"repository": "test-account"
}`[1:], expected: "test-account"},
"serveraddress": "ghcr.io",
"auth": "%s",
"repository": "ghcr.io/test-account"
}`, base64.StdEncoding.EncodeToString([]byte("username:pwd"))),
expected: "test-account"},
} {
if imageRepo.expected == "" {
imageRepo.expected = imageRepo.content
Expand Down
7 changes: 7 additions & 0 deletions docker/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,14 @@ import (
"github.com/docker/distribution/reference"
"github.com/juju/errors"
"github.com/juju/featureflag"
"github.com/juju/loggo"
"gopkg.in/yaml.v2"

"github.com/juju/juju/feature"
)

var logger = loggo.GetLogger("juju.docker")

// APIVersion is the API version type.
type APIVersion string

Expand Down Expand Up @@ -166,6 +169,9 @@ func (rid *ImageRepoDetails) init() error {
}
return nil
}
func (rid ImageRepoDetails) Empty() bool {
return rid == ImageRepoDetails{}
}

func (rid ImageRepoDetails) APIVersion() APIVersion {
if rid.IsPrivate() {
Expand Down Expand Up @@ -193,6 +199,7 @@ func NewImageRepoDetails(contentOrPath string) (o *ImageRepoDetails, err error)
data := []byte(contentOrPath)
isPath, err := fileExists(contentOrPath)
if err == nil && isPath {
logger.Debugf("reading image repository information from %q", contentOrPath)
data, err = ioutil.ReadFile(contentOrPath)
if err != nil {
return nil, errors.Trace(err)
Expand Down
100 changes: 0 additions & 100 deletions docker/docker.go

This file was deleted.

Loading

0 comments on commit 06a5476

Please sign in to comment.