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

Draft: OIDC Authentication, and Cloud CLI Contexts #1082

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft
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
14 changes: 8 additions & 6 deletions cmd/cloud/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package main

import (
"context"

"github.com/mattermost/mattermost-cloud/model"
"github.com/pkg/errors"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -33,7 +35,7 @@ func newCmdInstallationBackupCreate() *cobra.Command {
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true

client := createClient(flags.clusterFlags)
client := createClient(command.Context(), flags.clusterFlags)

backup, err := client.CreateInstallationBackup(flags.installationID)
if err != nil {
Expand All @@ -60,7 +62,7 @@ func newCmdInstallationBackupList() *cobra.Command {
Short: "List installation backups.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeInstallationBackupListCmd(flags)
return executeInstallationBackupListCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -72,8 +74,8 @@ func newCmdInstallationBackupList() *cobra.Command {
return cmd
}

func executeInstallationBackupListCmd(flags installationBackupListFlags) error {
client := createClient(flags.clusterFlags)
func executeInstallationBackupListCmd(ctx context.Context, flags installationBackupListFlags) error {
client := createClient(ctx, flags.clusterFlags)

paging := getPaging(flags.pagingFlags)

Expand Down Expand Up @@ -138,7 +140,7 @@ func newCmdInstallationBackupGet() *cobra.Command {
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true

client := createClient(flags.clusterFlags)
client := createClient(command.Context(), flags.clusterFlags)

backup, err := client.GetInstallationBackup(flags.backupID)
if err != nil {
Expand Down Expand Up @@ -166,7 +168,7 @@ func newCmdInstallationBackupDelete() *cobra.Command {
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true

client := createClient(flags.clusterFlags)
client := createClient(command.Context(), flags.clusterFlags)

if err := client.DeleteInstallationBackup(flags.backupID); err != nil {
return errors.Wrap(err, "failed to delete backup")
Expand Down
109 changes: 109 additions & 0 deletions cmd/cloud/clicontext/clicontext.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package clicontext

import (
"encoding/json"
"errors"
"os"
"path/filepath"

"github.com/mattermost/mattermost-cloud/internal/auth"
)

type ContextKeyServerURL struct{}

type CLIContext struct {
AuthData *auth.AuthorizationResponse `json:"auth_data"`
ClientID string `json:"client_id"`
OrgURL string `json:"org_url"`
ServerURL string `json:"server_url"`
Alias string `json:"alias"`
}

type Contexts struct {
CurrentContext string `json:"current_context"`
Contexts map[string]CLIContext `json:"contexts"`
}

func (c *Contexts) Current() *CLIContext {
context, ok := c.Contexts[c.CurrentContext]
if !ok {
return nil
}

return &context
}

func (c *Contexts) UpdateContext(contextName string, authData *auth.AuthorizationResponse, clientID, orgURL, alias, serverURL string) {
c.Contexts[contextName] = CLIContext{
AuthData: authData,
ClientID: clientID,
OrgURL: orgURL,
Alias: alias,
ServerURL: serverURL,
}

WriteContexts(c)
}

func bootstrapFirstContext() Contexts {
contexts := Contexts{
Contexts: make(map[string]CLIContext, 1),
}
contexts.CurrentContext = "local"
contexts.Contexts["local"] = CLIContext{
ServerURL: "http://localhost:8075",
Alias: "local",
}
return contexts

}

func ReadContexts() (*Contexts, error) {
homeDir, err := os.UserHomeDir()
if err != nil {
return nil, err
}

contextFilePath := filepath.Join(homeDir, ".cloud", "contexts.json")

var contextsData Contexts
if _, statErr := os.Stat(contextFilePath); errors.Is(statErr, os.ErrNotExist) {
contextsData = bootstrapFirstContext()
WriteContexts(&contextsData)
return &contextsData, nil
}

data, err := os.ReadFile(contextFilePath)
if err != nil {
return nil, err
}

err = json.Unmarshal(data, &contextsData)
if err != nil {
return nil, err
}

return &contextsData, nil
}

func WriteContexts(contexts *Contexts) error {
homeDir, err := os.UserHomeDir()
if err != nil {
return err
}

contextFilePath := filepath.Join(homeDir, ".cloud", "contexts.json")
file, err := os.Create(contextFilePath)
if err != nil {
return err
}
defer file.Close()

encoder := json.NewEncoder(file)
err = encoder.Encode(contexts)
if err != nil {
return err
}

return nil
}
57 changes: 29 additions & 28 deletions cmd/cloud/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package main

import (
"context"
"encoding/json"
"fmt"
"os"
Expand Down Expand Up @@ -83,7 +84,7 @@ func newCmdClusterCreate() *cobra.Command {
Short: "Create a cluster.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterCreateCmd(flags)
return executeClusterCreateCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -95,8 +96,8 @@ func newCmdClusterCreate() *cobra.Command {
return cmd
}

func executeClusterCreateCmd(flags clusterCreateFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterCreateCmd(ctx context.Context, flags clusterCreateFlags) error {
client := createClient(ctx, flags.clusterFlags)

if flags.cluster != "" {
err := client.RetryCreateCluster(flags.cluster)
Expand Down Expand Up @@ -210,7 +211,7 @@ func newCmdClusterImport() *cobra.Command {
Short: "Import an exisiting cluster that is managed externally.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterImportCmd(flags)
return executeClusterImportCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -221,8 +222,8 @@ func newCmdClusterImport() *cobra.Command {
return cmd
}

func executeClusterImportCmd(flags clusterImportFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterImportCmd(ctx context.Context, flags clusterImportFlags) error {
client := createClient(ctx, flags.clusterFlags)

request := &model.ImportClusterRequest{
ExternalClusterSecretName: flags.secretName,
Expand Down Expand Up @@ -255,7 +256,7 @@ func newCmdClusterProvision() *cobra.Command {
Short: "Provision/Re-provision a cluster's k8s resources.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterProvisionCmd(flags)
return executeClusterProvisionCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -267,8 +268,8 @@ func newCmdClusterProvision() *cobra.Command {
return cmd
}

func executeClusterProvisionCmd(flags clusterProvisionFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterProvisionCmd(ctx context.Context, flags clusterProvisionFlags) error {
client := createClient(ctx, flags.clusterFlags)

request := &model.ProvisionClusterRequest{
Force: flags.reprovisionAllUtilities,
Expand Down Expand Up @@ -302,7 +303,7 @@ func newCmdClusterUpdate() *cobra.Command {
Short: "Updates a cluster's configuration.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterUpdateCmd(flags)
return executeClusterUpdateCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -314,8 +315,8 @@ func newCmdClusterUpdate() *cobra.Command {
return cmd
}

func executeClusterUpdateCmd(flags clusterUpdateFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterUpdateCmd(ctx context.Context, flags clusterUpdateFlags) error {
client := createClient(ctx, flags.clusterFlags)

request := flags.GetPatchClusterRequest()

Expand Down Expand Up @@ -344,7 +345,7 @@ func newCmdClusterUpgrade() *cobra.Command {
Short: "Upgrade k8s on a cluster.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterUpgradeCmd(flags)
return executeClusterUpgradeCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -356,8 +357,8 @@ func newCmdClusterUpgrade() *cobra.Command {
return cmd
}

func executeClusterUpgradeCmd(flags clusterUpgradeFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterUpgradeCmd(ctx context.Context, flags clusterUpgradeFlags) error {
client := createClient(ctx, flags.clusterFlags)

rotatorConfig := getRotatorConfigFromFlags(flags.rotatorConfig)

Expand Down Expand Up @@ -403,7 +404,7 @@ func newCmdClusterResize() *cobra.Command {
Short: "Resize a k8s cluster",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterResizeCmd(flags)
return executeClusterResizeCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -414,8 +415,8 @@ func newCmdClusterResize() *cobra.Command {
return cmd
}

func executeClusterResizeCmd(flags clusterResizeFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterResizeCmd(ctx context.Context, flags clusterResizeFlags) error {
client := createClient(ctx, flags.clusterFlags)

rotatorConfig := getRotatorConfigFromFlags(flags.rotatorConfig)

Expand Down Expand Up @@ -471,7 +472,7 @@ func newCmdClusterDelete() *cobra.Command {
Short: "Delete a cluster.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterDeleteCmd(flags)
return executeClusterDeleteCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -482,8 +483,8 @@ func newCmdClusterDelete() *cobra.Command {
return cmd
}

func executeClusterDeleteCmd(flags clusterDeleteFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterDeleteCmd(ctx context.Context, flags clusterDeleteFlags) error {
client := createClient(ctx, flags.clusterFlags)

err := client.DeleteCluster(flags.cluster)
if err != nil {
Expand All @@ -501,7 +502,7 @@ func newCmdClusterGet() *cobra.Command {
Short: "Get a particular cluster.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterGetCmd(flags)
return executeClusterGetCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -512,8 +513,8 @@ func newCmdClusterGet() *cobra.Command {
return cmd
}

func executeClusterGetCmd(flags clusterGetFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterGetCmd(ctx context.Context, flags clusterGetFlags) error {
client := createClient(ctx, flags.clusterFlags)

cluster, err := client.GetCluster(flags.cluster)
if err != nil {
Expand All @@ -537,7 +538,7 @@ func newCmdClusterList() *cobra.Command {
Short: "List created clusters.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
return executeClusterListCmd(flags)
return executeClusterListCmd(command.Context(), flags)
},
PreRun: func(cmd *cobra.Command, args []string) {
flags.clusterFlags.addFlags(cmd)
Expand All @@ -548,8 +549,8 @@ func newCmdClusterList() *cobra.Command {
return cmd
}

func executeClusterListCmd(flags clusterListFlags) error {
client := createClient(flags.clusterFlags)
func executeClusterListCmd(ctx context.Context, flags clusterListFlags) error {
client := createClient(ctx, flags.clusterFlags)

paging := getPaging(flags.pagingFlags)

Expand Down Expand Up @@ -664,7 +665,7 @@ func newCmdClusterUtilities() *cobra.Command {
Short: "Show metadata regarding utility services running in a cluster.",
RunE: func(command *cobra.Command, args []string) error {
command.SilenceUsage = true
client := createClient(flags.clusterFlags)
client := createClient(command.Context(), flags.clusterFlags)

metadata, err := client.GetClusterUtilities(flags.cluster)
if err != nil {
Expand Down
Loading
Loading