111 lines
3.2 KiB
Go
111 lines
3.2 KiB
Go
package context
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/docker/cli/cli/command"
|
|
dConfig "github.com/docker/cli/cli/config"
|
|
"github.com/docker/cli/cli/context"
|
|
contextStore "github.com/docker/cli/cli/context/store"
|
|
cliflags "github.com/docker/cli/cli/flags"
|
|
"github.com/moby/term"
|
|
)
|
|
|
|
func NewDefaultDockerContextStore() *command.ContextStoreWithDefault {
|
|
_, _, stderr := term.StdStreams()
|
|
dockerConfig := dConfig.LoadDefaultConfigFile(stderr)
|
|
contextDir := dConfig.ContextStoreDir()
|
|
storeConfig := command.DefaultContextStoreConfig()
|
|
store := newContextStore(contextDir, storeConfig)
|
|
|
|
opts := &cliflags.CommonOptions{Context: "default"}
|
|
|
|
dockerContextStore := &command.ContextStoreWithDefault{
|
|
Store: store,
|
|
Resolver: func() (*command.DefaultContext, error) {
|
|
return command.ResolveDefaultContext(opts, dockerConfig, storeConfig, stderr)
|
|
},
|
|
}
|
|
|
|
return dockerContextStore
|
|
}
|
|
|
|
func GetContextEndpoint(ctx contextStore.Metadata) (string, error) {
|
|
endpointmeta, ok := ctx.Endpoints["docker"].(context.EndpointMetaBase)
|
|
if !ok {
|
|
err := errors.New("context lacks Docker endpoint")
|
|
return "", err
|
|
}
|
|
return endpointmeta.Host, nil
|
|
}
|
|
|
|
func newContextStore(dir string, config contextStore.Config) contextStore.Store {
|
|
return contextStore.New(dir, config)
|
|
}
|
|
|
|
// missingContextMsg helps end-user debug missing docker context issues. This
|
|
// version of the message has no app domain name included. This is due to the
|
|
// code paths being unable to determine which app is requesting a server
|
|
// connection at certain points. It is preferred to use
|
|
// missingContextWithAppMsg where possible and only use missingContextMsg when
|
|
// the call path is located too deep in the SSH stack.
|
|
var missingContextMsg = `unable to find Docker context for %s?
|
|
|
|
Please run "abra server ls -p" to confirm. If you see "unknown" in the table
|
|
output then you need to run the following command:
|
|
|
|
abra server add %s <args>
|
|
|
|
See "abra server add --help" for more.
|
|
`
|
|
|
|
// missingContextWithAppMsg helps end-users debug missing docker context
|
|
// issues. The app name is included in this message for extra clarity. See
|
|
// missingContextMsg docs for alternative usage.
|
|
var missingContextWithAppMsg = `unable to find Docker context for %s?
|
|
|
|
%s (app) is deployed on %s (server).
|
|
|
|
Please run "abra server ls -p" to confirm. If you see "unknown" in the table
|
|
output then you need to run the following command:
|
|
|
|
abra server add %s <args>
|
|
|
|
See "abra server add --help" for more.
|
|
`
|
|
|
|
// HasDockerContext figures out if a local setup has a working docker context
|
|
// configuration or not. This usually tells us if they'll be able to make a SSH
|
|
// connection to a server or not and can be a useful way to signal to end-users
|
|
// that they need to fix something up if missing.
|
|
func HasDockerContext(appName, serverName string) error {
|
|
dockerContextStore := NewDefaultDockerContextStore()
|
|
contexts, err := dockerContextStore.Store.List()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, ctx := range contexts {
|
|
if ctx.Name == serverName {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
if appName != "" {
|
|
return fmt.Errorf(
|
|
missingContextWithAppMsg,
|
|
serverName,
|
|
appName,
|
|
serverName,
|
|
serverName,
|
|
)
|
|
}
|
|
|
|
return fmt.Errorf(
|
|
missingContextMsg,
|
|
serverName,
|
|
serverName,
|
|
)
|
|
}
|