Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get the actual k8s username for automatic role creation and CLI display #9

Merged
merged 2 commits into from
Nov 18, 2021
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion actor/v7action/actor.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package v7action
import (
"code.cloudfoundry.org/cli/api/uaa/constant"
"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
"code.cloudfoundry.org/cli/util/configv3"
"code.cloudfoundry.org/clock"
)

Expand All @@ -21,6 +22,7 @@ type Warnings []string
type AuthActor interface {
Authenticate(credentials map[string]string, origin string, grantType constant.GrantType) error
GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error)
GetCurrentUser() (configv3.User, error)
}

// Actor represents a V7 actor.
Expand All @@ -46,7 +48,7 @@ func NewActor(
) *Actor {
authActor := NewDefaultAuthActor(config, uaaClient)
if config != nil && config.IsCFOnK8s() {
authActor = NewKubernetesAuthActor(config, NewDefaultKubernetesConfigGetter())
authActor = NewKubernetesAuthActor(config, NewDefaultKubernetesConfigGetter(), client)
}

return &Actor{
Expand Down
6 changes: 5 additions & 1 deletion actor/v7action/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"code.cloudfoundry.org/cli/actor/actionerror"
"code.cloudfoundry.org/cli/api/uaa/constant"
"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
"code.cloudfoundry.org/cli/util/configv3"
)

type defaultAuthActor struct {
Expand Down Expand Up @@ -68,6 +69,10 @@ func (actor defaultAuthActor) GetLoginPrompts() (map[string]coreconfig.AuthPromp
return prompts, nil
}

func (actor defaultAuthActor) GetCurrentUser() (configv3.User, error) {
return actor.config.CurrentUser()
}

// TODO: error check this in future stories
func (actor Actor) RevokeAccessAndRefreshTokens() error {
accessToken := actor.Config.AccessToken()
Expand All @@ -87,7 +92,6 @@ func (actor Actor) isTokenRevocable(token string) bool {
}

jsonPayload, err := base64.RawURLEncoding.DecodeString(segments[1])

if err != nil {
return false
}
Expand Down
21 changes: 20 additions & 1 deletion actor/v7action/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
. "code.cloudfoundry.org/cli/actor/v7action"
"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
"code.cloudfoundry.org/cli/api/uaa/constant"
"code.cloudfoundry.org/cli/util/configv3"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
Expand Down Expand Up @@ -172,7 +173,6 @@ var _ = Describe("Default Auth Actions", func() {
})

When("the token is revokable", func() {

It("calls the UAA to revoke refresh and access tokens", func() {
Expect(fakeUAAClient.RevokeCallCount()).To(Equal(2))

Expand All @@ -193,4 +193,23 @@ var _ = Describe("Default Auth Actions", func() {
})
})

Describe("Get Current User", func() {
var (
user configv3.User
err error
)

JustBeforeEach(func() {
user, err = actor.GetCurrentUser()
})

BeforeEach(func() {
fakeConfig.CurrentUserReturns(configv3.User{Name: "jim"}, nil)
})

It("delegates to the injected config", func() {
Expect(err).NotTo(HaveOccurred())
Expect(user.Name).To(Equal("jim"))
})
})
})
1 change: 1 addition & 0 deletions actor/v7action/cloud_controller_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ type CloudControllerClient interface {
UploadBuildpack(buildpackGUID string, buildpackPath string, buildpack io.Reader, buildpackLength int64) (ccv3.JobURL, ccv3.Warnings, error)
UploadDropletBits(dropletGUID string, dropletPath string, droplet io.Reader, dropletLength int64) (ccv3.JobURL, ccv3.Warnings, error)
UploadPackage(pkg resources.Package, zipFilepath string) (resources.Package, ccv3.Warnings, error)
WhoAmI() (resources.K8sUser, ccv3.Warnings, error)

servicePlanVisibilityClient
}
Expand Down
1 change: 1 addition & 0 deletions actor/v7action/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
type Config interface {
AccessToken() string
APIVersion() string
CurrentUser() (configv3.User, error)
DialTimeout() time.Duration
PollingInterval() time.Duration
RefreshToken() string
Expand Down
23 changes: 22 additions & 1 deletion actor/v7action/k8s_auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ package v7action

import (
"errors"
"fmt"
"sort"

"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
"code.cloudfoundry.org/cli/api/uaa/constant"
"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
"code.cloudfoundry.org/cli/resources"
"code.cloudfoundry.org/cli/util/configv3"
"k8s.io/client-go/tools/clientcmd"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
)
Expand All @@ -16,6 +20,12 @@ type KubernetesConfigGetter interface {
Get() (*clientcmdapi.Config, error)
}

//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . WhoAmIer

type WhoAmIer interface {
WhoAmI() (resources.K8sUser, ccv3.Warnings, error)
}

type DefaultKubernetesConfigGetter struct{}

func NewDefaultKubernetesConfigGetter() DefaultKubernetesConfigGetter {
Expand All @@ -30,12 +40,14 @@ func (c DefaultKubernetesConfigGetter) Get() (*clientcmdapi.Config, error) {
type kubernetesAuthActor struct {
config Config
k8sConfigGetter KubernetesConfigGetter
whoAmIer WhoAmIer
}

func NewKubernetesAuthActor(config Config, k8sConfigGetter KubernetesConfigGetter) AuthActor {
func NewKubernetesAuthActor(config Config, k8sConfigGetter KubernetesConfigGetter, whoAmIer WhoAmIer) AuthActor {
return &kubernetesAuthActor{
config: config,
k8sConfigGetter: k8sConfigGetter,
whoAmIer: whoAmIer,
}
}

Expand Down Expand Up @@ -66,3 +78,12 @@ func (actor kubernetesAuthActor) GetLoginPrompts() (map[string]coreconfig.AuthPr
DisplayName: "Choose your Kubernetes authentication info",
}}, nil
}

func (actor kubernetesAuthActor) GetCurrentUser() (configv3.User, error) {
user, _, err := actor.whoAmIer.WhoAmI()
if err != nil {
return configv3.User{}, fmt.Errorf("calling /whoami endpoint failed: %w", err)
}

return configv3.User{Name: user.Name}, nil
}
36 changes: 35 additions & 1 deletion actor/v7action/k8s_auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
"code.cloudfoundry.org/cli/api/uaa/constant"
"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
"code.cloudfoundry.org/cli/resources"
"code.cloudfoundry.org/cli/util/configv3"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
Expand All @@ -16,6 +18,7 @@ var _ = Describe("KubernetesAuthActor", func() {
var (
k8sAuthActor v7action.AuthActor
k8sConfigGetter *v7actionfakes.FakeKubernetesConfigGetter
whoAmIer *v7actionfakes.FakeWhoAmIer
config *v7actionfakes.FakeConfig
err error
)
Expand All @@ -26,7 +29,8 @@ var _ = Describe("KubernetesAuthActor", func() {
k8sConfigGetter.GetReturns(&clientcmdapi.Config{
AuthInfos: map[string]*clientcmdapi.AuthInfo{"foo": {}, "bar": {}},
}, nil)
k8sAuthActor = v7action.NewKubernetesAuthActor(config, k8sConfigGetter)
whoAmIer = new(v7actionfakes.FakeWhoAmIer)
k8sAuthActor = v7action.NewKubernetesAuthActor(config, k8sConfigGetter, whoAmIer)
})

Describe("Authenticate", func() {
Expand Down Expand Up @@ -84,4 +88,34 @@ var _ = Describe("KubernetesAuthActor", func() {
})
})
})

Describe("Get Current User", func() {
var (
user configv3.User
err error
)

BeforeEach(func() {
whoAmIer.WhoAmIReturns(resources.K8sUser{Name: "bob", Kind: "User"}, nil, nil)
})

JustBeforeEach(func() {
user, err = k8sAuthActor.GetCurrentUser()
})

It("uses the WhoAmI function to get the real current user name", func() {
Expect(err).NotTo(HaveOccurred())
Expect(user.Name).To(Equal("bob"))
})

When("calling the whoami endpoint fails", func() {
BeforeEach(func() {
whoAmIer.WhoAmIReturns(resources.K8sUser{}, nil, errors.New("boom!"))
})

It("returns an error", func() {
Expect(err).To(MatchError(ContainSubstring("boom!")))
})
})
})
})
74 changes: 74 additions & 0 deletions actor/v7action/v7actionfakes/fake_cloud_controller_client.go

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

Loading