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: 5 additions & 3 deletions cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -372,11 +372,13 @@ func (cmd *InitCmd) useCloudProvider() bool {
cloudProvider += ")"
cloudProviderSelected := ""

for _, ok := providerConfig[cloudProviderSelected]; ok == false && cloudProviderSelected != "no"; {
cloudProviderSelected = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
for ok := false; ok == false && cloudProviderSelected != "no"; {
cloudProviderSelected = strings.TrimSpace(*stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
Question: "Do you want to use a cloud provider? (no to skip) " + cloudProvider,
DefaultValue: cloud.DevSpaceCloudProviderName,
})
}))

_, ok = providerConfig[cloudProviderSelected]
}

if cloudProviderSelected != "no" {
Expand Down
21 changes: 13 additions & 8 deletions pkg/devspace/cloud/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,25 @@ type ProviderConfig map[string]*Provider
type Provider struct {
Name string `yaml:"name,omitempty"`
KubeContext string `yaml:"kubecontext,omitempty"`
Login string `yaml:"login,omitempty"`
GetConfig string `yaml:"getConfig,omitempty"`
Host string `yaml:"host,omitempty"`
Token string `yaml:"token,omitempty"`
}

// DevSpaceCloudProviderName is the name of the default devspace-cloud provider
const DevSpaceCloudProviderName = "devspace-cloud"

// LoginEndpoint is the cloud endpoint that will log you in
const LoginEndpoint = "/login"

// LoginSuccessEndpoint is the url redirected to after successful login
const LoginSuccessEndpoint = "/loginSuccess"

// GetClusterConfigEndpoint is the endpoint where to get the kubernetes context data
const GetClusterConfigEndpoint = "/clusterConfig"

// DevSpaceCloudProviderConfig holds the information for the devspace-cloud
var DevSpaceCloudProviderConfig = &Provider{
Login: "https://cloud.devspace.covexo.com/login",
GetConfig: "https://cloud.devspace.covexo.com/clusterConfig",
Host: "https://cloud.devspace.covexo.com",
KubeContext: DevSpaceKubeContextName,
}

Expand All @@ -58,8 +65,7 @@ func ParseCloudConfig() (ProviderConfig, error) {
}

if _, ok := cloudConfig[DevSpaceCloudProviderName]; ok {
cloudConfig[DevSpaceCloudProviderName].GetConfig = DevSpaceCloudProviderConfig.GetConfig
cloudConfig[DevSpaceCloudProviderName].Login = DevSpaceCloudProviderConfig.Login
cloudConfig[DevSpaceCloudProviderName].Host = DevSpaceCloudProviderConfig.Host
} else {
cloudConfig[DevSpaceCloudProviderName] = DevSpaceCloudProviderConfig
}
Expand All @@ -84,8 +90,7 @@ func SaveCloudConfig(config ProviderConfig) error {
provider.Name = ""

if name == DevSpaceCloudProviderName {
provider.Login = ""
provider.GetConfig = ""
provider.Host = ""
}
}

Expand Down
18 changes: 10 additions & 8 deletions pkg/devspace/cloud/login.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cloud

import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
Expand Down Expand Up @@ -28,7 +29,7 @@ func CheckAuth(provider *Provider) (string, *api.Cluster, *api.AuthInfo, error)
// GetClusterConfig retrieves the cluster and authconfig from the devspace cloud
func GetClusterConfig(provider *Provider) (string, *api.Cluster, *api.AuthInfo, error) {
client := &http.Client{}
req, err := http.NewRequest("GET", provider.GetConfig, nil)
req, err := http.NewRequest("GET", provider.Host+GetClusterConfigEndpoint, nil)
if err != nil {
return "", nil, nil, err
}
Expand Down Expand Up @@ -81,17 +82,18 @@ func GetClusterConfig(provider *Provider) (string, *api.Cluster, *api.AuthInfo,

// Login logs the user into the devspace cloud
func Login(provider *Provider) (string, *api.Cluster, *api.AuthInfo, error) {
ctx := context.Background()
tokenChannel := make(chan string)

log.StartWait("Logging into cloud " + provider.Login + " ...")
server := startServer(tokenChannel)
log.StartWait("Logging into cloud " + provider.Host + LoginEndpoint + " ...")
server := startServer(provider.Host+LoginSuccessEndpoint, tokenChannel)

open.Start(provider.Login)
open.Start(provider.Host + LoginEndpoint)

token := <-tokenChannel
close(tokenChannel)

err := server.Shutdown(nil)
err := server.Shutdown(ctx)
if err != nil {
return "", nil, nil, err
}
Expand Down Expand Up @@ -185,19 +187,19 @@ func UpdateKubeConfig(contextName string, cluster *api.Cluster, authInfo *api.Au
return kubeconfig.WriteKubeConfig(config, clientcmd.RecommendedHomeFile)
}

func startServer(tokenChannel chan string) *http.Server {
func startServer(redirectURI string, tokenChannel chan string) *http.Server {
srv := &http.Server{Addr: ":25853"}

http.HandleFunc("/token", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<script type=\"text/javascript\">window.close();</script>")

keys, ok := r.URL.Query()["token"]
if !ok || len(keys[0]) < 1 {
log.Fatal("Bad request")
}

log.StopWait()
tokenChannel <- keys[0]

http.Redirect(w, r, redirectURI, http.StatusSeeOther)
})

go func() {
Expand Down