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
8 changes: 4 additions & 4 deletions internal/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ var (
OTELCollectorToken = ""

AuthPlatformAudience = "api://cd5aff56-575c-4e7e-b68e-3f67fa42eb31/user_impersonation"
AuthAuthority = "https://login.microsoftonline.com/intility.no"
AuthClientID = "b65cf9b0-290c-4b44-a4b1-0b02b7752b3c"
AuthAuthority = "https://login.microsoftonline.com/organizations"
AuthClientID = "27f5ab79-28cb-4824-b603-4b0795b8985e"
AuthRedirect = "http://localhost:42069"
)

Expand Down Expand Up @@ -121,15 +121,15 @@ func PlatformAPIHost() string {

func ClientID() string {
if IsDev {
return "b65cf9b0-290c-4b44-a4b1-0b02b7752b3c"
return "27f5ab79-28cb-4824-b603-4b0795b8985e"
}

return AuthClientID
}

func Authority() string {
if IsDev {
return "https://login.microsoftonline.com/intility.no"
return "https://login.microsoftonline.com/organizations"
}

return AuthAuthority
Expand Down
8 changes: 7 additions & 1 deletion pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type MeClient interface {

type TeamsClient interface {
ListTeams(ctx context.Context) ([]Team, error)
GetTeam(ctx context.Context, name string) (*Team, error)
GetTeamMembers(ctx context.Context, teamId string) ([]TeamMember, error)
CreateTeam(ctx context.Context, request NewTeamRequest) (*Team, error)
DeleteTeam(ctx context.Context, request DeleteTeamRequest) error
Expand All @@ -53,6 +54,7 @@ type MemberClient interface {

type UserClient interface {
ListUsers(ctx context.Context) ([]User, error)
GetUser(ctx context.Context, upn string) (*User, error)
}

type Client interface {
Expand Down Expand Up @@ -165,7 +167,7 @@ func (c *RestClient) CreateCluster(ctx context.Context, request NewClusterReques
}

func (c *RestClient) GetCluster(ctx context.Context, name string) (*Cluster, error) {
req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/clusters/"+name, nil)
req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/clusters/by-name/"+name, nil)
if err != nil {
return nil, err
}
Expand All @@ -175,6 +177,10 @@ func (c *RestClient) GetCluster(ctx context.Context, name string) (*Cluster, err
return nil, fmt.Errorf("request failed: %w", err)
}

if cluster.Name != name {
return nil, fmt.Errorf("cluster not found: %s", name)
}

return &cluster, nil
}

Expand Down
22 changes: 21 additions & 1 deletion pkg/client/teams.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ type Team struct {
Role []string `json:"roles"`
}

type TeamList []Team

type Subject struct {
Type string `json:"type"`
Name string `json:"name"`
Expand Down Expand Up @@ -78,7 +80,7 @@ type AddTeamMemberRequest struct {
}

func (c *RestClient) ListTeams(ctx context.Context) ([]Team, error) {
var teams []Team
var teams TeamList

req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/teams", nil)
if err != nil {
Expand All @@ -92,6 +94,24 @@ func (c *RestClient) ListTeams(ctx context.Context) ([]Team, error) {
return teams, nil
}

func (c *RestClient) GetTeam(ctx context.Context, name string) (*Team, error) {
req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/teams/by-name/"+name, nil)
if err != nil {
return nil, err
}

var team Team
if err = doRequest(c.httpClient, req, &team); err != nil {
return nil, fmt.Errorf("request failed: %w", err)
}

if team.Name != name {
return nil, fmt.Errorf("team not found: %s", name)
}

return &team, nil
}

func (c *RestClient) GetTeamMembers(ctx context.Context, teamId string) ([]TeamMember, error) {
var members []TeamMember

Expand Down
22 changes: 21 additions & 1 deletion pkg/client/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ type User struct {
Roles []string `json:"roles"`
}

type UserList []User

func (c *RestClient) ListUsers(ctx context.Context) ([]User, error) {
var users []User
var users UserList

req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/users", nil)
if err != nil {
Expand All @@ -26,3 +28,21 @@ func (c *RestClient) ListUsers(ctx context.Context) ([]User, error) {

return users, nil
}

func (c *RestClient) GetUser(ctx context.Context, upn string) (*User, error) {
req, err := c.createAuthenticatedRequest(ctx, "GET", c.baseURI+"/api/v1/users/by-upn/"+upn, nil)
if err != nil {
return nil, err
}

var user User
if err = doRequest(c.httpClient, req, &user); err != nil {
return nil, fmt.Errorf("request failed: %w", err)
}

if user.UPN != upn {
return nil, fmt.Errorf("user not found: %s", upn)
}

return &user, nil
}
41 changes: 10 additions & 31 deletions pkg/commands/cluster/access/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ package access

import (
"context"
"strings"

"github.com/intility/indev/internal/redact"
"github.com/intility/indev/pkg/client"
"github.com/intility/indev/pkg/clientset"
)

Expand All @@ -20,34 +18,23 @@ func resolveClusterID(ctx context.Context, set clientset.ClientSet, clusterName,
return "", redact.Errorf("cluster name or ID is required")
}

// List clusters to find the one by name
clusters, err := set.PlatformClient.ListClusters(ctx)
// Get cluster by name
cluster, err := set.PlatformClient.GetCluster(ctx, clusterName)
if err != nil {
return "", redact.Errorf("could not list clusters: %w", redact.Safe(err))
return "", redact.Errorf("could not get cluster: %w", redact.Safe(err))
}

// Find the cluster with the matching name
for _, c := range clusters {
if strings.EqualFold(c.Name, clusterName) {
return c.ID, nil
}
if cluster == nil {
return "", redact.Errorf("cluster not found: %s", clusterName)
}

return "", redact.Errorf("cluster not found: %s", clusterName)
return cluster.ID, nil
}

func getUserIDByUPN(ctx context.Context, set clientset.ClientSet, upn string) (string, error) {
users, err := set.PlatformClient.ListUsers(ctx)
user, err := set.PlatformClient.GetUser(ctx, upn)
if err != nil {
return "", redact.Errorf("could not list users: %w", redact.Safe(err))
}

var user *client.User
for _, u := range users {
if strings.EqualFold(u.UPN, upn) {
user = &u
break
}
return "", redact.Errorf("could not get user: %w", redact.Safe(err))
}

if user == nil {
Expand All @@ -58,17 +45,9 @@ func getUserIDByUPN(ctx context.Context, set clientset.ClientSet, upn string) (s
}

func getTeamIDByName(ctx context.Context, set clientset.ClientSet, teamName string) (string, error) {
teams, err := set.PlatformClient.ListTeams(ctx)
team, err := set.PlatformClient.GetTeam(ctx, teamName)
if err != nil {
return "", redact.Errorf("could not list teams: %w", redact.Safe(err))
}

var team *client.Team
for _, t := range teams {
if strings.EqualFold(t.Name, teamName) {
team = &t
break
}
return "", redact.Errorf("could not get team: %w", redact.Safe(err))
}

if team == nil {
Expand Down
8 changes: 7 additions & 1 deletion pkg/commands/cluster/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,10 +299,13 @@ func (m *mockClient) AddClusterMember(_ context.Context, _ string, _ []client.Ad
return nil
}
func (m *mockClient) RemoveClusterMember(_ context.Context, _, _ string) error { return nil }
func (m *mockClient) GetMe(_ context.Context) (client.Me, error) { return client.Me{}, nil }
func (m *mockClient) GetMe(_ context.Context) (client.Me, error) { return client.Me{}, nil }
func (m *mockClient) ListTeams(_ context.Context) ([]client.Team, error) {
return nil, nil
}
func (m *mockClient) GetTeam(_ context.Context, _ string) (*client.Team, error) {
return nil, nil
}
func (m *mockClient) GetTeamMembers(_ context.Context, _ string) ([]client.TeamMember, error) {
return nil, nil
}
Expand All @@ -315,6 +318,9 @@ func (m *mockClient) AddTeamMember(_ context.Context, _ string, _ []client.AddTe
}
func (m *mockClient) RemoveTeamMember(_ context.Context, _, _ string) error { return nil }
func (m *mockClient) ListUsers(_ context.Context) ([]client.User, error) { return nil, nil }
func (m *mockClient) GetUser(_ context.Context, _ string) (*client.User, error) {
return nil, nil
}

func TestSelectSSOProvisioner(t *testing.T) {
tests := []struct {
Expand Down
18 changes: 3 additions & 15 deletions pkg/commands/cluster/delete.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package cluster

import (
"strings"

"github.com/spf13/cobra"

"github.com/intility/indev/internal/redact"
"github.com/intility/indev/internal/telemetry"
"github.com/intility/indev/internal/ux"
"github.com/intility/indev/pkg/client"
"github.com/intility/indev/pkg/clientset"
)

Expand Down Expand Up @@ -37,19 +34,10 @@ func NewDeleteCommand(set clientset.ClientSet) *cobra.Command {
return errEmptyName
}

// List clusters to find the one by name
clusters, err := set.PlatformClient.ListClusters(ctx)
// Get cluster by name
cluster, err := set.PlatformClient.GetCluster(ctx, clusterName)
if err != nil {
return redact.Errorf("could not list clusters: %w", redact.Safe(err))
}

// Find the cluster with the matching name
var cluster *client.Cluster
for _, c := range clusters {
if strings.EqualFold(c.Name, clusterName) {
cluster = &c
break
}
return redact.Errorf("could not get cluster: %w", redact.Safe(err))
}

if cluster == nil {
Expand Down
15 changes: 3 additions & 12 deletions pkg/commands/cluster/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,19 +40,10 @@ func NewGetCommand(set clientset.ClientSet) *cobra.Command {
return errEmptyName
}

// List clusters to find the one by name
clusters, err := set.PlatformClient.ListClusters(ctx)
// Get cluster by name
cluster, err := set.PlatformClient.GetCluster(ctx, clusterName)
if err != nil {
return redact.Errorf("could not list clusters: %w", redact.Safe(err))
}

// Find the cluster with the matching name
var cluster *client.Cluster
for _, c := range clusters {
if strings.EqualFold(c.Name, clusterName) {
cluster = &c
break
}
return redact.Errorf("could not get cluster: %w", redact.Safe(err))
}

if cluster == nil {
Expand Down
19 changes: 4 additions & 15 deletions pkg/commands/cluster/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"os"
"os/exec"
"strings"

"github.com/spf13/cobra"

Expand Down Expand Up @@ -43,23 +42,13 @@ func NewLoginCommand(set clientset.ClientSet) *cobra.Command {
return errEmptyName
}

// List clusters to verify the cluster exists
clusters, err := set.PlatformClient.ListClusters(ctx)
// Get cluster by name
cluster, err := set.PlatformClient.GetCluster(ctx, clusterName)
if err != nil {
return redact.Errorf("could not list clusters: %w", redact.Safe(err))
return redact.Errorf("could not get cluster: %w", redact.Safe(err))
}

// Find the cluster with the matching name (case-insensitive)
var found bool
for _, c := range clusters {
if strings.EqualFold(c.Name, clusterName) {
clusterName = c.Name // Use the exact name from the API
found = true
break
}
}

if !found {
if cluster == nil {
return redact.Errorf("cluster not found: %s", clusterName)
}

Expand Down
26 changes: 7 additions & 19 deletions pkg/commands/cluster/open.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package cluster

import (
"strings"

"github.com/pkg/browser"
"github.com/spf13/cobra"

"github.com/intility/indev/internal/redact"
"github.com/intility/indev/internal/telemetry"
"github.com/intility/indev/internal/ux"
"github.com/intility/indev/pkg/client"
"github.com/intility/indev/pkg/clientset"
)

Expand All @@ -20,10 +17,10 @@ func NewOpenCommand(set clientset.ClientSet) *cobra.Command {
)

cmd := &cobra.Command{
Use: "open [name]",
Short: "Open the cluster console in a browser",
Long: `Open the OpenShift web console for the specified cluster in your default browser.`,
Args: cobra.MaximumNArgs(1),
Use: "open [name]",
Short: "Open the cluster console in a browser",
Long: `Open the OpenShift web console for the specified cluster in your default browser.`,
Args: cobra.MaximumNArgs(1),
PreRunE: set.EnsureSignedInPreHook,
RunE: func(cmd *cobra.Command, args []string) error {
ctx, span := telemetry.StartSpan(cmd.Context(), "cluster.open")
Expand All @@ -40,19 +37,10 @@ func NewOpenCommand(set clientset.ClientSet) *cobra.Command {
return errEmptyName
}

// List clusters to find the one by name
clusters, err := set.PlatformClient.ListClusters(ctx)
// Get cluster by name
cluster, err := set.PlatformClient.GetCluster(ctx, clusterName)
if err != nil {
return redact.Errorf("could not list clusters: %w", redact.Safe(err))
}

// Find the cluster with the matching name (case-insensitive)
var cluster *client.Cluster
for _, c := range clusters {
if strings.EqualFold(c.Name, clusterName) {
cluster = &c
break
}
return redact.Errorf("could not get cluster: %w", redact.Safe(err))
}

if cluster == nil {
Expand Down
Loading