package client import ( "errors" "fmt" "coopcloud.tech/abra/pkg/context" commandconnPkg "coopcloud.tech/abra/pkg/upstream/commandconn" dConfig "github.com/docker/cli/cli/config" "github.com/docker/cli/cli/context/docker" contextStore "github.com/docker/cli/cli/context/store" "github.com/sirupsen/logrus" ) type Context = contextStore.Metadata func CreateContext(contextName string, user string, port string) error { host := contextName if user != "" { host = fmt.Sprintf("%s@%s", user, host) } if port != "" { host = fmt.Sprintf("%s:%s", host, port) } host = fmt.Sprintf("ssh://%s", host) if err := createContext(contextName, host); err != nil { return err } logrus.Debugf("created the '%s' context", contextName) return nil } // createContext interacts with Docker Context to create a Docker context config func createContext(name string, host string) error { s := context.NewDefaultDockerContextStore() contextMetadata := contextStore.Metadata{ Endpoints: make(map[string]interface{}), Name: name, } contextTLSData := contextStore.ContextTLSData{ Endpoints: make(map[string]contextStore.EndpointTLSData), } dockerEP, dockerTLS, err := commandconnPkg.GetDockerEndpointMetadataAndTLS(host) if err != nil { return err } contextMetadata.Endpoints[docker.DockerEndpoint] = dockerEP if dockerTLS != nil { contextTLSData.Endpoints[docker.DockerEndpoint] = *dockerTLS } if err := s.CreateOrUpdate(contextMetadata); err != nil { return err } if err := s.ResetTLSMaterial(name, &contextTLSData); err != nil { return err } return nil } func DeleteContext(name string) error { if name == "default" { return errors.New("context 'default' cannot be removed") } if _, err := GetContext(name); err != nil { return err } // remove any context that might be loaded // TODO: Check if the context we are removing is the active one rather than doing it all the time cfg := dConfig.LoadDefaultConfigFile(nil) cfg.CurrentContext = "" if err := cfg.Save(); err != nil { return err } return context.NewDefaultDockerContextStore().Remove(name) } func GetContext(contextName string) (contextStore.Metadata, error) { ctx, err := context.NewDefaultDockerContextStore().GetMetadata(contextName) if err != nil { return contextStore.Metadata{}, err } return ctx, nil }